我想知道我怎样才能logging用户在服务器上使用的SSH命令行。 例如,如果我的服务器上的用户Alex正在执行以下一组命令:
$ cd /tmp $ touch myfile $ ssh [email protected] $ ssh [email protected] $ vim anotherfile $ ssh [email protected]
我想将服务器上使用的ssh命令logging在如下所示的文件中:
[2014-07-25 10:10:10] Alex : ssh [email protected] [2014-07-25 10:18:20] Alex : ssh [email protected] [2014-07-25 11:15:10] Alex : ssh [email protected]
我不在乎他在ssh会议期间做了什么,我只是想知道WHEN和他在哪里与另一台服务器build立连接。
用户没有使用bash,我想避免操作.bash_history,因为用户可以修改它。
任何线索?
谢谢 :)
编辑:更具体:
用户连接到服务器A,然后从服务器A连接到服务器B.我想跟踪他通过服务器A通过SSH连接的服务器。
你可以用三种不同的方式做到这一点 – 最有可能的还有许多其他的方式来做到这一点! 最好的方法是将审计工具附加到内核sysexec调用,以便用户无法追踪。另外两种方法只是修改shell环境来logging它。
而不是我(从谷歌抓住代码/答案)告诉你如何做到这一点。 我会给你链接到已经详细解释过的网站。 我希望这正是你所需要的。
顺便说一句,最简单的方法是只包括一些东西在你的主要bashrc /configuration文件,以影响所有用户。
无论如何,这里是链接到bashrc解决scheme。
1)Bashrc解决scheme: 如何loggingLinux中所有用户执行的命令? 2)Bashrc /陷阱解决scheme: Bash:历史到Syslog
另一种方式(内核级别)则是查看工具审计或acct。 有很多网站告诉你如何设置通过内核sysexec调用命令的日志logging。
这里有一个脚本,你可以使用它来捕获用户标识和其他信息,以便在启动ssh之前将其放入一个日志文件中。 我testing了几个非常复杂的多行ssh命令。
#!/bin/bash # Title......: ssh (wrapper) # Description: this script replaces the ssh binary and runs the real binary after logging the connection attempt # variables #---------------------------------- REALBINARY=/usr/bin/sshu THISHOST=$(uname -n) LOGFILE=/var/log/sshclient.log CALLINGPROC=$(ps -o comm= $PPID) log() { # creates a basic log entry; $LOGFILE must be defined echo "$(date '+%Y-%m%d %H:%M:%S %Z') $$ $*">>$LOGFILE } SSHTARGETOPTS=$(echo "$@" | head -1) while getopts :l: OPT 2> /dev/null do case "$OPT" in l) TARGETUSER="$OPTARG" ;; esac done #after parsing with getopts, OPTIND will be the positional parameter number of the first argument after the options FIRSTARG=$(echo $SSHTARGETOPTS | awk "{print \$$OPTIND}") #if there is an '@' symbol in the FIRSTARG, parse out the LOGIN and TARGETSERVER, if not, TARGETSERVER is FIRSTARG if [[ "$FIRSTARG" =~ '@' ]] ; then TARGETUSER="${FIRSTARG%@*}" TARGETSERVER=${FIRSTARG##*@} else TARGETSERVER="$FIRSTARG" fi TARGETUSER="${TARGETUSER:-$LOGNAME}" if [[ "$SUDO_USER" ]] ; then log "$THISHOST CallingProc='$CALLINGPROC' SUDO_USER='$SUDO_USER' became LOGNAME='$LOGNAME' ssh to TARGETSERVER='$TARGETSERVER' as TARGETUSER='$TARGETUSER' with command '$0 $SSHTARGETOPTS'" else log "$THISHOST CallingProc='$CALLINGPROC' LOGNAME='$LOGNAME' ssh to TARGETSERVER='$TARGETSERVER' as TARGETUSER='$TARGETUSER' with command '$0 $SSHTARGETOPTS'" fi exec $REALBINARY "$@"
最明显的,shell不可知的方法是用一个包装脚本/程序代替ssh来完成所需的日志logging,然后执行ssh。
使用包装程序意味着用户正在使用的shell(是的,除了bash之外的shell)并不重要,而其他程序(例如emacs,vi,mailx等)的“shell转义”将会也被logging。