是否可以找出使用哪个ssh密钥访问帐户?我在服务器上有一个帐户,可以让几个(受信任!)人通过ssh访问该服务器。我发现知道谁登录以及何时登录非常有用。我具有root用户访问权限,因此可以查看日志,但似乎没有任何内容。是否有一些配置开关将以某种方式在日志中标识密钥?
是否可以找出使用哪个ssh密钥访问帐户?我在服务器上有一个帐户,可以让几个(受信任!)人通过ssh访问该服务器。我发现知道谁登录以及何时登录非常有用。我具有root用户访问权限,因此可以查看日志,但似乎没有任何内容。是否有一些配置开关将以某种方式在日志中标识密钥?
Answers:
如果进入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
sed
!
q
指令,将行存储到文件末尾... sed行变为:sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;h};\${x;p}" /var/log/auth.log
。绝对:我爱sed!
有点类似于@ user37161的答案。如果共享帐户运行的是自定义外壳程序,而该外壳程序需要知道那里有什么用户,则运行“包装程序”脚本可能不够用,因为除非通过可能引起竞争的方法,否则信息不会传递到自定义外壳程序中条件。
相反,您可以使用environment=
authorized_keys文件中的选项来设置环境变量,然后自定义外壳程序可以读取该环境变量。
在.ssh/authorized_keys
文件内部,在每一行之前添加一个环境变量集,如下所示:
environment="REMOTEUSER=jrhacker" ssh-rsa ....
environment="REMOTEUSER=jbloggs" ssh-rsa ....
然后,自定义外壳程序或各种rc脚本中的任何一个都可以读取$REMOTEUSER
变量并采取适当的措施。
但是,请注意,如果您使用的是标准外壳程序,则登录用户可以修改文件以阻止各种事情。此外,允许用户设置环境变量(例如)也存在一些风险LDPRELOAD
。请参阅有关的sshd_config
文档PermitUserEnvironment
。
有一种完全可用的方法来跟踪/记录ssh连接,方法是扩展到用户名。
除了@Caleb的答案,我还要在此分享一些小技巧:
Nota:我正在Debian 6.0上工作。
首先确保服务器配置具有足够的日志记录级别:
作为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
现在在用户可读文件中获取指纹:
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
...
file
.pl
.py
.sh
.awk
.sed
.tar.gz
.png.b64.gz
在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
除了@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\$ '
结果