我如何保持SSH的知识主机是最新的(半安全的)?

只是为了摆在眼前,所以我没有被告知不要这样做:

  1. 有问题的机器都在本地networking上,几乎没有互联网接入(它们甚至没有连接到公司networking)
  2. 每个有能力build立中间人攻击的人已经拥有了机器的根
  3. 机器作为QA程序的一部分被重新安装,所以拥有新的主机密钥是重要的(我们需要看看其他机器如何反应)。 我只是想让我的机器更好用。

我做了很多重新安装在更改主机密钥的机器上。 这需要在我的机器上进入~/.ssh/known_hosts ,并吹到旧的密钥并添加新的密钥。 这是一个很大的痛苦,所以我开始考虑如何自动化这个。

我不想只是盲目的接受任何主机密钥,所以修补OpenSSH忽略主机密钥就没有了。 我曾经考虑过在ssh命令周围创build一个包装器,它会检测从ssh返回的错误,并提示我删除旧密钥或退出。 我还考虑过创build一个守护进程,可以从白名单上的一台机器上获取最新的主机密钥(有大约二十台机器不断重新安装),并replaceknown_hosts的旧主机密钥。

你将如何自动化这个过程?

取决于重新安装的IP地址/ IP保持不变,我将在〜/ .ssh / config中为特定主机/ IP /模式设置“StrictHostKeyChecking”。

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

如果您正在使用像Puppet这样的configurationpipe理系统,那么可以使用它来让客户端计算机与中央服务器签/etc/ssh/ssh_known_hosts ,使主机更新/etc/ssh/ssh_known_hosts文件。 然后你可以在configuration文件中启用StrictHostKeyChecking选项。

这正是我们用我们的Puppet主服务器检查的Amazon EC2实例所做的。 我们有puppet服务器作为堡垒跳转到我们的EC2实例,是唯一的机器允许SSH进入他们。 然后,我们使用主机密钥和/etc/hosts文件更新/etc/ssh/ssh_known_hosts文件,以更新EC2的公共DNS IP地址。

你需要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文件到其余的机器。

或者,像其他人提到的那样,您可以closuresStrictHostKeyChecking。 这会打开你的中间人攻击,虽然这可能不会在你的环境中担心。

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

或者,您可以使用CFengine或Puppet等configurationpipe理工具将授权的/etc/ssh/ssh_known_hosts发给您网站上的所有客户端。 (如果在~/.ssh/known_hosts没有匹配的条目,OpenSSH咨询/etc/ssh/ssh_known_hosts 。)