将www.github.com添加到known_hosts文件的安全/正确方法是什么?

Kni*_*chi 8 ssh openssh github

我想通过ssh访问我的github存储库.当我第一次访问存储库时,系统会询问是否要将github ssh服务器添加到我的known_hosts文件中,这样可以正常工作.该请求也让我发现服务器的RSA密钥的指纹,我可以手动验证它是由github上提供的相同位置.

这些是OpenSSH 6.8和更新版本(以base64格式)显示的SHA256哈希:

SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 (RSA)
SHA256:br9IjFspm1vxR3iA35FWE+4VTyz1hYVLIE2t1/CeyWQ (DSA)
Run Code Online (Sandbox Code Playgroud)

问题是我想known_hosts在第一次访问我的git存储库之前通过向我的文件添加公钥来阻止该请求.这可以通过使用ssh-keyscan -t rsa www.github.com命令来完成,该命令将以known_hosts文件所需的格式提供公钥.但人们反复提到,这不安全,容易受到中间人攻击.他们没有提到的是如何正确地做到这一点.

那么如何使用github页面上提供的RSA指纹安全地获取ssh服务器的公共主机密钥呢?我或多或少地寻找一个ssh-keyscan命令的选项,让我添加预期的rsa指纹,并导致命令失败,如果主机指纹与给定的指纹不匹配.

感谢您的时间!

Von*_*onC 9

我会 在这种情况下使用ssh-keyscan.
相反,我会使用它通过将其指纹与GitHub提供的指纹进行比较来仔细检查结果.

然后继续进行SSH GitHub测试,检查我是否得到:

Hi username! You've successfully authenticated, but GitHub does not
provide shell access.
Run Code Online (Sandbox Code Playgroud)

因此,按照此处的建议,对于手动过程:

ssh-keyscan github.com >> githubKey
Run Code Online (Sandbox Code Playgroud)

生成指纹:

ssh-keygen -lf githubKey
Run Code Online (Sandbox Code Playgroud)

将它与GitHub提供的相比较

最后,将githubKey内容复制到您的~/.ssh/known_hosts文件中.


您可以使用以下方法自动执行该过程(仍包括指纹步骤检查)wercker/step-add-to-known_hosts:它是一个wercker步骤,但可以外推为其自己的独立脚本.

- add-to-known_hosts:
    hostname: github.com
    fingerprint: 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48
    type: rsa
Run Code Online (Sandbox Code Playgroud)

但这将缺乏检查help.github.com/articles/github-s-ssh-key-fingerprints:见下文.


使用nmap没有多大帮助,如下所述:

使用nmap获得SSH主机密钥指纹,然后比较一下ssh-keyscan指纹说:在这两种情况下,指纹来自相同的地方.
它与其他任何自动化解决方案一样容易受到MITM的攻击.

验证SSH公钥的唯一安全且有效的方法是通过某些受信任的带外通道.(或者设置某种密钥签名基础设施.)

在这里,help.github.com/articles/github-s-ssh-key-fingerprints仍然是"受信任的带外频道".


Luc*_*Luc 6

根据VonC的回答,下面的脚本可以自动验证和添加密钥。像这样使用它:

$ ./add-key.sh github.com nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8
Run Code Online (Sandbox Code Playgroud)

它会告诉您是否成功验证并保存了指纹。
有关使用信息,请使用./add-key.sh --help

剧本:

$ ./add-key.sh github.com nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8
Run Code Online (Sandbox Code Playgroud)