sftp服务端fingerprint发生变化后客户端连接时自动更新known_hosts
最近在做sftp服务端改造时发现一个情况,从单机改造为通过keepalived实现的双机应用时,客户端通过shell脚本中的lftp命令来连接服务时,如果keepalived的vip发生过漂移就会连接失败。
排查后发现是因为shell脚本所在用户的 ~/.ssh/known_hosts 中所记录的服务器信息与vip漂移后的主机不一致,导致连接失败。
解决方法最简单的是把vip漂一下,分别记录下来后,合并到known_hosts中,但万一下次还要做迁移岂不是还要再手工配置一遍?
那最佳的方案应该是在进行sftp连接时,如果服务端的fingerprint发生变化后,能够自动更新。
从安全角度来说,不推荐自动更新公网服务端的fingerprint
看了这两篇文章《ssh StrictHostKeyChecking》、《Auto accept rsa key fingerprint from command line》,再加上测试,有以下发现
openssh的版本不同,StrictHostKeyChecking=accept-new的作用是不同的(注:从7.6版本开始才有accept-new)
在7.8p1版本上,当known_hosts中没该机器信息时,accept-new可以接收新的fingerprint,但当fingerprint改造时,就会报错无法连接
在9.0p1版本上,accept-new对于无fingerprint或fingerprint改变都可以适用
所以除了StrictHostKeyChecking外还需要配置UserKnownHostsFile
# lftp
在lftp全局配置文件中添加ssh连接参数
echo "set sftp:connect-program 'ssh -a -x -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=/dev/null'" >> /etc/lftp.conf
# ssh/sftp/scp
# 修改shell脚本
手工对脚本中的ssh/sftp/scp命令添加 -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=/dev/null
ssh -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=/dev/null username@ip
scp -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=/dev/null source destination
sftp -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=/dev/null username@ip
2
3
# 修改脚本所在用户的ssh连接配置
echo "Host *" >> ~/.ssh/config
echo " StrictHostKeyChecking no" >> ~/.ssh/config
echo " UserKnownHostsFile /dev/null" >> ~/.ssh/config
2
3
# 修改系统ssh连接配置
echo "Host *" >> /etc/ssh/ssh_config
echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config
echo " UserKnownHostsFile /dev/null" >> /etc/ssh/ssh_config
2
3
🌻🌻🌻