我是 Ansible 和 Terraform 的忠实粉丝,因为我可以上下移动虚拟机并左右放置它们。但是,当我工作时,我经常被要求确认我信任库存主机密钥中的一些新创建的主机。
我可以关闭主机密钥检查,但如果我将其保持打开状态可能会更好,这样我就知道我的库存中的旧主机没有被篡改。(好像我什至会认出它们,或者记得它们已经被配置为虚拟机)。
在这个喧嚣、庞大的云世界中,主机密钥是否有用?或者我只是一个相信好的、老式身份方案的浪漫主义者?云世界有更好的方案吗?
我是 Ansible 和 Terraform 的忠实粉丝,因为我可以上下移动虚拟机并左右放置它们。但是,当我工作时,我经常被要求确认我信任库存主机密钥中的一些新创建的主机。
我可以关闭主机密钥检查,但如果我将其保持打开状态可能会更好,这样我就知道我的库存中的旧主机没有被篡改。(好像我什至会认出它们,或者记得它们已经被配置为虚拟机)。
在这个喧嚣、庞大的云世界中,主机密钥是否有用?或者我只是一个相信好的、老式身份方案的浪漫主义者?云世界有更好的方案吗?
我们在工作中有一个解决方案,我们使用已知 CA 签名的 SSH 主机证书来解决这个问题。如果您不熟悉 ssh 证书,您可以在 ssh-keygen 手册中了解它,并且那里有很多不错的指南:
云部分
为了使 ssh 主机密钥唯一并在主机上生成,我们将私有主机 CA 密钥存储在我们使用的映像中。当映像第一次启动时,sshd 会生成新的密钥,然后我们有一个“firstboot”脚本,它基本上是这样做的:
然后,您所要做的就是通过将这个 CA 密钥添加到您的个人或全局 known_hosts 文件中来信任它。您现在可以在没有自动信任的情况下登录机器。
这可能会给您带来一些安全问题,因为 CA 在第一次启动时在映像中可用,但它对我们有用,因为我们对基础架构有很好的控制,我们认为它足以在生成证书后将其删除。
使用 SSHFP 的可能替代解决方案
刚刚想到的另一个解决方案是使用 SSHFP 记录。如果你有一个 DNSSEC 签名分区,你可以让虚拟机通过某种方法向你的 DNS 服务器报告它们的密钥,然后使用 SSHFP 记录类型在 DNS 中发布它们的密钥。如果区域已签名,OpenSSH 客户端将信任这些记录。我为此写了一个简短的指南: