区分多人使用同一系统用户(如root)的操作记录

多人使用同一用户名root在不同终端登录服务器进行操作,怎样才能区分不同用户的操作。参考了网上很多资料,最终找到一个靠谱的解决方法。采用 sshd 公钥认证和重新修改编译bash可以解决。
修改bash源文件:

[root@xxx-xx-xxx ~]# wget http://ftp.gnu.org/gnu/bash/bash-4.1.tar.gz
[root@xxx-xx-xxx ~]# tar xvfz bash-4.1.tar.gz
[root@xxx-xx-xxx ~]# cd bash-4.1
[root@xxx-xx-xxx bash-4.1]# vim config-top.h 
下面两行的宏定义取消注释:
91 #define SSH_SOURCE_BASHRC 该选项只针对 6 系列的系统(CentOS6.x,RHEL6.x等)
104 #define SYSLOG_HISTORY

修改 bashhist.c 源文件中的 bash_syslog_history 函数,修改完之后内容:

void
bash_syslog_history (line)
 const char *line;
{
 char trunc[SYSLOG_MAXLEN];
 const char *p;
 p = getenv("NAME_OF_KEY");
 if (strlen(line) < SYSLOG_MAXLEN)
 syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY: PID=%d PPID=%d SID=%d User=%s USER=%s CMD=%s", getpid(), getppid(), getsid(getpid()), current_user.user_name, p, line);
 else
 {
 strncpy (trunc, line, SYSLOG_MAXLEN);
 trunc[SYSLOG_MAXLEN - 1] = ' '; //注意是空格
 syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY (TRUNCATED): PID=%d PPID=%d SID=%d User=%s USER=%s CMD=%s", getpid(), getppid(), getsid(getpid()), current_user.user_name, p, trunc);
 }
}

重新编译bash

[root@xxx-xx-xxx bash-4.1]# ./configure --prefix=/usr/local/bash
[root@xxx-xx-xxx bash-4.1]# make
[root@xxx-xx-xxx bash-4.1]# make install

编辑一个新的bash_1000文件,名称随便取与后面的保持一致就好。也可以直接写到/etc/bashrc里面(不建议这种做法)

[root@xxx-xx-xxx ~]# vim /etc/bash_1000

pid=$PPID
#在自己home目录得到所有的key,如果/var/log/key 没有的时候,添加进去
while read line
do
grep "$line" /var/log/key >/dev/null || echo "$line" >> /var/log/key
done < $HOME/.ssh/authorized_keys
#得到每个key的指纹
cat /var/log/key | while read LINE
do
 NAME=$(echo $LINE | awk '{print $3}')
echo $LINE >/tmp/key.log.$pid
 KEY=$(ssh-keygen -l -f /tmp/key.log.$pid | awk '{print $2}')
grep "$KEY $NAME" /var/log/ssh_key_fing >/dev/null || echo "$KEY $NAME" >> /var/log/ssh_key_fing
done
#如果是root用户,secure文件里面是通过PPID号验证指纹
if [ $UID == 0 ]
then
ppid=$PPID
else
#如果不是root用户,验证指纹的是另外一个进程号
ppid=`/bin/ps -ef | grep $PPID |grep 'sshd:' |awk '{print $3}'`
fi
#得到RSA_KEY和NAME_OF_KEY,用来bash4.1得到历史记录
RSA_KEY=`/bin/egrep 'Found matching RSA key' /var/log/secure|/bin/egrep "$ppid"|/bin/awk '{print $NF}'|tail -1`
 if [ -n "$RSA_KEY" ];then
NAME_OF_KEY=`/bin/egrep "$RSA_KEY" /var/log/ssh_key_fing|/bin/awk '{print $NF}'`
fi
#把NAME_OF_KEY设置为只读
readonly NAME_OF_KEY
export NAME_OF_KEY
/bin/rm /tmp/key.log.$pid

继续修改文件/etc/profile 和 /etc/bashrc 让用户登录时加载/etc/bash_1000这个环境配置文件

[root@xxx-xx-xxx ~]# vim /etc/profile
#加入以下行
test -f /etc/bash_1000 && . /etc/bash_1000

[root@xxx-xx-xxx ~]# vim /etc/bashrc
#加入以下行
test -z "$BASH_EXECUTION_STRING" || { test -f /etc/bash_1000 && . /etc/bash_1000; logger -t -bash -s "HISTORY $SSH_CLIENT USER=$NAME_OF_KEY CMD=$BASH_EXECUTION_STRING " >/dev/null 2>&1;}
echo ‘/usr/local/bash/bin/bash’ >> /etc/shells

更新 /etc/passwd ,将root用户的 bash,指向新编译的bash

root:x:0:0:root:/root:/usr/local/bash/bin/bash

将sshd 设置成调试模式

[root@xxx-xx-xxx ~]# vim /etc/ssh/sshd_config
LogLevel DEBUG

重启sshd服务
以上步骤只完成了重新编译bash这部分的内容,如果采用 sshd 公钥认证登录,则会记录不同公钥所有者的操作记录。这样数人使用同一系统用户,也能区分每个人的操作记录了。
以下是 /var/log/messages 效果截图(scp 这类没有直接登录bash的操作也能记录)
linuxbash转载请注明出处:http://www.xiaomastack.com/2014/07/05/linuxbash/ 谢谢!

发表评论:

你的电子邮件地址将不会被公开.

35 − = 28