将主机(例如GitHub)安全地添加到SSHknown_hosts文件


20

如何known_hosts安全地将主机密钥添加到SSH 文件?

我正在设置开发机器,并且想要(例如)防止git在克隆存储库时github.com使用SSH进行提示。

我知道我可以使用StrictHostKeyChecking=no(例如,这个答案),但这并不安全。

到目前为止,我已经发现...

  1. GitHub在https://help.github.com/articles/github-s-ssh-key-fingerprints/发布其SSH密钥指纹。

  2. 我可以ssh-keyscan用来获取的主机密钥github.com

如何结合这些事实?给定预先填充的指纹列表,如何验证的输出ssh-keyscan可以添加到known_hosts文件中?


我想我在问以下问题:

我如何获取返回的密钥的指纹ssh-keyscan

假设我已经使用SSH 进行了MITM编辑,但是我可以信任GitHub HTTPS页面(因为它具有有效的证书链)。

这意味着我有一些(可疑)SSH主机密钥(来自ssh-keyscan)和一些(受信任的)密钥指纹。如何验证一个与另一个?


相关:如何散列来自输出的主机部分ssh-keyscan?还是可以在其中混合使用散列/未散列的主机known_hosts


为什么它对您的用例不安全?
quadruplebucky

StrictHostKeyChecking=no容易受到MITM的攻击。是ssh-keyscan能够抵御中间人?
罗杰·利普斯科姆

我不明白为什么我过分担心有人冒充我从未见过的陌生人,而我却没有足够的信任来编写我将要下载并运行的代码...
Quadruplebucky

因为这是在github上的私人仓库中的源代码,并且我不希望MITM(例如)在推送提交时引入恶意更改。那只是一个例子。
罗杰·利普斯科姆

我(不管是好是坏)选择信任github。我不会选择信任我和他们之间的每个随机网络链接。
罗杰·利普斯科姆

Answers:


11

“安全地”向known_hosts文件添加密钥的最重要部分是从服务器管理员那里获取密钥指纹。密钥指纹应如下所示:

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

对于GitHub,通常我们不能直接与管理员交谈。但是,他们将密钥放在网页上,因此我们可以从那里恢复信息。

手动按键安装

1)从服务器上获取密钥的副本,并获取其指纹。注意:检查指纹之前,请执行此操作。

$ ssh-keyscan -t rsa github.com | tee github-key-temp | ssh-keygen -lf -
# github.com:22 SSH-2.0-babeld-f3847d63
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

2)从服务器管理员那里获取密钥指纹的副本-在这种情况下,导航至包含github.com上信息的页面

  1. 转到github.com
  2. 转到帮助页面(如果已登录,则位于右侧菜单上;否则,位于主页底部)。
  3. 在“ 入门”部分中,转到“ 使用SSH连接到GitHub”
  4. 转到测试您的SSH连接
  5. 将该页面的SHA256指纹复制到文本编辑器中,以备后用。

3)比较两个来源的密钥

通过在文本编辑器中将它们直接放置在另一个之上,可以轻松查看是否已更改

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA) #key recovered from github website
2048 SHA256:nThbg6kXUpJ3Gl7E1InsaspRomtxdcArLviKaEsTGY8 github.com (RSA) #key recovered with keyscan

(请注意,第二个密钥已被操纵,但它看起来与原始密钥非常相似-如果发生这种情况,您将受到严重攻击,并应联系值得信赖的安全专家。)

如果密钥不同,请中止该过程并与安全专家联系

4)如果密钥比较正确,则应该安装已经下载的密钥

cat github-key-temp >> ~/.ssh/known_hosts

或为系统上的所有用户安装(以root用户身份):

cat github-key-temp >> /etc/ssh/ssh_known_hosts

自动密钥安装

如果您需要在构建过程中添加密钥,则应遵循上述手动过程的步骤1-3。

完成之后,检查github-key-temp文件的内容并创建一个脚本以将这些内容添加到您的已知主机文件中。

if ! grep github.com ~/.ssh/known_hosts > /dev/null
then
     echo "github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" >> ~/.ssh/known_hosts
fi

现在,您应该摆脱所有sshStrictHostKeyChecking禁用的命令。


17

您可以在您的known_hosts文件中混合使用散列/未散列的条目。

因此,如果要添加github键,则可以执行以下操作:

ssh-keyscan github.com >> ~/.ssh/known_hosts

如果您希望将其哈希,请添加-H

ssh-keyscan -H github.com >> ~/.ssh/known_hosts


1
哈希/未哈希之间有什么区别?我知道什么是哈希,但不知道为什么在这种情况下应用哈希。
Glen Thomas

3
通过散列条目,您可以隐藏有关用于连接的主机的信息。检查接受的答案在security.stackexchange.com/questions/56268/...
凌晨

4
这不能回答问题。使用ssh-keyscan会受到中间攻击的威胁,这意味着您存储的密钥可能是属于试图闯入系统的攻击者的密钥。请查看我的答案以检查情况。
迈克尔

参加 引起注意的是错误的答案 - “两个最重要的答案实际上是不安全的”
Peter Mortensen

6

最简单的方法是使用手动获取密钥ssh-keyscan,并手动验证它们:

$ ssh-keyscan -t rsa github.com | ssh-keygen -lf -
# github.com:22 SSH-2.0-libssh-0.7.0
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

并将它们添加到您的脚本中,然后该脚本将带有“权威”公共密钥。


我已经像您说的那样拥有密钥,如何将它们“添加到脚本中”?
Glen Thomas

作为单独的文件或脚本中的字符串。
雅库耶

这个答案很危险,因为隐藏在“手动验证”中是一个非常困难的过程。我在下面添加了一个答案,试图解释如何执行此操作并安全地使用结果。
迈克尔

参加 引起注意的是错误的答案 - “两个最重要的答案实际上是不安全的”
Peter Mortensen

1
@RogerLipscombe我同意可以安全地解释答案-没有解释“手动验证”,但是如果您理解为“遵循ssh手册页中的说明”,则可能很好。这里的风险是有人可能不了解这一点,例如,可以尝试不安全的操作,例如在登录服务器后检查密钥。这就是为什么我将这个答案称为“危险”,而将另一个答案称为“不安全”的原因-您如何手动进行检查的细节很重要。感谢你的接纳。
迈克尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.