![如何获取当前authorized_keys ssh密钥的注释?](https://linux22.com/image/1212125/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8Dauthorized_keys%20ssh%E5%AF%86%E9%92%A5%E7%9A%84%E6%B3%A8%E9%87%8A%EF%BC%9F.png)
编辑:我真正需要知道的是,authorized_keys 中的哪个 ssh 密钥已用于识别当前登录的用户。
根据“man sshd”:
Protocol 2 public key consist of options, keytype, base64-encoded key, comment.
我发现当我使用 ssh-keygen 时,注释通常是用户的本地身份。当我在远程计算机上时,有什么方法可以访问此值吗?(有点像 SSH_CLIENT shell 变量)
(假设我强制将评论设置为某种远程身份,我想从 shell 脚本中记录它!这是在 ubuntu 上)
答案1
我个人会不是推荐这个解决方案,但为了讨论而发布它。
如果你愿意:
- 更改 SSHd 的日志记录级别
- 授予您的脚本访问权限/var/log/安全(或等效日志文件)
您可以在 sshd_config 中设置“LogLevel DEBUG”,以便每次成功使用 ssh 密钥进行身份验证时获取以下条目:
Aug 13 11:51:13 myhost sshd[20195]: debug1: matching key found: file /home/myuser/.ssh/authorized_keys, line 3
Aug 13 11:51:13 myhost sshd[20195]: Found matching DSA key: 00:aa:bb:cc:dd:ee:00:c0:0b:fa:ce:00:00:ab:cd:ef
编写脚本来解析日志并检索相关信息并不难。您可能可以 grep 查找“sshd[$PPID]”,以减少脚本需要处理的行数。
请注意,将日志级别更改为 DEBUG 将大大增加日志的大小,并可能侵犯用户的隐私。摘自“man sshd_config”:
DEBUG 级别的日志记录侵犯了用户的隐私,因此不建议使用。
我确信可以采取各种步骤来使这个解决方案不那么可怕(例如,将 sshd DEBUG 信息记录到另一个文件并控制对该文件和脚本的访问)但最终它仍然会让你感到畏缩。
答案2
这是为了方便,来自ssh-keygen
Debian 的手册页:
对于 RSA1 密钥,密钥文件中还有一个注释字段,它只是为了方便用户识别密钥。注释可以说明密钥的用途或任何有用的信息。创建密钥时,注释被初始化为“user@host”,但可以使用 -c 选项进行更改。
我认为,要确定使用哪个密钥登录,最接近的方法是使用ssh-add
手册页中的 -L:
-L 列出代理当前代表的所有身份的公钥参数。
你能将 ssh 守护进程的日志记录级别增加到 DEBUG1:
LogLevel DEBUG1
并且日志将显示用于登录的 SSH 密钥的 RSA 指纹:
Aug 13 08:52:56 ubuntu_test sshd[17115]: debug1: matching key found: file /home/username/.ssh/authorized_keys, line 1
Aug 13 08:52:56 ubuntu_test sshd[17115]: Found matching RSA key: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
您可以使用以下方式获取密钥的指纹ssh-keygen
:
-l 显示指定公钥文件的指纹。还支持私钥 RSA1。对于 RSA 和 DSA 密钥,ssh-keygen 会尝试查找匹配的公钥文件并打印其指纹。如果与 -v 结合使用,则会随指纹一起提供密钥的 ASCII 艺术表示。
从授权密钥文件中,您必须将每一行拆分成一个新文件,然后使用 读取ssh-keygen -l
。以下是执行此操作的示例 Ruby 脚本:
#!/usr/bin/env ruby
File.open("/home/username/.ssh/authorized_keys").each do |l|
file_name = l.split(" ")[2]
key_file = File.new("#{file_name}.pub_key", "w")
key_file.puts l
key_file.close
puts %x{ssh-keygen -l -f #{file_name}.pub_key}
end
答案3
如果您想从机器上的脚本跟踪登录,这将有所帮助SSHd
。
步骤1:Shell 变量 ' SSH_CLIENT
' 为您提供两部分信息
- 远程 IP 地址(
192.168.1.2
在下面的行中) - 客户端连接的远程 TCP 端口(
56120
如下)
SSH_CLIENT='192.168.1.2 56120 22' ----------- ----- 源 IP 端口
第2步:您现在可以登录(向后)到源 IP(192.168.1.2)并检查UserID
。
SSHd 服务器 $ ssh[电子邮件保护]执行“netstat -et | grep 56120” tcp 0 0 主机名:56120 本地主机:ssh 已建立用户 1 9937126 ----- -----
你有已识别[email protected]
。
答案4
由于我在网上找不到完整的答案,所以我编写了自己的 bash 脚本:
#!/bin/bash
cat /root/.ssh/authorized_keys | while read KEY; do
echo "";
name=$(echo "$KEY" | cut -d ' ' -f3-);
file_name=$(echo "$name" | tr ' ' '_');
echo $KEY > $file_name;
fingerprint=$(ssh-keygen -l -f $file_name);
rm -f $file_name;
echo "$name login's";
logins=$(grep `echo "$fingerprint" | awk '{print $2}'` /var/log/secure*);
logins_count=$(echo "$logins" | wc -l);
echo "Total Login's: $logins_count";
if [ -n "$logins" ]; then
login_pids=$(echo "$logins" | perl -p -e 's/.*\[(.*)\].*/$1/g');
for f in `ps -e | grep 'sshd' | awk '{print $1}' | grep "$login_pids"`; do
[ -n "$f" ] && echo "Current sessions pid: $f";
done;
fi;
done;
#
编辑:多年后我写下这篇文章,希望它能对某些人有用
https://github.com/sayajin101/SSH-Key-Login-Extended