如何存储 SSH 密钥?

Ant*_*off 86 security ssh-keys

我最近才开始使用 SSH 密钥而不是密码(当然要感谢 GitHub),所以请记住,我对整个概念还很陌生。目前我的密钥只是在 ~/.ssh 下,但我不确定这是否是一个好习惯。例如,如果我有多台机器,我需要复制我的私钥,我认为这是不可取的。或者,如果我的 HDD 出现故障,那么我将丢失那些密钥,这(我猜)也是不可取的。

那么,安全、方便、可靠地存储 SSH 密钥的最佳实践是什么?

似乎使用智能卡是一种选择(请参阅用于存储 gpg/ssh 密钥的智能卡 (Linux) - 我需要什么?),这是最好的吗?

更新:问题的原因是许多服务(如 GitHub、AWS EC2)提供了有关如何设置 SSH 密钥以使用该服务的指南,但几乎没有背景知识(例如,如果您已经生成了密钥该怎么办)通过ssh-keygen[1],推荐的安全措施是什么)。并且不清楚该信息实际上是否不重要,或者您应该“默认”知道它。

总结到目前为止的答案(但请阅读它们,如果您有要添加的内容,请添加):似乎在这种情况下,如果您将私钥留在 ~/.ssh 中就可以了,只要您让他们远离他人;但请确保您有另一种方式来访问该服务以上传或生成新密钥(如果您丢失了密钥)(通常是这种情况)。

[1] GitHub 用于提供有关如何管理多个密钥的帮助

Dav*_*d Z 48

例如,如果我有多台机器,我需要复制私钥,我认为这是不可取的。

不,实际上你没有。如果您有多台机器,您只需在每台机器上创建一个单独的私钥。对于每个私钥,只需使用相同的过程将相应的公钥上传到 GitHub。

此外,如果我的 HDD 出现故障,我将丢失我的私钥,这(我猜)也是不可取的。

并不真地; 如果您丢失了私钥,只需生成一个新的并上传相应的公钥即可。

就其价值而言,您是对的,复制私钥是非常不可取的。理想情况下,私钥应该在一个文件中生成(~/.ssh/id_rsa例如)并且永远不应该离开那个文件——也就是说,它永远不应该被复制、移动,尤其是不应该通过网络传输。(例如,我将它们从备份中排除)由于非对称身份验证协议的性质,您只需担心将您的私钥从其他人手中拿走。如果你有点过火而你自己忘记了,这通常没什么大不了的。(不要将这与您可能想要保留的非对称加密私钥(例如 GPG 密钥)混淆。)

  • 这仅在您有其他方法来访问该私钥提供访问权限的服务器时才有效。仅当您具有该备份访问权限时,才能上传新的公钥。 (18认同)
  • 谢谢,这清除了很多事情。真的,丢失私有 SSH 密钥看起来不是问题,因为对于我使用的所有服务,似乎总是有另一种方式来访问服务以上传新服务。 (3认同)
  • 除了私钥之外,AWS 不提供任何其他形式的访问。一旦您丢失了私钥,您必须断开驱动器的连接并使用它来获取访问权限。 (3认同)
  • @TREE:是的,但根据我的经验,很难找到不提供某种替代访问方法(或至少不通过 SSH 添加额外的公钥)的服务器。 (2认同)

Cen*_*xDE 11

有一个非常好的工具,名为 KeePass2 ( http://keepass.info/ ) 和扩展名 ( http://lechnology.com/software/keeagent/ )

您可以在那里存储密码、SSH 密钥等(在官方 KeePass 页面上有更多有用的扩展)
如果您想使用 SSH 密钥自动登录,您只需要使用 KeeAgent 安装 PuTTY、Pageant 和 KeePass。如果您配置正确,则不必在 PuTTY、Pageant 或 FileZilla 中设置密钥。

我自己使用它,我很高兴。我有超过 30 个 VPS 和具有一定数量不同 SSH 密钥的根服务器,我唯一要做的就是打开 KeePass(它不是​​我的主要密码安全),然后我只需要在控制台中输入我的密码。


Hey*_*his 10

如果您使用相同的用户帐户来运行两者,我会补充说 ~/.ssh/ 可以被您的浏览器读取。

尝试一下!将浏览器指向主目录中的私钥。好有趣。

所以我建议将 ssh-keys 存储在另一个用户帐户的主目录中。

关于密码保护密钥的一个词

  • 如今,破解非随机密码的速度非常快。看看哈希猫
    • (虽然随机且长 12+ 个字符的密码仍然需要相当长的时间来暴力破解)
    • 因此,在可预见的未来,AES 加密的 ssh 密钥是无法破解的,只要您使用好的长密码短语。见github推荐
  • 因此,某些网站可以在没有 JavaScript 的情况下猜测获取您的密钥。然后离线暴力破解密钥。
  • 浏览器也可以使用 JS 查看您的剪贴板。因此,复制粘贴很长的密码也会使您面临更复杂的 javascript 攻击的风险。

look_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>
Run Code Online (Sandbox Code Playgroud)

  • 需要明确的是,仅仅因为浏览器可以读取您的私钥,并不意味着在浏览器中运行的网站可以。 (19认同)
  • 但是,如果您在浏览器的进程中注入一个进程。然后您也可以控制浏览器。所以这个论点是完全有效的。 (8认同)