中间人攻击有很多方式,比如常见的ARP或者DNS欺骗,在SSH连接时也有可能碰到类似的情况,所以ssh在know_hosts的管理中加入了对于已知服务器的信任列表的管理,多多少少可以确认一些可能的风险。
中间人攻击原理很简单,中间人介于客户端和服务器之前充当代理的角色,客户端和服务器之间的所有信息对于中间人来说都是可见的,中间人可以在信息的传递过程中查看内容或对内容进行修改,比如可以如下图所示,在证书的请求和传递的过程中丢弃客户所请求的证书,而使用自己提供的证书。
在SSH中也用到了证书,可以使用ECDSA或者RSA方式结合摘要技术生成表示服务器身份的密钥指纹。而一旦当此指纹发生变化时,ssh则会提示有可能有实际的风险,可能会提示如下信息:
[root@host121 .ssh]# ssh 192.168.163.121 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is SHA256:y9ir2Jbc7kNZPhP9h/O9juUZbTmGDo6NZi2IZnLwg0s. Please contact your system administrator. Add correct host key in /root/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /root/.ssh/known_hosts:2 ECDSA host key for 192.168.163.121 has changed and you have requested strict checking. Host key verification failed. [root@host121 .ssh]#
注意提示信息的主要内容:
- REMOTE HOST IDENTIFICATION HAS CHANGED: 远程连接的身份发生了变化,因为中间人攻击的方式最重要的一个特点就是服务器侧和客户端没有意识到这个中间人角色的存在,所以进行提示是很重要的,这里提示你之前连接的这台主机已经发生变化了。
- IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!: 大写一般可表示警告,告诉使用者可能有人在做很讨厌的事情,比如MITM。
- Someone could be eavesdropping on you right now (man-in-the-middle attack)!:提示可能有人在监控你
只要事前存在的know_hosts中保存的连接对象机器的密钥指纹一旦发生变化,ssh的时候就会提示上述信息,但是在实际情况中,很多时候此密钥指纹都会发生变化,比如:
- 重新安装了操作系统
- 重新安装了openssh或者手动更新了/etc/ssh下的密钥对
- …
相较于这些更为常见的场景,ssh的警告会宁可误报,不可漏报,只要跟之前留在know_hosts中的密钥指纹不同,就会报错,比如可以使用如下步骤再现:
- 事前确认两台机器的密钥指纹
[root@host121 .ssh]# ssh-keyscan -t ECDSA 192.168.163.121 # 192.168.163.121:22 SSH-2.0-OpenSSH_7.4 192.168.163.121 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEy3w5004yyzNA8dXo1vo67E63tZybV88SiDupDfnHzHCeZ4tHjNqdabc9Fa+Jwwe5uIjcUFb+Ag4HaBjK4982U= [root@host121 .ssh]# ssh-keyscan -t ECDSA 192.168.163.122 # 192.168.163.122:22 SSH-2.0-OpenSSH_7.4 192.168.163.122 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGylOHayVgNd3bV3NViPZ4CrAP/j9baVWGGloJUfrxwvt4+JdmkJVuUW5/aVP8U6Vg2HLFNsCVqszxOTkFpB4bo= [root@host121 .ssh]#
- 修改know_hosts 之前设定的是连接192.168.163.121这台机器,设定信息如下所示
192.168.163.121 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEy3w5004yyzNA8dXo1vo67E63tZybV88SiDupDfnHzHCeZ4tHjNqdabc9Fa+Jwwe5uIjcUFb+Ag4HaBjK4982U=
这里偷偷将后面的密钥指纹改成192.168.163.122,know_hosts的信息如下所示:
[root@host121 .ssh]# cat known_hosts #192.168.163.121 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEy3w5004yyzNA8dXo1vo67E63tZybV88SiDupDfnHzHCeZ4tHjNqdabc9Fa+Jwwe5uIjcUFb+Ag4HaBjK4982U= 192.168.163.121 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGylOHayVgNd3bV3NViPZ4CrAP/j9baVWGGloJUfrxwvt4+JdmkJVuUW5/aVP8U6Vg2HLFNsCVqszxOTkFpB4bo= [root@host121 .ssh]#
这样ssh 192.168.163.121时就会提示上述警告信息了。
避免方法 方法1: 更新操作系统或其他操作之前事前备份指纹信息事前备份密钥指纹信息,重新安装之后恢复,避免出现这种意外操作因为的问题。
方法2: 及时更新客户端连接的设定信息一旦发生变化,及时更新客户端连接设定文件know_hosts
方法3: 连接时设定StrictHostKeyChecking通过-o参数设定StrictHostKeyChecking参数为no,从而忽略此问题,但会提示警告信息。连接示例信息如下所示:
[root@host121 .ssh]# ssh -o StrictHostKeyChecking=no 192.168.163.121 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is SHA256:y9ir2Jbc7kNZPhP9h/O9juUZbTmGDo6NZi2IZnLwg0s. Please contact your system administrator. Add correct host key in /root/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /root/.ssh/known_hosts:2 Password authentication is disabled to avoid man-in-the-middle attacks. Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks. Last login: Sat Dec 7 19:54:27 2019 from host121 [root@host121 ~]#总结
实际上这个提示的功能防范即为有限,很多还是在流程上的规范来确保系统的安全,比如最初的know_hosts加入了中间人的指纹信息,ssh是无法辨别的,还是通过用户的确认结合起来才能够完成。