我可以找出用于访问帐户的 ssh 密钥吗?

And*_*cey 68 ssh authentication logs

是否可以找出用于访问帐户的 ssh 密钥?我在服务器上有一个帐户,我让几个(受信任的!)人可以通过 ssh 访问该帐户。我发现能够知道谁登录以及何时登录很有用。我有 root 访问权限,所以我可以查看日志,但那里似乎没有任何内容。是否有一些配置开关可以通过某种方式识别日志中的密钥?

Cal*_*leb 42

如果您进入 sshd 配置文件(通常为/etc/ssh/sshd_config)并将 LogLevel 指令更改为 VERBOSE:

LogLevel VERBOSE
Run Code Online (Sandbox Code Playgroud)

...您可以在日志中看到类似的内容:

6 月 24 日 22:43:42 本地主机 sshd[29779]:找到匹配的 RSA 密钥:d8:d5:f3:5a:7e:27:42:91:e6:a5:e6:9e:f9:fd:d3:ce
Jun 24 22:43:42 localhost sshd[29779]:从 127.0.0.1 端口 59630 ssh2 接受 caleb 的公钥

来自man sshd_config

   LogLevel
          Gives  the  verbosity  level that is used when logging messages from
          sshd(8).  The possible values are: QUIET, FATAL, ERROR,  INFO,  VER-
          BOSE,  DEBUG,  DEBUG1,  DEBUG2,  and  DEBUG3.   The default is INFO.
          DEBUG and DEBUG1 are equivalent.  DEBUG2  and  DEBUG3  each  specify
          higher  levels of debugging output.  Logging with a DEBUG level vio-
          lates the privacy of users and is not recommended.
Run Code Online (Sandbox Code Playgroud)

  • @F.Hauri,除非我遗漏了什么,如果 PID 被重用于第二个 SSH 会话,那不会返回错误的东西吗?看起来它总是会在 auth.log 中返回给定 PID 的最早指纹,而不是最新的。 (3认同)
  • 这只会列出指纹。如果你想获取指纹,可以运行`ssh-keygen -E md5 -lf /root/.ssh/authorized_keys`。 (2认同)

Chr*_*don 22

有点类似于@user37161 的回答。如果共享帐户正在运行自定义外壳程序并且外壳程序需要知道那里的用户,那么运行“包装器”脚本可能还不够,因为除了通过可能导致竞争的方法之外,那里的信息不会传递到自定义外壳程序中状况。

相反,您可以使用environment=authorized_keys 文件中的选项来设置环境变量,然后自定义 shell 可以读取该变量。

在您的.ssh/authorized_keys文件中,在每一行前面加上一个环境变量集,如下所示:

environment="REMOTEUSER=jrhacker" ssh-rsa ....
environment="REMOTEUSER=jbloggs" ssh-rsa ....
Run Code Online (Sandbox Code Playgroud)

然后自定义 shell 或各种 rc 脚本中的任何一个都可以读取$REMOTEUSER变量并采取适当的操作。

但是,请注意,如果您使用的是标准 shell,则登录用户能够修改文件以阻止各种事情。此外,允许用户设置环境变量(如LDPRELOAD. 请参阅sshd_config有关PermitUserEnvironment.


F. *_*uri 16

一些正确安装的脚本

有一种完全可用的方法可以通过密钥跟踪/记录 ssh 连接,并扩展到用户名。

介绍

除了@Caleb 的回答,我想在那里分享一些小技巧:

注意:我正在研究 Debian 6.0

服务器安装

SSHD 日志级别

首先确保服务器配置具有足够的日志记录级别:

作为 root,这将设置并激活详细日志记录:

sed '/^[^#]*LogLevel.*\(QUIET\|FATAL\|ERROR\|INFO\)/{s/^/# /;h;s/$/\nLogLevel VERBOSE/};${p;g;/./!{iLogLevel VERBOSE'$'\n;};D}'  -i /etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)

可以写成:

sed '
     /^[^#]*LogLevel.*\(QUIET\|FATAL\|ERROR\|INFO\)/{
        s/^/# /;
        h;
        s/$/\nLogLevel VERBOSE/
    };
    ${
        p;
        g;
        /./!{
            iLogLevel VERBOSE
        };
        D
    }'  -i /etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)

或在sed 脚本中

#!/bin/sed -f
/^[^#]*LogLevel.*\(QUIET\|FATAL\|ERROR\|INFO\)/{
    s/^/# /;
    h;
    s/$/\nLogLevel VERBOSE/
};
${
    p;
    g;
    /./!{
        iLogLevel VERBOSE
    };
    D
}
Run Code Online (Sandbox Code Playgroud)

可以运行为:

patchSshdConfigLogLevel.sed -i /etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)

然后激活这个:

service ssh restart
Run Code Online (Sandbox Code Playgroud)

系统日志:使指纹用户可读

现在在用户可读文件中获取指纹:

echo ':msg, regex, "Found matching .* key:" -/var/log/sshdusers.log' \
    > /etc/rsyslog.d/ssh_key_user.conf 
echo ':msg, regex, "Accepted publickey for" -/var/log/sshdusers.log' \
    >> /etc/rsyslog.d/ssh_key_user.conf 

service rsyslog restart
Run Code Online (Sandbox Code Playgroud)

尝试从 ssh(重新)登录以确保sshdusers.log创建新文件(并包含某些内容),然后

chmod 644 /var/log/sshdusers.log
Run Code Online (Sandbox Code Playgroud)

最后一步:让它们旋转。

添加/etc/logrotate.d/

cat >/etc/logrotate.d/sshdusers <<eosshdusers
/var/log/sshdusers.log {
  rotate 3
  daily
  compress
  missingok
  postrotate
        touch /var/log/sshdusers.log
        chmod 644 /var/log/sshdusers.log
        /usr/lib/rsyslog/rsyslog-rotate
  endscript
  notifempty
}
eosshdusers
Run Code Online (Sandbox Code Playgroud)

用法

这将打印当前会话的指纹:

sed -ne "/sshd.$PPID.:.*matching .SA key/{s/^.* //g;h};\${x;p}" /var/log/sshdusers.log
Run Code Online (Sandbox Code Playgroud)
sed -ne "/sshd.\($(($(ps ho ppid $PPID)))\|$PPID\).:.*\(Accepted publickey\|matching .SA key\)/{s/^.* //g;h};\${x;p}" /var/log/sshdusers.log
Run Code Online (Sandbox Code Playgroud)

插件 .bashrc

最后,在您或用户的末尾添加一个小插件/etc/bash.bashrc.bashrc

ssh_oPwd=$OLDPWD
ssh_oUmask=$(umask)
umask 077
ssh_tempdir=$(mktemp -d /tmp/ssh-id-XXXXXXX)
cd $ssh_tempdir || exit 1

ssh_crtFp=$(
    sed -ne "/sshd.\($(($(ps ho ppid $PPID)))\|$PPID\).:.*\(Accepted publickey\|matching .SA key\)/{s/^.* //g;h};\${x;p}" /var/log/sshdusers.log
)
for ((ssh_i=1;ssh_i<=$(wc -l <$HOME/.ssh/authorized_keys);ssh_i++));do
    export ssh_line="$(sed -ne ${ssh_i}p <$HOME/.ssh/authorized_keys)"
    echo "$ssh_line" >tempKey
    export ssh_lFp=($(ssh-keygen -l -f tempKey))
    if [ "${ssh_lFp[1]}" == "$ssh_crtFp" ] ;then
        export SSH_KEY_USER=${ssh_line##* }
        break
      fi
  done

cd $OLDPWD
OLDPWD=$ssh_oPwd
rm -fR $ssh_tempdir
umask $ssh_oUmask
unset ssh_lFp ssh_line ssh_i ssh_crtFp ssh_tempdir ssh_oUmask ssh_oPwd
Run Code Online (Sandbox Code Playgroud)

所以从SSH重新登录后,你会看到:

set | grep ^SSH
SSH_CLIENT='192.168.1.31 43734 22'
SSH_CONNECTION='192.168.1.31 43734 192.168.1.2 22'
SSH_KEY_USER=user@mydesk
SSH_TTY=/dev/pts/2
Run Code Online (Sandbox Code Playgroud)

注意在某些安装中,授权密钥文件可能具有不同的名称,例如$HOME/.ssh/authorized_keys2...


小智 10

假设用户“joe”和“deb”有权访问帐户“x”。然后在帐户 x 中 .ssh_authorized_keys添加以下行:

command='wrapper joe' joe public key
command='wrapper deb' deb public key
Run Code Online (Sandbox Code Playgroud)

同样在包装器脚本中,您可以做任何您想做的事情,使用sshcommand记录在特定日期和时间使用的 joe 的私钥$ORIGINAL_COMMAND