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

Ste*_*ski 44 security users ssh

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

我们担心其中一些人使用未加密的私人 SSH 密钥(没有密码的密钥这很糟糕,因为如果破解者在这台机器上获得了对他们帐户的访问权限,他们可以窃取私钥,现在可以访问到任何使用相同密钥的机器。出于安全原因,我们要求所有用户使用密码来加密他们的私有 SSH 密钥。

如何判断私钥是否未加密(例如,不包含密码)?是否有不同的方法可以在 ASCII 装甲钥匙和非 ASCII 装甲钥匙上执行此操作?

更新:

澄清一下,假设我在机器上拥有超级用户访问权限,并且我可以读取每个人的私钥。

cod*_*ead 59

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

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

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

BT8CqbQa7nUrtrmMfK2okQLtspAsZJu0ql5LFMnLdTvTj5Sgow7rlGmee5wVuqCI
/clilpIuXtVDH4picQlMcR+pV5Qjkx7BztMscx4RCmcvuWhGeANYgPnav97Tn/zp
...
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

所以像

# grep -L ENCRYPTED /home/*/.ssh/id_[rd]sa
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩。

  • @jmanning2k:我刚刚创建了一个没有密码的 RSA 私钥,它不包含字符串“加密:无”。 (3认同)
  • 或字符串 OPENSSH:参见 http://www.tedunangst.com/flak/post/new-openssh-key-format-and-bcrypt-pbkdf (2认同)

rlp*_*ell 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
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用 `-N ''` 以便密码始终保持不变? (3认同)

txw*_*ger 8

如果您有权访问私钥,我想,您可以在没有密码的情况下使用它来针对公钥进行身份验证。如果这有效,您就知道它没有密码。如果有,它会给你一条错误信息。

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

事实上,如果这样做,它会降低系统的安全性。人们可以使用公钥,该公钥可用于尝试进行暴力破解或其他尝试破解密码的攻击。