it-swarm.cn

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

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

62
Andrew Stacey

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

LogLevel VERBOSE

...您可以在日志中看到以下内容:

6月24日22:43:42 localhost 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.
39
Caleb

有点类似于 @ user37161的答案 。如果共享帐户正在运行自定义命令行管理程序,并且命令行管理程序需要知道那里有什么用户,则运行“包装程序”脚本可能是不够的,因为除非通过可能引起竞争的方法,否则信息不会传递到自定义命令行管理程序中条件。

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

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

environment="REMOTEUSER=jrhacker" ssh-rsa ....
environment="REMOTEUSER=jbloggs" ssh-rsa ....

然后,自定义外壳程序或各种rc脚本中的任何一个都可以读取$REMOTEUSER变量并采取适当的措施。

但是,请注意,如果您使用的是标准Shell,则登录用户可以修改文件以阻止各种事情。另外,允许用户设置环境变量(例如LDPRELOAD)存在一些风险。有关PermitUserEnvironment的信息,请参见sshd_config文档。

18
Chris Cogdon

升级2016-10-31关于日志格式

一些用于正确安装的脚本

有一种完全可用的方法来跟踪/记录ssh连接,方法是使用密钥扩展到用户名。

介绍

除了@Caleb的答案,我还要在此分享一些小技巧:

注意:我正在使用Debian 6.

服务器安装

SSHD日志级别

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

作为root,这将设置并激活详细的loggin:

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

可以写成:

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

sed脚本

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

可以运行为:

patchSshdConfigLogLevel.sed -i /etc/ssh/sshd_config

激活这样:

service ssh restart

Syslog:使指纹用户可读

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

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

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

chmod 644 /var/log/sshdusers.log

用法

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

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

.bashrc的插件

最后,在您的/etc/bash.bashrc或用户的.bashrc的末尾放一些add-on

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

因此,从SSH重新登录后,您将看到:

set | grep ^SSH
SSH_CLIENT='192.168.1.31 43734 22'
SSH_CONNECTION='192.168.1.31 43734 192.168.1.2 22'
[email protected]
SSH_TTY=/dev/pts/2

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

15
F. Hauri

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

command='wrapper joe' joe public key
command='wrapper deb' deb public key

另外,在包装脚本中,您可以执行任何所需的操作,记录joe的私钥已在特定日期和时间使用ssh和命令$ORIGINAL_COMMAND

10
user37161

您可以尝试以下方法:

ssh-add -L | awk '{ print $2 }' | xargs -i grep '{}' ~/.ssh/authorized_keys  | head -n 1

这将:

  • ssh-add -L:列出公共密钥
  • awk '{ print $2 }':仅获取指纹
  • xargs -i grep '{}' ~/.ssh/authorized_keys:用每个键检查authorized_keys
  • head -n 1:仅获取第一个
3
pci

在Fedora 20+上,登录尝试和成功信息保存在/var/log/audit/audit.log中。该日志保存登录尝试(失败和成功),并且用于登录尝试的密钥指纹保存在名为fp的字段中。

您可以通过ssh-keygen -l逐行运行,将登录的密钥指纹与authorized_keys中的指纹进行比较。

有关ssh登录及其安全性和入侵检测的详细说明,在这里: http://vpathak.tumblr.com/post/121343814158/Fedora-audit-log-with-love-from-russia =

3
vpathak

除了@F。豪里回答,我准备了有用的“登录提示”。

另外一个文件是可选的($ HOME/.ssh/users):

[email protected] kszumny
[email protected] kszumny
[email protected] tom
[email protected]
[email protected] chris
[email protected] chris

此部分应粘贴到/etc/profile(适用于所有用户)或~/.bashrc

other_users_Prompt()
{
    pids=`ps fx | grep "sshd:\s" | awk '{print $1}'`
    users=""
    for uid in $pids
    do
        ssh_crtFp=`sed -ne "/sshd.$uid.:.*matching .SA key/{s/^.* //g;p;q}" /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##* }
                ST_USER=`cat $HOME/.ssh/users | grep "${SSH_KEY_USER}" | awk '{print $2}'`
                if [ -z "$ST_USER" ]; then
                    ST_USER=$SSH_KEY_USER
                fi
                if [ -z "$users" ]; then
                    users="$ST_USER"
                else
                    users="$users\n$ST_USER"
                fi
                break
            fi
        done
    done

    if [ `echo -e "$users" | sort | uniq -c | wc -l` == 1  ]; then
       exit
    fi

    users=`echo -e "$users" | sort | uniq -c | awk '{print $2"("$1")"}' | xargs echo -e`
    echo -e "[LoggedIn:$users] "

}

PS1='$(other_users_Prompt)\[email protected]\h:\w\$ '

结果

enter image description here

0
noisy