如何确定某人的SSH密钥是否包含空密码?


44

我的一些Linux和FreeBSD系统有数十个用户。员工将使用这些“ ssh网关”节点通过SSH进入其他内部服务器。

我们担心其中一些人使用未加密的私钥SSH密钥(没有密码的密钥这很糟糕,因为如果破解者获得了在此计算机上的帐户的访问权限,他们可能会窃取私钥并现在可以访问出于安全原因,我们要求所有用户使用密码对自己的SSH私钥进行加密。

如何确定私钥是否未加密(例如,不包含密码)?是否有不同的方法可以对ASCII铠装密钥和非ASCII铠装密钥进行此操作?

更新:

为了明确起见,假设我在计算机上具有超级用户访问权限,并且可以读取每个人的私钥。


2
grumble ssh-agent grumble网关上不应有任何私钥。
derobert

一些书呆子注意事项:-用户经常使用较差的密码短语。-用户可以更改密码。-用户可以将其密钥存储在多个位置。-用户可能会使用ssh代理,因此可以一次解锁密钥,例如在笔记本电脑上说。
本·海德2015年

Answers:


59

好吧,带有空密码短语的OpenSSH私钥实际上并未加密。

加密的私钥在私钥文件中声明为此类。例如:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,7BD2F97F977F71FC

BT8CqbQa7nUrtrmMfK2okQLtspAsZJu0ql5LFMnLdTvTj5Sgow7rlGmee5wVuqCI
/clilpIuXtVDH4picQlMcR+pV5Qjkx7BztMscx4RCmcvuWhGeANYgPnav97Tn/zp
...
-----END RSA PRIVATE KEY-----

所以像

# grep -L ENCRYPTED /home/*/.ssh/id_[rd]sa

应该可以。


3
@ jmanning2k:我只是创建了一个没有密码短语的RSA私钥,并且它不包含字符串'Encryption:none'。
Stefan Lasiewski

@ jmanning2k:该-L标志仅列出与模式不匹配的文件名。因此,这个答案本身是正确的。
bahamat 2012年

我已更正,为清楚起见删除了评论。作为记录,我复制了一些Putty私钥文件,这些文件确实显示为“ Encryption:none”。
jmanning2k 2012年

2
或字符串OPENSSH:请参见tedunangst.com/flak/post/…–
杰克·瓦西

10

我四处寻找,却从未找到满意的答案,但我设法构建了一个答案,所以...

请注意,这将在文件正常运行时对其进行更新,因此,如果您不希望所测试密钥的用户注意到该文件,则可能需要先复制该密钥。OTOH,因为您只是用无密码的密钥抓住了用户,所以也许您不在乎他们是否注意到。:D

$ ssh-keygen -p -P '' -N '' -f ~/.ssh/KEYTEST
Key has comment '/home/rlpowell/.ssh/KEYTEST'
Your identification has been saved with the new passphrase.
$ echo $?
0

$ ssh-keygen -p -P '' -N '' -f ~/.ssh/KEYTEST
Bad passphrase.
$ echo $?
1

3
为什么不-N ''这样做,以使密码短语始终保持不变?
好好对待您的mods 2015年

facepalm太好了 ,非常感谢。
rlpowell

+1,因为此解决方案甚至可以使用SSH的新私钥格式。
塞巴斯蒂安·克里斯曼斯基

8

我想,如果您有权访问私钥,则可以使用它而无需密码来针对公钥进行身份验证。如果这行得通,您知道它没有密码短语。如果有,它将给您错误消息。

如果您无权访问私钥,我怀疑您可以检测到这一点。密码短语的目的是“解锁”私钥,它对公钥没有任何作用。

实际上,如果这样做,将使系统的安全性降低。一个人可以使用公共密钥,该公共密钥可用来尝试进行暴力破解或其他破解密码的攻击。

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.