每个用户每天创建和销毁 15 个以上的虚拟机。VM 在公司内部的 OpenStack 云中创建。
每当一个新的虚拟机被分配一个之前已经分发过的 IP 地址时,用户就会得到可怕的主机密钥验证失败错误。known_hosts
这是因为 ssh 密钥与用户文件中的 IP 地址不匹配。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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 is
xxxxxxxxxxx
Please contact your system administrator.
Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.
Offending key in /home/user/.ssh/known_hosts:4
RSA host key for domain.com has changed and you have requested strict checking.
Host key verification failed.
我能看到的两个解决方案是:
- 关闭严格检查 - (安全风险)
- 让用户运行
ssh-keygen -R
ipAddress
-(用户已经厌倦了这个解决方案,从那以后每天都会多次遇到它)
有什么方法可以防止此错误消息,同时保持安全?也许只关闭特定子网的安全检查?
强大的功能
HostKeyAlias
可以解决您的问题:在 中创建一个条目
hostkeyalias__vm_2013-05-11_07
(没有 IP)known_hosts
。当然,您可以编写一个脚本或 shell 函数,在每次 ssh 调用之前设置该值。或者你使用一个 shell 变量:并
$HOSTKEYALIAS
在 VM 更改时更改。不时应从中删除旧条目known_hosts
。问题在于
ssh
假定 IP 地址和主机之间存在一对一的映射。我们只需要为您的云服务器的 IP 地址打破该映射。解决方案
将以下节添加到您的
~/.ssh/config
文件中。只需更改 IP 地址即可。 ¹
可选:IP 地址范围的替代方案
如果您想将此应用到网络块,例如 192.168/16,您可以像这样使用通配符:
可选:使用主机名
最初的问题提到了 IP 地址,但您当然可以改用主机名。例如,这将匹配
ssh instance32.vm.yoyodyne.com
:如果您想同时使用主机名和 IP 地址,则需要明确指定两者,因为 SSH 与解析的IP 地址不匹配。例如,如果您有
ssh ourvm.local
以下快捷方式ssh 192.168.1.53
:警告
ssh
规避的安全模型时要小心。特别是,仔细检查您的通配符是否与主机密钥不会更改的任何正版服务器不匹配。¹为什么是 /dev/null?我将 KnownHosts 数据放入位桶中,因为只有设置
StrictHostChecking no
会删除警告,但仍然拒绝连接。这很愚蠢,所以我认为 OpenSSH 最终会改变行为或添加新选项。如果出现更好的解决方案,我会更新这个答案。~/.ssh/config
使用以下内容创建:或者,您可以为 ssh 创建别名以:
您可以从 VM 控制台检索新的主机密钥,并在实例启动后更新已知的主机文件。