有没有办法检查用户的 SSH 密钥以查看密码短语是否为空

Cyb*_*nja 8 ssh ssh-agent

我希望锁定我们的 Solaris 10、RHEL 5 和 SLES 11.2 服务器。我注意到有些用户没有 SSH 密钥的密码。有没有办法用脚本检查这个?

更新

下面我发布了我根据@tylerl 给我的答案写的脚本。我发布此信息以防其他人将来需要此信息。很可能有更好的方法来做到这一点,但这是有效的。我仍然需要为未自动挂载的帐户编写其他脚本。感谢大家的帮助

#!/bin/bash
# This script is for checking for a blank passphrase. Meaning no passphrase to secure your SSH key.
# Script most be run as root.
# Example: sudo ./check-sshkeys

mount share:/vol/home /mnt
ls /mnt >/tmp/ls
for s in `cat /tmp/ls`
do echo -e "\e[1m User $s \033[0m "

if ls /mnt/$s/.ssh/id_rsa 2>/dev/null
        then grep ENCRYPTED /mnt/$s/.ssh/id_rsa || echo -e "No RSA
passphrase"
        else echo "RSA key not found"
fi
if ls /mnt/$s/.ssh/id_dsa 2>/dev/null
        then grep ENCRYPTED /mnt/$s/.ssh/id_dsa || echo -e "No DSA
passphrase"
        else echo "DSA key not found"
fi
done
rm /tmp/ls
umount /mnt
Run Code Online (Sandbox Code Playgroud)

tyl*_*erl 14

如果您从服务器检查人们正在连接,那么没有骰子。SSH 密钥在使用前必须在内存中解密,这意味着对服务器来说它们看起来是一样的。除非您可以获得实际密钥文件的副本,否则您将陷入困境。

但是,如果您在人们连接的机器上,那么这很简单 - 只需查看密钥文件即可。

SSH 密钥上的密码用于加密密钥,该文件指示是否使用加密以及加密类型。

加密的私钥如下所示:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,259001658E2E5C2618A9648EA35122F4

GFzPnlYdGYVTmK5t45xv/m0Nok9czOuFNNuS+Sm5vzGaOa7LBMtRNJgWFBCGsfFl
wouThpuKxV+ArgmzPa9hnEmy18QW0sbza8SKm/3Hbqi8XwCliz2xP2xS+iGSkYDt
...
LAB/DZasuYBSsVadfemDsmrRvUz7/4eJZTxoEvwNQtAWhTS8j9RbRPee4rk1fwew
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

虽然未加密的看起来像这样:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAtdKjJa18HbagmuMvb/gDCpXXYPVqRsXDdwTcG3YY5RlJtdxY
TJD+626tLTyuzzw6ZsGJtScrSjm2Jp5uUrDXnkek39Zxj24bTM9k/tZBeAQubrwO
....
I8u05jPL1WZmre5SVexfFEvAGqMdiWLvURpnQkI7Wn6nXJjEbUOdGQ==
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

训练有素的眼睛可能会注意到第二行包含单词“ ENCRYPTED ”。这就是你的线索。如果文件包含“ENCRYPTED”这个词,那么它就是,如果没有,那么它不是。

所以这是你的脚本:

grep -L ENCRYPTED /home/*/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

修改以适应您的环境,但您明白了。显然,人们可以通过将“ENCRYPTED”一词放在文件底部来欺骗您的脚本,但我们假设他们不会。


Jan*_*der 12

服务器无法知道您用来连接它的密钥是否有密码。

密码用于加密存储的 SSH 密钥。当您使用 SSH 密钥时,它会使用密码短语解密到内存中,以便它可以用于连接到服务器。因此服务器无法判断所使用的密钥是否被解密。

如果私钥存储在服务器上(而不是用于连接到服务器),您可以进行检查。


Tylerl 的答案是找到未加密密钥的最简单方法,尽管如果 OpenSSH 引入了新的密钥格式(他们最近这样做了),它可能会中断。另一种方法是使用 ssh-keygen 进行检查,但这种方法有其自身的问题。

很难编写此检查的脚本,因为 OpenSSH 工具对他们的密钥非常挑剔,而且如果他们找到加密的密钥,他们也很想与用户交谈。如果您有软件包中的setsid工具,这是一种(粗略的)检查方法util-linux

if res="$(setsid </dev/null 2>&1 env -i ssh-keygen -y -f "$keyfile")" ; then
    echo "Unencrypted private key!"
else
    echo "Encrypted, or unreadable, or not a private key,"
    echo "or doesn't have correct permissions for a private key,"
    echo "or SSH doesn't like it for some reason."
    echo "More info that may or may not be helpful:"
    printf "%s\n" "$res"
fi
Run Code Online (Sandbox Code Playgroud)

如果它显示“未加密的私钥!”,那么您肯定已经找到了。如果没有,您至少可以打赌,如果是未加密的密钥,SSH 不会按原样使用它。

(注意,如果您碰巧发现它/etc/ssh/ssh_host_rsa_key或类似的东西未加密,请不要管它——它应该是那样的!)