如果主机密钥不同,则忽略或替换

如果主机密钥不同,则忽略或替换

我经常将服务器置于救援模式,这显然会更改主机密钥。因此,在某些情况下,我知道 SSH 主机密钥将被暂时或永久更改。每次我需要执行以下操作:

  • ssh-keygeyn -R x.x.x.x
  • ssh x.x.x.x并确认添加新密钥
  • 在救援模式下执行某些操作并重新启动服务器
  • ssh-keygen -R x.x.x.x
  • ssh x.x.x.x如果需要并接受新的主机密钥

我想知道是否有人想出了一个智能别名,或者有一个 ssh 客户端的配置选项,在出现不同的主机密钥时要求替换当前主机密钥,或者只是暂时忽略该问题并继续。

答案1

解决方案 1

您可以在登录前使用命令扫描远程主机的新公钥ssh-keyscan

ssh-keygen -R x.x.x.x
ssh-keyscan x.x.x.x >> ~/.ssh/known_hosts
ssh x.x.x.x

然后,您可以从中创建一个脚本,使用主机作为参数并将其放入您的PATH.

要检查公钥是否不同,您可以执行以下操作:

diff -q <(ssh-keygen -F x.x.x.x | sed '1d') <(ssh-keyscan x.x.x.x 2>/dev/null)

解决方案 2

现在,如果你的基础设施中有 DNS 服务器,你应该设置SSHFPDNS 记录以集中的方式处理您机器的公钥更改,避免到处自制脚本的麻烦。

检索要配置的 DNS 条目:

ssh-keygen -r /etc/ssh/ssh_host_key.pub

结果如下:

IN SSHFP 1 1 d3fa9bcf2d51979c53bcac2961f38b60e4e60886
IN SSHFP 2 1 f1f09814dd79eea523f490808cf3c096f1d1a432

简单解释一下:

  • 第一个字段:IN = Internet 类别
  • 第二个字段:SSHFP 记录类型
  • 第三个字段:算法(1=RSA、2=DSA、3=ECDSA)
  • 第四字段:指纹类型(1=SHA-1,2=SHA256)

在这些记录前面加上服务器名称作为前缀,并将其放入您的 DNS 配置中。

然后确保您的所有机器都能联系到您的 DNS 服务器/etc/resolv.conf

最后,将VerifyHostKeyDNS=yes选项放入.ssh/config每个服务器上的文件中。

答案2

ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null  

会诱使ssh它认为其密钥列表是/dev/null,并且不会要求您确认将密钥“添加”到(不存在的)文件。这样做的好处是您不必将临时密钥添加到真实文件中。

您可以添加 bash 别名来使用它。

alias sshnk="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"

相关内容