解决方案

解决方案

每个用户每天创建和销毁 15 个以上的 VM。这些 VM 是在公司内部的 OpenStack 云中创建的。

每次为新虚拟机分配一个之前已分配的 IP 地址时,用户都会收到可怕的主机密钥验证失败错误。这是因为 ssh 密钥与用户文件中的 IP 地址不匹配known_hosts

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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 -RipAddress-(用户已经厌倦了这个解决方案,从那时起每天都会遇到它多次)

有什么方法可以避免出现此错误消息,同时又能保持安全?也许只关闭特定子网的安全检查?

答案1

这个强大的功能HostKeyAlias可以解决您的问题:

ssh -o HostKeyAlias=hostkeyalias__vm_2013-05-11_07 user@host

在 中创建一个条目hostkeyalias__vm_2013-05-11_07(不含 IP)known_hosts。当然,您可以编写一个脚本或 shell 函数,在每次 ssh 调用之前设置此值。或者您可以使用 shell 变量:

HOSTKEYALIAS=hostkeyalias__vm_2013-05-11_07
ssh -o HostKeyAlias=$HOSTKEYALIAS user@host

并且$HOSTKEYALIAS每当 VM 更改时都会更改。应不时地从中删除旧条目known_hosts

答案2

问题在于,它ssh假设 IP 地址和主机之间存在一对一的映射。我们需要打破这种映射仅有的获取您的云服务器的 IP 地址。

解决方案

将以下节添加到您的~/.ssh/config文件中。

# Disable HostKey checking for servers which frequently change keys
Host 172.16.24.32  172.16.24.33  172.16.24.34
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no

只需更改 IP 地址即可完成。¹

可选:IP 地址范围的替代方案

如果您想将其应用于网络块(例如 192.168/16),则可以使用通配符,如下所示:

# Do not keep HostKeys for internal networks.
Host 10.*.*.*  192.168.*.*
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no

可选:使用主机名

最初的问题提到了 IP 地址,但你当然可以使用主机名。例如,这将匹配ssh instance32.vm.yoyodyne.com

Host *.vm.yoyodyne.com
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no

如果你想同时使用主机名和 IP 地址,你需要明确指定两者,因为 SSH 在解决IP 地址。例如,如果您有 的ssh ourvm.local快捷方式ssh 192.168.1.53

Host 192.168.1.53  ourvm.local
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no

警告

绕过 的安全模型时要小心谨慎ssh。特别是,仔细检查您的通配符是否与任何 HostKey 不会更改的正版服务器匹配。


¹为什么是 /dev/null?我将 KnownHosts 数据放入位存储桶中,因为只有设置StrictHostChecking no才能消除警告,但仍然拒绝连接。这很愚蠢,所以我推测 OpenSSH 最终会改变行为或添加新选项。如果有更好的解决方案出现,我会更新此答案。

答案3

~/.ssh/config使用以下内容创建:

Host *
    StrictHostKeyChecking no

或者,您可以为 ssh 创建别名以:

ssh -o StrictHostKeyChecking=no

答案4

您可以在实例启动后从 VM 控制台检索新的主机密钥并更新已知主机文件。

相关内容