在中小型企业,公司不同运维人员基本都是以root 账户进行服务器的登陆管理,缺少了账户权限审计制度。不出问题还好,出了问题,就很难找出源头。
这里介绍下,如何利用编译bash 使不同的客户端在使用root 登陆服务器使,记录各自的操作,并且可以在结合ELK 日志分析系统,来收集登陆操作日志
服务端:
1、下载编译bash
wget http://ftp.gnu.org/gnu/bash/bash-4.4.tar.gz
tar -xvf bash-4.4.tar.gz
cd /root/bash-4.4
2、 先修改下config-top.h 大概在103,116行附近 (取消注释) 由于c 语言中 注释是/**/ ,所以不要删除错了。修改如下:
#define SSH_SOURCE_BASHRC
#define SYSLOG_HISTORY
3 修改下bashhist.c 文件,让终端上的命令记录到系统messages 中,并且以指定的格式。并传入获得的变量。修改后的内容如下:
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);
}
}
4 配置安装路径,编译安装,编译到/usr/local/目录下
./configure --prefix=/usr/local/bash4-4/
make && make install
5、编译完成后,将新的bash 追加到 /etc/shells 中,并修改root用户的登陆shell 环境为新编译的shell
设置root 登录shell
6、注销当前root用户,重新登陆后,查看/var/log/messages,如下就可以看到记录了操作命令
在客户端1:
ssh-keygen -t rsa -C "rhel-testuser1" 生成key -C 注释 (加上这个也是为了最后进行对服务器访问人员进行辨别的一个关键点)
将公钥上传到服务器上的.ssh/authorized_keys 文件中。ssh-copy-id 命令会自动在服务器上创建.ssh/authorized_keys文件,即使该目录不存在,并自动赋予600权限。
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
现在去服务器上验证下该文件
服务端配置:
现在上面两个客户端已经可以免密钥登陆了,现在去服务器上配置,并创建脚本
在log目录下创建一个 keys 文件,用于登陆时存进去公钥,之后对其进行取出判断的
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
配置 profile,在文件末尾添加一行内容,如下:
echo "test -f /etc/CheckUser.sh && . /etc/CheckUser.sh" >> /etc/profile
在/etc/bashrc 末尾添加下面内容:
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;}
修改sshd 配置文件,开启debug 模式,并重启sshd服务(必须是这个模式,否则不会显示key所描述的内容,也就是USER=后面的那段不显示)
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
本文转自 a120518129 51CTO博客,原文链接:http://blog.51cto.com/silencezone/1871914,如需转载请自行联系原作者