ssh 是 Secure Shell 的缩写,是一个建立在应用层上的安全远程管理协议。ssh 是目前较为可靠的传输协议,专为远程登录会话和其他网络服务提供安全性。利用 ssh 协议可以有效放置远程登录过程中的信息泄露问题。
ssh 可用于大多数 UNIX 和类 UNIX 操作系统中,能够实现字符界面的远程登录管理,它默认使用 22 端口,采用密文的形式在网络中传输数据,相对于通过铭文传输的 Telnet 协议,具有更高的安全性。
ssh 提供了基于账户密码(口令)和密钥对两种登录验证方式,这两者都是通过密文传输数据的。
账户密码登录认证过程中传输的是用户的账户名和密码,密码具有足够的复杂性才能具有更高的安全性。
Linux 主机之间的远程管理工具是 ssh 命令,所以我们直接使用 ssh 进行远程登录
格式: ssh 用户名@IP地址 ssh root@192.168.117.100 ssh -p 端口(默认22) 用户名@IP地址 ssh -p 22 root@192.168.117.1001、首先需要在 Client 上创建一对密钥,并且需要把公钥放在需要访问的 Server 上
2、当 Client 需要连接 Server 时,Client 端的软件就会向 Server 端发出登录请求,请求使用密钥对中的公钥进行安全验证
3、Server 收到请求后,会在该用户的家目录下查询公钥文件,拿 Client 发送过来的公钥和自己家目录下的公钥进行比较
4、如果两个公钥一致,Server 就用公钥加密 challenge,并把它发送给 Client 软件,Client 收到加密内容之后,使用本地的私钥进行解密,再把解密结果发送给 Server 端,Server 端验证成功后,允许登录。
准备好两台 Linux 操作系统的主机,配置好相关网络参数,实现可以正常通信。
主机名IP系统版本test~1 (客户端)192.168.117.130CentOS7.6test~2 (服务端)192.168.117.131CentOS7.6 #临时关闭防火墙: #清空防火墙规则 [root@test1 ~]# iptables -F #临时关闭 selinux [root@test1 ~]# setenforce 0 #永久关闭防护功能(以下命令主机重启后生效) #防火墙开机不自启 [root@test1 ~]# chkconfig iptables off #永久关闭 selinux [root@test1 ~]# sed -i 7s/enforcing/disabled/g /etc/selinux/configLinux 主机之间的远程管理工具是 ssh 命令,所以我们直接在 test~1 主机上使用 ssh 远程登录 主机test~2
#登录成功 [root@test1 ~]# ssh root@192.168.117.131 The authenticity of host '192.168.117.131 (192.168.117.131)' can't be established. ECDSA key fingerprint is SHA256:FSnhedHgvDzRZqf8jTh7IA0np36nwpFhmuA6/hfOkyM. ECDSA key fingerprint is MD5:ca:22:75:78:99:9c:dd:02:aa:8e:5d:fb:ef:20:04:de. Are you sure you want to continue connecting (yes/no)? yes #根据提示输入:yes Warning: Permanently added '192.168.117.131' (ECDSA) to the list of known hosts. root@192.168.117.131's password: #服务端root密码:123 Last login: Wed Oct 7 23:40:56 2020 from 192.168.117.130 [root@test2 ~]#Linux 主机之间的密钥对登录验证
生产环境下将服务端账户密码登录功能关闭
#关闭服务端密码登录功能 [root@test2 .ssh]# vim /etc/ssh/sshd_config PasswordAuthentication yes # yes 改为 no #重启 sshd 服务 [root@test2 ~]# systemctl restart sshd #客户端尝试使用密码远程登录服务端失败 [root@test1 ~]# ssh root@192.168.117.131 Permission denied (publickey,gssapi-keyex,gssapi-with-mic).一般在远程登录管理上我们会禁止直接使用 root 用户登录
#禁止 root 用户远程登录 [root@test2 ~]# vim /etc/ssh/sshd_config #PermitRootLogin yes #取消注释,并将 yes 改为 no #重启 sshd 服务 [root@test2 ~]# systemctl restart sshd ##客户端尝试,使用root用户远程登录服务端失败 [root@test1 ~]# ssh root@192.168.117.131 root@192.168.117.131's password: #服务端root密码:123 Permission denied, please try again. root@192.168.117.131's password: Permission denied, please try again. root@192.168.117.131's password: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).ssh作为一个用来远程管理服务器的工具,需要特别的安全,默认情况下使用 TCP 的 22 端口,若不进行修改,很容易被利用遭到攻击,所以我们一般都会修改端口,尽量修改一个高位端口
修改服务端 ssh 服务端口 [root@test2 ~]# vim /etc/ssh/sshd_config #Port 22 #取消注释,将默认 22 端口修改为 2323 #重启 ssh 服务 #注:selinux 如果没有关闭,重启 sshd 会报错 [root@test2 ~]# systemctl restart sshd #客户端尝试使用 2323端口 远程登录服务端 #注:selinux 如果没有关闭,远程登录会报错 [root@test1 ~]# ssh -p 2323 root@192.168.117.131 root@192.168.117.131's password: Last login: Thu Oct 8 00:16:15 2020 from 192.168.117.130 [root@test2 ~]#有些服务器安全级别更高一些,不允许使用外网直接登录,只有通过局域网才能登录,我们可以设置其中一台能够被外网远程连接,其他的主机都通过这个机器进行远程连接即可
#添加监听IP [root@test2 ~]# vim /etc/ssh/sshd_config #ListenAddress 0.0.0.0 #取消注释,将 0.0.0.0 替换为 192.168.117.131,这样只允许远程机器通过ssh连接本机的192.168.117.131来进行登陆 #客户端登录成功 [root@test1 ~]# ssh root@192.168.117.131 root@192.168.117.131's password: Last login: Thu Oct 8 13:44:52 2020 from 192.168.117.130 [root@test2 ~]#