技术背景:
工程师A:公司里那么多服务器,每天服务器上都会创建些新用户,这样不安全
工程师B:不给他们创建用户的权限不就好了?
工程师A:不放权,事事都自己管,那不累死了
工程师B:那就写脚本监控,这样就知道什么时候,谁通过哪个终端创建了哪个用户了
技术实现:
服务器环境:centos7.4
1.运行pstree可以看到:进程树上有一个auditd进程
auditd进程是审计监控,可以记录谁在什么时候对哪个文件做了什么操作,本脚本主要使用这个技术
2.本次是监听用户的创建,新创建的用户会写入/etc/passwd文件中,所以要通过audit审计监控这个文件
auditctl -w /etc/passwd -p rwxa
auditctl -l ==>就可以看到自己创建的监听规则
以上命令只是临时创建,服务器重启后就没了,不适用,所以要写入配置文件中
vim /etc/audit/rules.d/audit.rules
-w /etc/passwd -p rwxa
3.创建新用户,查看审计信息
useradd li1
echo 123 | passwd --stdin li1
ausearch -f /etc/passwd | grep useradd | tail -1
==>就可以看到刚刚操作的详细信息
timer=`ausearch -f /etc/passwd | grep useradd | tail -1 | awk '{print $2}' | awk -F'[(.)]' '{print $2}'` 但是,并不能看到在哪个终端,创建了谁
4.通过上面的结果可以获取到时间,用户id,与父进程
获取到操作的时间,不过是秒数,需要转换为标准时间
timer=`date -d @$timer +%F-%Hh`
这样就可以得到年-月-日-时h的时间格式了
uid=`ausearch -f /etc/passwd | grep useradd | tail -1 | awk '{print $15}' | awk -F'=' '{print $2}'`
这样可以取出用户ID,然后在通过/etc/passwd将用户id转换为用户名
uname=`awk -F: '$3=='$uid'{print $1}' /etc/passwd`
取出ppid父进程,通过这个父进程可以得到操作者的终端ip地址
ppid=`ausearch -f /etc/passwd | grep useradd | tail -1 | awk '{print $12}' | awk -F'=' '{print $2}'`
addr=`cat /var/log/audit/audit.log |grep "$ppid"| grep hostname | tail -1 | awk '{print $12}'|awk -F'=' '{print $2}'`
然后可以查看/etc/passwd得到该操作者创建了谁
WhoIsCreated=`tail -1 /etc/passwd | awk -F: '{print $1}'`
5.创建一个文件,将刚刚得到的结果追加写入这个文件中
vim /root/users.txt
时间 用户 地点 创建了谁?
echo $timer $uname $addr $WhoIsCreated >> /root/users.txt
6.可以将该结果通过邮件的方式发送给管理员
echo $timer $uname $addr $WhoIsCreated | mail -S "通知" xx@tedu.cn
7.总结:以上操作可以写入脚本配合周期性计划任务自动执行
vim audit_useradd.sh
#!/bin/bash
#comment=`ausearch -f /etc/passwd | grep useradd | tail -1`
timer=`ausearch -f /etc/passwd | grep useradd | tail -1 | awk '{print $2}' | awk -F'[(.)]' '{print $2}'`
timer=`date -d @$timer +%F-%Hh`
uid=`ausearch -f /etc/passwd | grep useradd | tail -1 | awk '{print $15}' | awk -F'=' '{print $2}'`
uname=`awk -F: '$3=='$uid'{print $1}' /etc/passwd`
ppid=`ausearch -f /etc/passwd | grep useradd | tail -1 | awk '{print $12}' | awk -F'=' '{print $2}'`
addr=`cat /var/log/audit/audit.log |grep "$ppid"| grep hostname | tail -1 | awk '{print $12}'|awk -F'=' '{print $2}'`
WhoIsCreated=`tail -1 /etc/passwd | awk -F: '{print $1}'`
echo $timer $uname $addr $WhoIsCreated >> /root/a.txt