我经常创建和销毁虚拟机,并通过 SSH 连接到它们。
客户端和服务器端的操作系统都是 RedHat Enterprise Linux 版本 7 或 8(两者都有),当然还有 openssh 作为 SSH 服务器。
除非我使用 ssh-keyscan 预填充我的 known_hosts 文件,否则第一个 SSH 连接将始终报告缺少主机密钥。这当然是意料之中的。
然后我配置系统(通常使用 Ansible,但在 Ansible 运行之前我也观察到了这个问题),并且不可避免地每次重新连接时,SSH 都会报告其中一个主机密钥已更改。
Warning: the ED25519 host key for 'redacted' differs
from the key for the IP address 'redacted' Offending key for IP
in /redacted/.ssh/known_hosts:424 Matching host key in
/redacted/.ssh/known_hosts:362
我还检查了服务器端的 /etc/ssh,发现所有主机密钥都具有相同的时间戳,因此 ED25519 主机密钥实际上并没有改变。
-rw-r-----. 1 root ssh_keys 480 Aug 6 17:26 ssh_host_ecdsa_key
-rw-r--r--. 1 root root 162 Aug 6 17:26 ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys 387 Aug 6 17:26 ssh_host_ed25519_key
-rw-r--r--. 1 root root 82 Aug 6 17:26 ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys 2.6K Aug 6 17:26 ssh_host_rsa_key
-rw-r--r--. 1 root root 554 Aug 6 17:26 ssh_host_rsa_key.pub
我希望了解为什么known_hosts 首先填充了与后续连接中使用的不同的 ED25519 密钥。
我不是在寻找“编辑您的 known_hosts 文件”性质的修复程序。我知道该怎么做(如果您想了解更多信息,请参阅如何修复有关 ECDSA 主机密钥的警告)。我有时在大规模(有时是数百个系统)上工作,这非常乏味。此外,在不了解密钥更改原因的情况下简单地操作 known_hosts 文件可能是一个安全问题。
相反,我正在寻找的是更深入地了解正在发生的事情,以及如何防止它发生,或者至少如何自动解决它(不影响安全性!)
受 Frank Thomas 启发的更新:
无论我是重复使用以前使用的 IP 地址还是新的 IP 地址(在我的情况下大多数都是新的),都会出现问题。
另一个可能相关的观察:在我的 known_hosts 文件中,rsa 和 edcsa 主机密钥与 FQDN 相关联。ed25519 主机密钥有两个条目。一个与 FQDN 相关联,而另一个与 IP 地址相关联。
问题似乎总是与 IP 地址关联的密钥版本有关。
有关如何填充 known_hosts 文件的更多详细信息:
首先,删除任何现有的 known_host 条目。getent hosts 主机名当然会返回 IP 地址和主机名。
for host in $h $(getent hosts $h)
do
/usr/bin/ssh-keygen -R $host 2>&1 >/dev/null
done
然后检索新密钥:
/usr/bin/ssh-keyscan $h 2>/dev/null >> ~/.ssh/known_hosts
这只会按主机名填充 rsa 和 ED25519 主机密钥。
ECDSA 主机密钥和 IP 地址的 ED25519 密钥由第一个 SSH 连接填充。这似乎适用于 ECDSA 主机密钥,但显然不适用于 ED25519 密钥。