我如何才能使 SSH 的 know_hosts 保持最新(半安全地)?

我如何才能使 SSH 的 know_hosts 保持最新(半安全地)?

只是为了把这一点摆在前面,这样我就不会被告知不要这样做:

  1. 有问题的机器都在本地网络上,几乎没有互联网访问(它们甚至没有很好地连接到公司网络)
  2. 任何有能力发起中间人攻击的人都已经拥有机器的 root 权限
  3. 作为 QA 程序的一部分,机器被重新安装,因此拥有新的主机密钥非常重要(我们需要看看其他机器如何反应);我只是试图让我的机器使用起来更好用。

我经常在更改主机密钥的机器上重新安装。这需要进入~/.ssh/known_hosts我的机器,删除旧密钥并添加新密钥。这非常麻烦,所以我开始考虑如何自动化这个过程。

我不想盲目地接受任何主机密钥,因此修补 OpenSSH 以忽略主机密钥是不可能的。我考虑过创建一个命令包装器,ssh它将检测来自的错误ssh并提示我删除旧密钥或退出。我还考虑过创建一个守护进程,它将从白名单上的一台机器(大约有二十台机器正在不断重新安装)获取最新的主机密钥并替换旧的主机密钥known_hosts

您将如何实现这一过程的自动化?

答案1

根据重新安装/IP 保持不变的原因,我会考虑在 ~/.ssh/config 中为特定主机/IP/模式设置“StrictHostKeyChecking”。

如果这不可能,那么考虑在主机上自动加载密钥,也许是在重新安装过程中。

答案2

如果您正在使用配置管理系统(如 Puppet),则可以使用它来让文件/etc/ssh/ssh_known_hosts在客户端计算机与中央服务器签入时与主机保持更新。然后您可以StrictHostKeyChecking在配置文件中启用该选项。

这正是我们对使用 Puppet 主服务器签入的 Amazon EC2 实例所做的。我们让 Puppet 服务器充当进入 EC2 实例的堡垒跳转箱,并且是唯一允许通过 SSH 进入这些实例的机器。然后,我们使用/etc/ssh/ssh_known_hosts主机密钥更新文件,并使用/etc/hosts文件更新 EC2 的公共 DNS IP 地址。

答案3

您需要的是ssh-keyscan,它与 openssh 一起分发。从手册页

 ssh-keyscan is a utility for gathering the public ssh host keys of a num‐
 ber of hosts.  It was designed to aid in building and verifying
 ssh_known_hosts files. 

作为重新安装的一部分,让一台具有最新密钥列表的机器运行此程序,然后将更新的known_hosts文件分发到其余机器。

或者,正如其他人提到的,您可以关闭 StrictHostKeyChecking。这会使您面临中间人攻击,尽管在您的环境中这可能不是什么问题。

答案4

也许您想在重新安装之前保存主机密钥,然后再恢复它们。

或者,您可以使用一些配置管理工具,例如CF引擎或者木偶将权威分发给您的站点上的所有客户端。(如果 中没有匹配的条目,/etc/ssh/ssh_known_hostsOpenSSH 会进行咨询。)/etc/ssh/ssh_known_hosts~/.ssh/known_hosts

相关内容