目录
一、远程连接服务器简介
二、加密技术简介
SSH工作过程:
(1)版本协商阶段
(2)密钥和算法协商阶段
(3)认证阶段
(4)会话请求阶段
(5)交互会话阶段
三、SSH服务配置
四、用户登录ssh服务器
实验1:修改ssh服务的端口号
实验2:拒绝root用户远程登陆
实验3:允许特定用户ssh登陆,其他用户都无法登陆
实验4:linux客户端通过秘钥登录linux服务端root用户
一、远程连接服务器简介
二、加密技术简介
以下是对称密钥和非对称密钥的工作过程示例:
对称密钥加密:
- 发送方和接收方共享相同的密钥(K)。
- 发送方使用密钥 K 对消息 M 进行加密,得到密文 C。
- 发送方将密文 C 发送给接收方。
- 接收方使用相同的密钥 K 对密文 C 进行解密,得到原始消息 M。
非对称密钥加密:
- 发送方生成一对密钥:公钥 P 和私钥 S。
- 发送方将公钥 P 发送给接收方。
- 接收方使用公钥 P 对消息 M 进行加密,得到密文 C。
- 接收方将密文 C 发送给发送方。
- 发送方使用私钥 S 对密文 C 进行解密,得到原始消息 M。
SSH工作过程:
在整个通讯过程中,为实现SSH的安全连接,服务端与客户端要经历如下五个阶段:
详细过程如下:
(1)版本协商阶段
[1] 服务器端打开端口22,等待客户端连接: 服务器端启动后,会打开TCP端口22(默认的SSH端口),并开始监听这个端口,等待来自客户端的连接请求。这是SSH服务的基础步骤,确保任何客户端都可以连接到服务器。
[2] 客户端向服务端发起TCP初始连接请求: 当客户端希望连接到服务器时,它会通过TCP协议向服务器的端口22发送一个初始连接请求。一旦TCP连接建立成功,服务器就会向客户端发送一个包含版本信息的报文。这个报文的格式为“SSH-<主协议版本号>.<次协议版本号>.<软件版本号>”,其中主协议版本号和次协议版本号共同组成协议版本号,而软件版本号主要用于调试目的。
[3] 客户端解析服务器的报文: 客户端接收到服务器发送的版本信息报文后,会解析该数据包。如果发现服务器的协议版本号低于自己的版本号,但客户端可以支持这种较低版本的协议,那么客户端将使用服务器端的低版本协议号。否则,客户端将使用自己的协议版本号。
[4] 客户端回应服务器: 在决定使用的协议版本号后,客户端会向服务器发送一个回应报文,包含其选择的协议版本号。服务器接收到这个报文后,会比较客户端发来的版本号,以确定是否可以与客户端一起工作。如果协议版本号协商成功,则双方进入密钥和算法协商阶段;否则,服务器将断开TCP连接。
需要注意的是,上述所有报文都是通过明文方式传输的,这意味着这些信息在网络中是未加密的,可能会受到中间人攻击等安全威胁。因此,在实际的SSH通信中,一旦协议版本号协商完成,后续的密钥和算法协商将会采用加密的方式进行,以确保通信的安全性。
(2)密钥和算法协商阶段
[1] 服务器端和客户端在建立连接时,会交换包含各自支持的算法列表的报文。这些算法列表包括公钥算法、加密算法、消息验证码(MAC)算法和压缩算法等。
[2] 服务器端和客户端根据对方和自己支持的算法列表,协商确定最终使用的算法。
[3] 通过Diffie-Hellman Exchange(DH交换)算法和主机密钥对等参数,服务器端和客户端生成相同的会话密钥和会话ID。
会话密钥的生成过程:
[1] 客户端请求连接:客户端使用适当的客户端程序请求连接服务器。
[2] 服务器发送密钥:服务器将服务器的公钥发送给客户端。
[3] 密钥生成过程:服务器每次启动sshd服务时,该服务会主动去/etc/ssh/ssh_host*文件找公钥文件。若系统刚装完,没有这些公钥文件,sshd会计算出所需的公钥文件和服务器的私钥文件。
[4] 服务器生成会话ID:服务器生成会话ID,并将其发送给客户端。
[5 客户端记录公钥数据 :若客户端第一次连接到此服务器,则会将服务器的公钥数据记录到客户端的用户主目录内的~/.ssh/known_hosts。若是已经记录过该服务器的公钥数据,则客户端会去比对此次接收到的与之前的记录是否有差异。
[6] 客户端生成会话密钥:客户端生成会话密钥,并用服务器的公钥加密后,发送给服务器。
[7]服务器解密获得会话密钥:服务器用自己的私钥将收到的数据解密,获得会话密钥。
[8] 加密传输开始:服务器和客户端都知道了会话密钥后,以后的传输都将被会话密钥加密。
(3)认证阶段
(4)会话请求阶段
(5)交互会话阶段
会话建立后,SSH服务器端和客户端在该会话上进行数据信息的交互,该阶段,用户在客户端可以通过粘贴文本内容的方式执行命令,但文本会话不能超过2000字节,且粘贴的命令最好是同一视图下的命令,否则服务器可能无法正确执行该命令。如果粘贴的文本会话超过2000字节,可以采用将配置文件通过SFTP方式上传到服务器,利用新的配置文件重新启动的方式执行这些命令
三、SSH服务配置
#ssh服务安装包openssh-server#编辑SSH服务器的配置信息
[root@server ~]# vim /etc/ssh/sshd_config以下常用的一些配置信息:
#Port 22 #监听端口,默认监听22端口 【默认可修改】
#AddressFamily any #IPV4和IPV6协议家族用哪个,any表示二者均有
#ListenAddress 0.0.0.0 #指明监控的地址,0.0.0.0表示本机的所有地址 【默认可修改】
#ListenAddress :: #指明监听的IPV6的所有地址格式
#HostKey /etc/ssh/ssh_host_rsa_key # rsa私钥认证 【默认】
#HostKey /etc/ssh/ssh_host_dsa_key # dsa私钥认证
#HostKey /etc/ssh/ssh_host_ecdsa_key # ecdsa私钥认证
#HostKey /etc/ssh/ssh_host_ed25519_key # ed25519私钥认证
#SyslogFacility AUTHPRIV #当有人使用ssh登录系统的时候,SSH会记录信息,信息保存
在/var/log/secure里面
#LoginGraceTime 2m #登录的宽限时间,默认2分钟没有输入密码,则自动断开连接
#PermitRootLogin yes #是否允许管理员远程登录,'yes'表示允许
#MaxAuthTries 6 #最大认证尝试次数,最多可以尝试6次输入密码。之后需要等待某段时间后才
能再次输入密码
#MaxSessions 10 #允许的最大会话数
#AuthorizedKeysFile .ssh/authorized_keys #选择基于密钥验证时,客户端生成一对公私
钥之后,会将公钥放到.ssh/authorizd_keys里面
#PasswordAuthentication yes #是否允许支持基于口令的认证
#ChallengeResponseAuthentication no #是否允许使用键盘输入身份验证,也就是xshell
的第三个登录方式
#UseDNS yes #是否反解DNS,如果想让客户端连接服务器端快一些,这个可以改为no
#Subsystem sftp /usr/libexec/openssh/sftp-server #支持 SFTP ,如果注释掉,则
不支持sftp连接
#AllowUsers user1 user2 #登录白名单(默认没有这个配置,需要自己手动添加),允许远程
登录的用户。如果名单中没有的用户,则提示拒绝登录
四、用户登录ssh服务器
【在实验之前我们可以拍摄一个快照,避免试验后有些配置文件没有修改过来】
实验1:修改ssh服务的端口号
#编辑SSH服务配置文件:
[root@server ~]# vim /etc/ssh/sshd_config#查看我们修改的ssh服务的端口号:
[root@server ~]# grep port /etc/ssh/sshd_config
port 666#关闭防火墙并且立即生效:
[root@server ~]# systemctl disable --now firewalld#检查firewalld的服务状态(可以看到已经是关闭状态)
[root@server ~]# systemctl status firewalld
○ firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: enable>Active: inactive (dead)Docs: man:firewalld(1)#将 SELinux(Security-Enhanced Linux)的运行模式设置为 Permissive:
[root@server ~]# setenforce 0#查看当前 SELinux 的运行模式:
[root@server ~]# getenforce
Permissive#重启ssh进程:
[root@server ~]# systemctl restart sshd
测试一下:
测试成功!!!
实验2:拒绝root用户远程登陆
#说明:注意rhel9中的/etc/ssh/sshd_config和/etc/ssh/sshd_config.d/*.conf中的
配置,因为我们安装rhel9时设置密码时默认是开启root远程登录的,即使SSH服务配置文件中是默认不允许root远程登录的,但是我们依旧可以远程登录。我们允许root远程登录的配置是在/etc/ssh/sshd_config或/etc/ssh/sshd_config.d/*.conf[root@server ~]# ll /etc/ssh/sshd_config
-rw-------. 1 root root 3676 Oct 19 18:55 /etc/ssh/sshd_config
[root@server ~]# ll /etc/ssh/sshd_config.d
total 8
-rw-r--r--. 1 root root 141 Oct 15 23:34 01-permitrootlogin.conf
-rw-------. 1 root root 719 Jul 20 2023 50-redhat.conf#我的关于root用户可以远程登录的配置文件在/etc/ssh/sshd_config.d/01-permitrootlogin.conf中,并修改其参数为no:
[root@server ~]# vim /etc/ssh/sshd_config.d/01-permitrootlogin.conf
[root@server ~]# grep -i permitrootlogin /etc/ssh/sshd_config.d/01-permitrootlogin.conf
PermitRootLogin no#重启ssh进程:
[root@server ~]# systemctl restart sshd
测试一下:
测试成功!!!
实验3:允许特定用户ssh登陆,其他用户都无法登陆
#我的关于root用户可以远程登录的配置文件在/etc/ssh/sshd_config.d/01-permitrootlogin.conf中,并修改其参数恢复为为yes,不影响下面的实验操作:
[root@server ~]# vim /etc/ssh/sshd_config.d/01-permitrootlogin.conf
[root@server ~]# grep -i permitrootlogin /etc/ssh/sshd_config.d/01-permitrootlogin.conf
PermitRootLogin yes#添加一个用户并设置密码:
[root@server ~]# useradd gxc
[root@server ~]# passwd gxc#编辑SSH服务配置文件,在文件的末尾添加允许特定用户ssh登录的特定命令:
[root@server ~]# vim /etc/ssh/sshd_config
[root@server ~]# grep -i allowusers /etc/ssh/sshd_config
AllowUsers gxc#重启ssh进程:
[root@server ~]# systemctl restart sshd
测试一下:
测试成功!!!
实验4:linux客户端通过秘钥登录linux服务端root用户
#在做此实验之前要将之前修改ssh服务的端口号、拒绝root用户远程登陆、允许特定用户ssh登陆,其他用户都无法登陆的配置都恢复如初,直接转到之前的快照或者自行修改#创建密钥对:
[root@server ~]# ssh-keygen -t rsa
ssh-keygen 生成、管理和转换认证密钥 -t制定类型 RSA
/root/.ssh/id_rsa私钥文件
/root/.ssh/id_rsa.pub公钥文件#复制该公钥文件到服务端的该目录下:
[root@server ~]# ssh-copy-id root@192.168.88.5#在本地服务器上登陆对端服务器:
[root@server ~]# ssh root@192.168.8.5
测试一下:
测试成功!!!