本文共 3535 字,大约阅读时间需要 11 分钟。
在中小型企业,公司不同运维人员基本都是以root 账户进行服务器的登陆管理,缺少了账户权限审计制度。不出问题还好,出了问题,就很难找出源头。
这里介绍下,如何利用编译bash 使不同的客户端在使用root 登陆服务器使,记录各自的操作,并且可以在结合ELK 日志分析系统,来收集登陆操作日志
服务端:
wget
tar -xvf bash-4.4.tar.gz
cd /root/bash-4.4
#define SSH_SOURCE_BASHRC
#define 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] = ' '; #必须要有空格,不能为空,否则make 时会报错。
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);
}
}
./configure --prefix=/usr/local/bash4-4/
make && make install
设置root 登录shell
在客户端1:
ssh-keygen -t rsa -C "rhel-testuser1" 生成key -C 注释 (加上这个也是为了最后进行对服务器访问人员进行辨别的一个关键点)
ssh-copy-id 192.168.72.135 (-i 可以指定key)
在客户端2:
与客户端1一样
ssh-keygen -t rsa -C "rhel7-testuser2"
ssh-copy-id 192.168.72.135
现在去服务器上验证下该文件
服务端配置:
现在上面两个客户端已经可以免密钥登陆了,现在去服务器上配置,并创建脚本
touch /var/log/keys
创建检测脚本,内容如下:
cat /etc/CheckUser.sh
#!/usr/bin/bash
#conding:utf-8
pid=$PPID
#在自己home目录得到所有的key,如果/var/log/keys 没有的时候,添加进去
while read line
do
grep "$line" /var/log/keys >/dev/null || echo "$line" >> /var/log/keys
done < $HOME/.ssh/authorized_keys
#得到每个key的指纹
cat /var/log/keys | while read LINE
do
NAME=$(echo $LINE | awk '{print $3}')
echo $LINE >/tmp/keys.log.$pid
KEY=$(ssh-keygen -l -f /tmp/keys.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/keys.log.$pid
echo "test -f /etc/CheckUser.sh && . /etc/CheckUser.sh" >> /etc/profile
test -z "$BASH_EXECUTION_STRING" || { test -f /etc/CheckUser.sh && . /etc/CheckUser.sh; logger -t -bash -s "HISTORY $SSH_CLIENT USER=$NAME_OF_KEY CMD=$BASH_EXECUTION_STRING " >/dev/null 2>&1;}
sed -i 's/#LogLevel INFO/LogLevel DEBUG/g' /etc/ssh/sshd_config
systemctl restart sshd
验证:
tail -f /var/log/messages
最后说明一下:
在服务端做完后可能会有按ctrl+L不管用的情况
在/etc/profile 中添加以下一行即可
bind -x '"\C-l": clear'
source /etc/profile
回车没换行的在/etc/bashrc 文件中添加一段,如下:
PS1=``\s-\v\$ '' 或者 PS1='[\u@\h \W]\$ '
source /etc/bashrc 详情见man bash 搜索ps1
本文转自silence博客51CTO博客,原文链接http://blog.51cto.com/silencezone/1871914如需转载请自行联系原作者
a120518129