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


56

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


您是否尝试过在sshd_config中使用LogLevel?
SevenBitTony11年

能够找出用于授权当前会话的密钥是非常有用的(在我的情况下,该密钥用于对通过共享登录名访问的Mercurial存储库进行访问控制)。现有的所有技术都涉及通过命令选项对身份进行线程化,这有点笨拙。
汤姆·安德森

5
有一个关于此的OpenSSH功能请求:请在身份验证日志消息中添加pubkey指纹
Steffen

Answers:


38

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

LogLevel VERBOSE

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

Jun 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.

这看起来很有希望。指纹然后告诉我使用了哪个密钥。万分谢意。
循环空间

对于当前会话的指纹打印:sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;p;q}" /var/log/auth.log
F. Hauri

我喜欢GNU sed
F. Hauri

3
@ F.Hauri,除非我丢失了某些东西,如果将PID重新用于第二个SSH会话,那会不会返回错误的东西?看起来它将始终返回auth.log中给定PID的最早指纹,而不是最新指纹。
godlygeek

@godlygeek哦,是的!我最好鞭打q指令,将行存储到文件末尾... sed行变为:sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;h};\${x;p}" /var/log/auth.log。绝对:我爱sed!
F. Hauri 2014年

15

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

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

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

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

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

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


13

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

一些用于正确安装的脚本

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

介绍

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

Nota:我正在Debian 6.0上工作

服务器安装

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

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'
SSH_KEY_USER=user@mydesk
SSH_TTY=/dev/pts/2

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


当它发布时,我使用的是GNU / Linux Debian 6,但是在Debian 7下的工作却完全相同……
F. Hauri 2014年


由于日志格式更改而进行了升级
F. Hauri

真好 您的patchSshdConfigLogLevel.sed末尾不应带有“ .sed”,因为它将不必要地公开实现细节。#!行完全足够。
Alex North-Keys

一般而言,UN * X下的@ AlexNorth-Keys 扩展名通常都是技术性的,因为我们更喜欢使用mime并了解文件类型。但是,作为人类谁浏览文件系统,具有类似于扩展,,,,,,甚至是有用的!file.pl.py.sh.awk.sed.tar.gz.png.b64.gz
F. Hauri

8

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

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

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


3

在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


2

您可以尝试以下方法:

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

可以说更精确,CPU强度更低:ssh-add -L | awk 'NR==FNR { k=$2;next } /^#/{next} $2==k { print $3;exit} $3==k {print $4;exit} ' - ~/.ssh/authorized_keys
Otheus

0

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

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

kszumny@laptop kszumny
kszumny@comp2 kszumny
tom@laptop tom
pati@home
chris@workstation1 chris
chris@workstation2 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)\u@\h:\w\$ '

结果

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.