如何获取当前authorized_keys ssh密钥的注释?

如何获取当前authorized_keys ssh密钥的注释?

编辑:我真正需要知道的是,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

我个人会不是推荐这个解决方案,但为了讨论而发布它。

如果你愿意:

  1. 更改 SSHd 的日志记录级别
  2. 授予您的脚本访问权限/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-keygenDebian 的手册页:

对于 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

相关内容