关闭对 ssh 密钥的严格检查

spu*_*der 12 ssh ssh-keygen ssh-keys openstack

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

每次为新虚拟机分配一个先前已分发的 IP 地址时,用户都会收到可怕的主机密钥验证失败错误。这是因为 ssh 密钥与用户known_hosts文件中的 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.
Run Code Online (Sandbox Code Playgroud)

我可以看到的两个解决方案是:

  • 关闭严格检查-(安全风险)
  • 让用户运行ssh-keygen -RipAddress- (用户已经厌倦了这个解决方案,从那时起每天都会遇到多次)

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

Hau*_*ing 19

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

ssh -o HostKeyAlias=hostkeyalias__vm_2013-05-11_07 user@host
Run Code Online (Sandbox Code Playgroud)

创建一个条目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
Run Code Online (Sandbox Code Playgroud)

$HOSTKEYALIAS在 VM更改时更改。应不时从 中删除旧条目known_hosts


hac*_*rb9 11

问题在于ssh假设 IP 地址和主机之间存在 1 对 1 映射。我们必须打破这种映射为您的云服务器的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
Run Code Online (Sandbox Code Playgroud)

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

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

如果您想将此应用于网络块,例如 192.168/16,您可以像这样使用通配符:

# Do not keep HostKeys for internal networks.
Host 10.*.*.*  192.168.*.*
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no
Run Code Online (Sandbox Code Playgroud)

可选:使用主机名

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

Host *.vm.yoyodyne.com
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no
Run Code Online (Sandbox Code Playgroud)

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

Host 192.168.1.53  ourvm.local
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no
Run Code Online (Sandbox Code Playgroud)

警告

绕过ssh的安全模型时要小心。特别是,仔细检查您的通配符是否不匹配任何主机密钥不会更改的真正服务器。


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

  • 顺便说一句,虽然这将“解决”SSH 被动态 IP 地址混淆并认为 HostKeys 没有改变的问题,但它不是正确的解决方案。更好的方法是使用 mDNS 并告诉 ssh 仅存储主机名,而不是 IP 地址。在`Host *.local` 下设置`CheckHostIp no`。 (2认同)

小智 10

创建~/.ssh/config内容:

Host *
    StrictHostKeyChecking no
Run Code Online (Sandbox Code Playgroud)

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

ssh -o StrictHostKeyChecking=no
Run Code Online (Sandbox Code Playgroud)