天天看点

KNOWN_HOSTS处理

在平时工作中,有时候需要ssh登陆到别的linux主机上去,但有时候ssh登陆会被禁止,并弹出如下类似提示:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 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 the rsa host key has just been changed.the fingerprint for the rsa key sent by the remote host is36:68:a6:e6:43:34:6b:82:d7:f4:df:1f:c2:e7:37:cc.please contact your system administrator.add correct host key in /u/xlian008/.ssh/known_hosts to get rid of this message.offending key in /u/xlian008/.ssh/known_hosts:2rsa host key for 135.1.35.130 has changed and you have requested strict checking.host key verification failed.

比较奇怪,于是研究了一下。 ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,openssh会核对公钥。如果公钥不同,openssh会发出警告, 避免你受到dns hijack之类的攻击。我在上面列出的情况,就是这种情况。

原因:一台主机上有多个linux系统,会经常切换,那么这些系统使用同一ip,登录过一次后就会把ssh信息记录在本地的~/.ssh/known_hsots文件中,切换该系统后再用ssh访问这台主机就会出现冲突警告,需要手动删除修改known_hsots里面的内容。

有以下两个解决方案:

手动删除修改known_hsots里面的内容; (清除旧的公钥信息ssh-keygen -r 192.168.0.10)

修改配置文件“~/.ssh/config”,加上这两行,重启服务器。

stricthostkeychecking no

userknownhostsfile /dev/null

优缺点:

需要每次手动删除文件内容,一些自动化脚本的无法运行(在ssh登陆时失败),但是安全性高;

ssh登陆时会忽略known_hsots的访问,但是安全性低;

其它:

rm -rf ~/.ssh/known_hosts

优点:干净利索 缺点:把其他正确的公钥信息也删除,下次链接要全部重新经过认证

vi ~/.ssh/known_hosts 删除对应ip的相关rsa信息(本例可知删除53行信息即可)

优点:其他正确的公钥信息保留缺点:还要vi,还要找到对应信息,稍微优点繁琐

linux下经常遇到known_hosts问题,例如git clone一个ssh协议的远程库,就会交互询问是否接受远程服务器的fingerprint,当执行一些自动化脚本时就得通过expect来处理这种情况。

今天搜索了一下,整理了相关处理办法。

linux需要接受和校验fingerprint的原因是避免受到dns hijack之类的攻击。具体原理是第一次访问远程服务器时从远程服务器接受一个fingerprint,实际上是一个rsa或者dsa公钥,将这个公钥保存在~/.ssh/known_hosts里,下次访问该服务器时就会通过这个公钥校验,如果校验不通过就会发出警告。

如果要让ssh不去校验fingerprint有两种办法,一个是ssh时加上-o stricthostkeychecking=no参数,这只会影响本次操作:

ssh -o stricthostkeychecking=no [email protected]

另外永久解决方案是在/etc/ssh/ssh_config或者~/.ssh/config里配置stricthostkeychecking no,修改哪个文件取决于你想影响全局还是当前用户。

另外一种方案是预先将远程服务器的fingerprint存入known_hosts,这样就不会出现询问的情况。

ssh-keygen -r [hostname]

ssh-keygen -r [ip_address]

ssh-keygen -r [hostname],[ip_address]

ssh-keyscan -t rsa [hostname],[ip_address] >> ~/.ssh/known_hosts

ssh-keyscan -t rsa [ip_address] >> ~/.ssh/known_hosts

ssh-keyscan -t rsa [hostname] >> ~/.ssh/known_hosts

ssh-keygen是将已存在的服务器公钥清除,避免重复添加。

ssh-keyscan则是获取远程服务器的fingerprint,如果还想获取dsa公钥则将rsa改成rsa,dsa

参考:

http://serverfault.com/questions/132970/can-i-automatically-add-a-new-host-to-known-hosts

http://blog.csdn.net/yasaken/article/details/7348441

继续阅读