只是为了把这一点摆在前面,这样我就不会被告知不要这样做:
- 有问题的机器都在本地网络上,几乎没有互联网访问(它们甚至没有很好地连接到公司网络)
- 任何有能力发起中间人攻击的人都已经拥有机器的 root 权限
- 作为 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。这会使您面临中间人攻击,尽管在您的环境中这可能不是什么问题。