如何存储SSH密钥?


66

我最近才开始使用SSH密钥而不是密码(当然,感谢GitHub),所以请记住,我对整个概念还很陌生。目前,我的密钥只是位于〜/ .ssh下,但是我不确定这是否是一个好习惯。例如,如果我有多台计算机,则需要复制我的私钥,我认为这是不可取的。或者,如果我的HDD变成了kaput,那么我会丢失那些密钥,(我想)这也是不可取的。

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

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

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

总结到现在为止的答案(但是请阅读它们,如果您有什么要补充的,请做):在这种情况下,只要将私钥保留在〜/ .ssh中就可以了,只要您让他们远离别人;但请确保您有另一种访问服务的方法,以防丢失(通常是这种情况)上载或生成新密钥。

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


该链接似乎断开了help.github.com/multiple-ssh-keys
KJ Price

@KJ Price,这要归功于Internet Archive的Wayback Machine,该页面仍然可以在线访问,尽管没有原始链接。您可以在“ 多个SSH密钥”中找到2011年9月2日存档的页面副本。
moonpoint

Answers:


41

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

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

另外,如果我的硬盘进入空置状态,我会丢失我的私钥,这也是我所不希望的。

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

对于它的价值,您是对的,非常不希望复制私钥。理想情况下,应在一个文件中生成一个私钥(~/.ssh/id_rsa例如),并且永远不要离开该文件-也就是说,永远不要在网络上对其进行复制,移动和尤其是传输。(例如,我从备份中排除了它们)由于非对称身份验证协议的性质,您只需要担心将私钥放在他人的手中。如果您有点落伍,并且自己迷失了方向,那么通常这没什么大不了的。(这不要与您可能想要保留的非对称加密私钥(例如GPG密钥)混淆。)


14
仅当您有其他访问私钥提供访问权限的服务器的方法时,此方法才有效。只有拥有该备份访问权限,您才能上载新的公共密钥。
TREE

2
@TREE:是的,但是以我的经验,找到一个没有提供其他替代访问方法(或至少在不通过SSH的情况下添加其他公共密钥)的服务器是非常罕见的。
David

3
谢谢,这使事情变得很顺利。确实,丢失私密SSH密钥似乎不是问题,因为对于我正在使用的所有服务,似乎总是存在另一种访问服务以上传新服务的方法。
2011年

3
除私钥外,AWS不提供任何其他形式的访问。丢失私钥后,您必须断开驱动器并四处闲逛才能访问。
Asad Saeeduddin

1
请注意,如果需要另一层安全保护,可以在私钥上输入密码。
sudo

8

我要补充一点,如果您使用相同的用户帐户来运行〜/ .ssh /,则浏览器可以读取它。

试试吧!将浏览器指向主目录中的私钥。很有趣。

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

密码保护密钥

  • 如今,破解非随机密码的速度非常快。退房哈希猫
    • (尽管随机且长且超过12个字符的char密码仍然需要相当长的时间才能强行破解)
    • 因此,在可预见的将来,只要您使用良好的长密码短语,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>

17
明确地说,仅仅是因为浏览器可以读取您的私钥,并不意味着在浏览器中运行的网站可以。
Ajedi32

6
但是,如果您在浏览器的进程中注入一个进程。然后,您也可以控制浏览器。所以这个说法是完全正确的。
BigSack 2014年

但是随后,您必须破解将进程注入到浏览器的处理单元的进程寄存器中的进程。
卡德

8

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

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

我自己使用它,对此我感到非常高兴。我有30多个VPS和Root Server,并带有一定数量的不同SSH密钥,我唯一要做的就是打开KeePass(不是我的主要密码安全),然后我只需要在控制台中输入我的密码即可。


3

我建议存储私钥:

  • 离线(不在云中)
  • 在一个以上的地方
  • 除了与之相关的任何内容(例如加密数据的密钥)之外,请将其与数据保存在单独的位置

我会说,最好的地方是:

  • 外置硬盘
  • 闪光灯
  • 没有连接到互联网的计算机

更好的是,只需将其打印出来,然后放入防火保险箱中。


4
安全/最佳实践与实用性紧密结合。如果安全策略限制了使用系统的能力,它将被用户而不是攻击者绕开。
zaTricky

1

我有一个tar文件,该文件包含我的用户目录设置(.bashrc,.ssh /和其他配置文件),并且存放在安全的地方。当我在任何地方获得新的Shell帐户时,都会将tar文件解压缩到其中。

您应该只将私钥放到您信任的服务器上,否则应仅在该服务器上为该服务器创建一个新的私钥,并允许其访问您希望其访问的内容。

就个人而言,我很乐意将我的.ssh /内容复制到各处(这也意味着通过常规的ssh密钥可以立即访问ssh,因为它已经在authorized_keys文件中)。


我猜想,将加密的〜/ .ssh挂在USB记忆棒上可以避免硬件故障时生成和上传新密钥的需要。但是,由于我使用SSH密钥访问的服务器很少(我连接的计算机也很少),因此生成新密钥不会造成太多开销。
安东·斯特罗贡诺夫

2
它是必修课,取决于您为什么使用按键。我没有看到在已经加密的SSH链接上复制ssh私钥的问题。但是,如果您不信任目标计算机并且不知道谁具有root用户访问权限,则不应在服务器上放置任何无法承受的费用。
2011年

您不想将私钥放在别人的服务器上。在该服务器上具有Root访问权限的任何人都可以读取您的私钥,然后他们可以在您使用该私钥访问的系统上模拟您。您只应使用公共密钥访问服务器。而且,如果您在远程计算机上使用密码来解密私钥,也不要认为密码短语有太大帮助。
Codeguy007'1

您可以通过ssh转发ssh-agent。这样,您无需将私钥存储在服务器上,也无需通过网络发送密码。stackoverflow.com/questions/12257968/...
Codeguy007

1

您可以将ssh密钥存储在加密分区内的单独目录中。然后,您可以使用ssh指向该目录-i

ssh -i identity_file me@example.com

完整说明(man ssh):

-i identity_file

选择一个文件,从该文件中读取用于公共密钥身份验证的标识(私有密钥)。协议版本1的默认值为〜/ .ssh / identity,协议版本2的默认值为〜/ .ssh / id_dsa,〜/ .ssh / id_ecdsa,〜/ .ssh / id_ed25519和〜/ .ssh / id_rsa。也可以在配置文件中按主机指定。
可能有多个-i选项(以及在配置文件中指定的多个标识)。如果CertificateFile指令未明确指定任何证书,则ssh还将尝试从通过将-cert.pub附加到身份文件名获得的文件名中加载证书信息。

我的安全性方法是将信息分为私人和一般信息。我不想加密我的整个主分区,这就是为什么我将机密文件(如中的文件~/.ssh)复制到加密分区中的原因。

我认为这提供了相当有效的安全性,因为恶意软件无法在〜/ .ssh中找到任何东西,而且很可能不会扫描整个系统或Shell配置文件来找到该位置。

-F configfile 

设置配置文件的路径。

PS我将创建一个别名alias ssh='ssh -i ... -F ...'并将其放入您的个人资料。

PPS我还没有检查过,我也不知道其他程序(如git)如何在这些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.