我经常创建和销毁虚拟机,并通过 SSH 连接到它们。
客户端和服务器端的操作系统都是 RedHat Enterprise Linux 版本 7 或 8(两者皆有),当然还有 openssh 作为 SSH 服务器。
第一个 SSH 连接总是会报告主机密钥丢失,除非我使用 ssh-keyscan 预填充我的 known_hosts 文件。这当然是意料之中的。
然后我配置系统(通常使用 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 hostname当然会返回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 主机密钥。
第一个 SSH 连接会填充 ECDSA 主机密钥和按 IP 地址的 ED25519 密钥。对于 ECDSA 主机密钥,这似乎没问题,但对于 ED25519 密钥,显然不行。
答案1
看起来这可能是 openssh 的一个错误。
$ ssh <redacted FQDN>
Warning: the ED25519 host key for '<redacted FQDN>' differs from the key for the IP address '<redacted IP>'
Offending key for IP in /home/<redacted>/.ssh/known_hosts:450
Matching host key in /home/<redacted>/.ssh/known_hosts:447
Are you sure you want to continue connecting (yes/no)? no
Host key verification failed.
我的 known_hosts 文件的第 447 行到第 450 行是:
<redacted FQDN> ssh-ed25519 AAAA<redacted>
<redacted FQDN> ssh-rsa AAAAB<redacted>
<redacted FQDN> ecdsa-sha2-nistp256 AAAAE<redacted>
<redacted IP> ecdsa-sha2-nistp256 AAAA<redacted>
最后两行的键匹配,并且所有四行都引用同一个 FQDN 或相应的 IP 地址。
让我得出结论,这是 openssh 中的一个错误,因为“有问题的密钥”实际上并不是 ed25519 密钥。openssh 应该检测到这一点,并将其与 ecdsa-sha2-nistp256 进行匹配。
删除“有问题的密钥”并再次使用 ssh 连接后,该密钥会使用正确的 ssh-ed25519 密钥正确填充。
我仍然不确定为什么该密钥最初填充了错误的密钥类型。
更新:我发现初始填充似乎与在 sshd_config 文件中指定我自己的密码有关,这可能不是一个好主意。删除该文件,并删除 /etc/sysconfig/sshd 中的 CRYPTO_POLICY= 条目似乎解决了这个问题。这是在 RedHat 8 上(RedHat 7 没有全局加密策略)。