我最近才开始使用 SSH 密钥而不是密码(当然,这要感谢 GitHub),所以请记住,我对整个概念还很陌生。目前我的密钥只是位于 ~/.ssh 下,但我不确定这是否是一种好的做法。例如,如果我有多台机器,我需要复制我的私钥,我认为这是不可取的。或者,如果我的硬盘坏了,那么我就会丢失这些密钥,这(我猜)也是不可取的。
那么,安全、方便、可靠地存储 SSH 密钥的最佳实践是什么?
似乎使用智能卡是一种选择(见用于存储 gpg/ssh 密钥的智能卡(Linux) - 我需要什么?),这个是不是最好的一个?
更新:提出这个问题的原因是,许多服务(如 GitHub、AWS EC2)提供了有关如何设置 SSH 密钥以使用该服务的指南,但几乎没有背景信息(例如,如果您已经拥有由 [1] 生成的密钥该怎么办ssh-keygen
,建议采取哪些安全措施)。目前还不清楚这些信息是否真的不重要,或者您“默认”应该知道这些信息。
总结到目前为止的答案(但请阅读它们,如果您有什么要添加的,请添加):在这种情况下,只要您将私钥留在 ~/.ssh 中就可以了,只要您将它们保密不让其他人知道即可;但如果您丢失了密钥(通常情况下),请确保您有另一种方式访问服务来上传或生成新密钥。
[1] GitHub 曾提供有关如何管理多个密钥的帮助。
答案1
例如,如果我有多台机器,我需要复制私钥,我认为这是不可取的。
不,实际上你不需要。如果你有多台机器,你只需在每台机器上创建一个单独的私钥。对于每个私钥,只需使用相同的流程将相应的公钥上传到 GitHub。
此外,如果我的硬盘坏了,我就会丢失我的私钥,这(我猜)也是不希望的。
不是的;如果您丢失了私钥,只需生成一个新密钥并上传相应的公钥即可。
不管怎样,你说得对,复制私钥是非常不可取的。理想情况下,私钥应该在一个文件中生成(~/.ssh/id_rsa
例如),并且应该绝不保留该文件 - 也就是说,它永远不应被复制、移动,尤其是不能通过网络传输。(例如,我将它们排除在备份之外)由于非对称身份验证协议的性质,您只需担心将您的私钥放在他人手中。如果您做得有点过火,自己也失去了踪迹,这通常不是什么大问题。(不要将这与非对称混淆加密私钥,例如 GPG 密钥,您可能想要保留它。)
答案2
有一个非常好的工具叫 KeePass2 (http://keepass.info/) 扩展名为 (http://lechnology.com/software/keeagent/)
您可以在那里存储密码、SSH 密钥等(在官方 KeePass 页面上有更多有用的扩展)
如果您想使用 SSH 密钥自动登录,只需安装 PuTTY、Pageant 和 KeePass 以及 KeeAgent。如果您正确配置它,则不必在 PuTTY、Pageant 或 FileZilla 中设置密钥。
我自己也在用,而且用起来很开心。我有超过 30 个 VPS 和根服务器,以及一定数量的不同 SSH 密钥,我唯一要做的就是打开 KeePass(它不是我的主要密码保险箱),然后我只需要在控制台中输入我的密码。
答案3
我要补充一点,如果您使用同一个用户帐户运行两者,则您的浏览器可以读取 ~/.ssh/。
试试吧!将浏览器指向您的私人的键入你的主目录。这很有趣。
因此我建议将 ssh-keys 存储在另一个用户帐户的主目录中。
关于使用密码保护密钥的说明
- 如今,破解非随机密码的速度非常快。查看哈希猫
- (尽管随机且较长的 12 个字符以上的密码仍然需要相当长的时间才能被暴力破解)
- 因此,只要你使用好的长密码,AES 加密的 ssh 密钥在可预见的未来是无法破解的。请参阅github 建议
- 因此,某些网站可以在不使用 JavaScript 的情况下猜测并获取您的密钥。然后离线暴力破解密钥。
- 而且浏览器也可以使用 JS 查看你的剪贴板。因此,复制粘贴很长的密码也会让你面临更复杂的 javascript 攻击的风险。
查看_at_keys.html
9 <HTML>
10 <HEAD>
11 <TITLE>look at keys</TITLE>
12 </HEAD>
13 <FRAMESET cols="20%, 80%">
14 <FRAMESET rows="100, 200">
15 <FRAME src="/Users/yourname/.ssh/stuff.pem">
16 <FRAME src="blah.html">
17 </FRAMESET>
18 <FRAME src="contents_of_frame3.html">
19 </FRAMESET>
20 </HTML>
答案4
您可以将 ssh 密钥存储在加密分区内的单独目录中。然后,您可以使用 ssh 指向该目录-i
:
ssh -i identity_file [email protected]
详细描述 (man ssh
):
-i 身份文件
选择一个文件,从中读取用于公钥认证的身份(私钥)。协议版本 1 的默认值为 ~/.ssh/identity,协议版本 2 的默认值为 ~/.ssh/id_dsa、~/.ssh/id_ecdsa、~/.ssh/id_ed25519 和 ~/.ssh/id_rsa。还可以在配置文件中按主机指定身份文件。可以使用多个
-i 选项(配置文件中可以指定多个身份)。如果未通过 CertificationFile 指令明确指定证书,ssh 还将尝试从通过将 -cert.pub 附加到身份文件名而获得的文件名中加载证书信息。
我的安全方法是将信息分为私人信息和公共信息。我不想加密我的整个主分区,这就是为什么我将秘密文件(如 中的文件~/.ssh
)复制到加密分区中。
我认为这提供了相当有效的安全性,因为恶意软件不会在 ~/.ssh 中找到任何东西,并且可能不会扫描整个系统或 shell 配置文件来查找该位置。
-F configfile
设置配置文件的路径。
PS 我会创建一个别名alias ssh='ssh -i ... -F ...'
并将其放入您的个人资料中。
PPS 我还没有检查这个,而且我不知道其他程序(如 git)将如何处理这些 ssh 设置。