如何滚动 ssh 主机密钥?

如何滚动 ssh 主机密钥?

我正在尝试将 ssh 服务器从 2048 位 RSA 密钥升级到更大的密钥,因为建议尽快淘汰 2048 位密钥。

我生成了一个新密钥,然后将其添加到 sshd 配置中,如下所示:

主机密钥 /etc/ssh/ssh_host_rsa_key            (旧的 2k 位密钥优先)
主机密钥 /etc/ssh/ssh_host_rsa4096_key        (新的更大的钥匙第二

重新启动后sshd,我通过 ssh 连接到主机,没有收到标识更改警告,但是新标识也没有缓存在~/.ssh/known_hosts.如果我以相反的顺序放置行,我会收到标识已更改的警告。同样,当我添加 ed25519 密钥时,无论我以什么顺序放置它,客户端都不会将新密钥添加到已知的主机文件中。

这似乎使得 SSH 主机密钥翻转变得不可能——但很难相信事实确实如此,考虑到安全性通常需要升级密钥。

我知道您可以交换密钥,然后每个客户端都需要运行ssh-keygen -R以删除旧密钥,然后手动验证并接受新密钥 - 但这确实很痛苦,特别是如果您有很多客户端连接或不进行管理所有的客户。更不用说,如果您不管理客户端,他们很有可能不会真正检查主机密钥,而只是按 Y — 因此,提高安全性的尝试实际上可能会让您面临人为攻击——相反,中间攻击。

有什么方法可以让 SSH 主机密钥升级起作用吗?也就是说,客户端应该学习新的更安全的密钥(并且希望不学习过时的密钥)。并且在没有给出主机密钥的情况下更改了中间人警告。

答案1

主机密钥轮换从 OpenSSH 6.8 开始支持(客户端和服务器都在此版本中添加了支持)。

所以这个过程应该是这样的:

  • 使用选项HostKey newkey(在现有密钥之后)生成新密钥并将其添加到/etc/ssh/sshd_config
  • 重新开始sshd
  • 客户端必须UpdateHostKeys yes在其配置中进行设置(全局或每个主机)
  • 连接的客户端将获取所有新密钥
  • 一段时间(几个月?)后,您可以从其中删除旧密钥sshd_config并重新启动sshd
  • 客户端(在过渡期间连接的)已经拥有新密钥(旧密钥不会被删除,这是这里唯一的问题),并且它们不会显示 MitM 攻击警告。

新的足够的客户将能够获得新的钥匙。默认情况下不启用此功能,可能是因为它很新并且很快就显示出一些安全考虑。不过现在用起来应该没问题。

答案2

sshd 始终使用第一行,因此删除它,然后重新启动 sshd。

相关内容