如何known_hosts
安全地将主机密钥添加到 SSH 文件?
我正在设置一台开发机器,并且我想(例如)防止在我使用 SSHgit
克隆存储库时出现提示。github.com
我知道我可以使用StrictHostKeyChecking=no
(例如这个答案),但这并不安全。
到目前为止,我发现...
GitHub 在GitHub 的 SSH 密钥指纹中发布他们的 SSH 密钥指纹
我可以
ssh-keyscan
用来获取github.com
.
我如何结合这些事实?给定一个预填充的指纹列表,我如何验证 的输出是否ssh-keyscan
可以添加到known_hosts
文件中?
我想我在问以下问题:
如何获取返回的密钥的指纹ssh-keyscan
?
假设我已经接受了 SSH的 MITM,但我可以信任 GitHub HTTPS 页面(因为它具有有效的证书链)。
这意味着我有一些(可疑的)SSH 主机密钥(来自ssh-keyscan
)和一些(可信的)密钥指纹。我如何验证一个与另一个?
相关:我如何散列输出的主机部分ssh-keyscan
?或者我可以混合散列/未散列的主机known_hosts
吗?
“安全地”向文件添加密钥的最重要部分
known_hosts
是从服务器管理员那里获取密钥指纹。密钥指纹应如下所示:对于 GitHub,通常我们不能直接与管理员交谈。但是,他们将密钥放在他们的网页上,这样我们就可以从那里恢复信息。
手动安装密钥
1)从服务器获取密钥副本并获取其指纹。注意:在检查指纹之前执行此操作。
2)从服务器管理员处获取密钥指纹的副本 - 在这种情况下,导航到包含 github.com 上信息的页面
3)比较两个来源的密钥
通过在文本编辑器中将它们直接放在另一个之上,很容易查看是否发生了变化
(请注意,第二个密钥已被操纵,但它看起来与原始密钥非常相似 - 如果发生这种情况,您将受到严重攻击,应该联系受信任的安全专家。)
如果密钥不同,请中止该过程并与安全专家联系
4)如果密钥比较正确,那么你应该安装你已经下载的密钥
或者为系统上的所有用户安装(以 root 身份):
自动安装密钥
如果您需要在构建过程中添加密钥,则应遵循上述手动过程的步骤 1-3。
完成后,检查
github-key-temp
文件的内容并制作一个脚本以将这些内容添加到您已知的主机文件中。您现在应该摆脱所有
ssh
已StrictHostKeyChecking
禁用的命令。您可以在 known_hosts 文件中混合散列/未散列条目。
所以如果你想添加 github 密钥,你可以这样做:
ssh-keyscan github.com >> ~/.ssh/known_hosts
如果要散列,请添加 -H
ssh-keyscan -H github.com >> ~/.ssh/known_hosts
注意:这很容易受到 MITM 攻击,它只回答问题的“相关”部分。
最简单的方法是使用 手动获取密钥
ssh-keyscan
,手动验证它们:并将它们添加到您的脚本中,然后该脚本将携带“权威”公钥。
我编写了简单的脚本(add_to_known_hosts)来处理这个问题:
它不会在 known_hosts 文件中创建重复的条目,它会检查指纹是否与作为第二个参数提供的指纹匹配。
现在 GitHub通过其元数据 API 端点(截至 2022 年 1 月)提供其 SSH 密钥和指纹,您可以利用您对 GitHub 使用的 TLS 证书的信任(
api.github.com
因为它由位于您系统的受信任的根证书存储)以安全地获取其 SSH 主机密钥。如果你已经
jq
安装了,你可以用这个单线做到这一点或者如果你想使用 Python
自动化 SSH Known_Hosts 指纹检查
我一直在尝试在 Jupyterhub 上的 Python 中执行此操作一段时间,但@Michael 的回答真的很有帮助!
让我们明确一点——通过设计,这个步骤是为了确认已知主机不应该被自动化,因为它容易受到中间人的攻击(更多信息在这里,但应该很明显为什么这是一个问题)。
使用 Python 和 Bash 手动检查 GitHub.com 的 SSH RSA 指纹
不安全的解决方法
-o "StrictHostKeyChecking no"
可以用于测试,但很高兴有替代方案。!
调用 bash 命令ssh-keyscan
cat
断言指纹匹配以确认已知主机
您现在可以使用 python 断言来确保我们受信任的 RSA 指纹与 Scanned-over-your-internet RSA 指纹的真实性:
感谢和一个更好的解决方法来忽略严格的检查!
如果您想在生成新密钥之前检查密钥是否存在:
此外,就我而言,我不得不提到一个特定的端口:
要生成 known_hosts 文件,在生成您的私钥和公钥并将公钥复制到 site.com 之后,您可以执行