我希望锁定我们的 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或类似的东西未加密,请不要管它——它应该是那样的!)
| 归档时间: |
|
| 查看次数: |
19589 次 |
| 最近记录: |