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

场景

多人使用同一用户名root在不同终端登录服务器进行操作,怎样才能区分不同用户的操作。采用sshd公钥认证和重新修改编译bash可以解决。

开始搬砖
修改bash源文件
1
2
3
4
5
6
7
$ wget http://ftp.gnu.org/gnu/bash/bash-4.1.tar.gz 
$ tar xvfz bash-4.1.tar.gz
$ cd 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 函数,修改完之后内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
1
2
3
./configure --prefix=/usr/local/bash 
make
make install
编辑bash_1000环境配置文件

名称与后面的保持一致,也可以直接写到/etc/bashrc里面(不建议)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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这个环境配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vim /etc/profile 
#加入以下行
test -f /etc/bash_1000 && . /etc/bash_1000

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;}

#将编译好的bash路径追加到文件/etc/shells
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 设置成调试模式
vim /etc/ssh/sshd_config
LogLevel DEBUG

最后重启sshd生效。

总结

如果采用sshd公钥认证登录,则会记录不同公钥所有者的操作记录。这样数人使用同一系统用户,也能区分每个人的操作记录了。/var/log/messages截图(scp没有直接登录bash的操作也能记录)
linuxbash

----------------本文结束 感谢阅读----------------