auditd 监控进程被 kill

最近某业务进程多次无缘无故被 kill,但查看系统日志和业务日志都没有发现线索,所以使用 auditd 来进行进程行为审计监控。

一般来说,审计 kill signal 可以进行如下配置:修改 /etc/audit/audit.rules 文件,添加:

-a exit,always -F arch=b64 -S kill -k kill_signals

然后重启 auditd 服务即可。

使用

ausearch -k kill_signals  

即可搜索到相关日志,如下例子:

time->Wed Jun  6 13:34:38 2018  
type=OBJ_PID msg=audit(1528263278.081:68648): opid=12287 oauid=0 ouid=0 oses=16525 ocomm="sleep"  
type=SYSCALL msg=audit(1528263278.081:68648): arch=c000003e syscall=62 success=yes exit=0 a0=2fff a1=f a2=f a3=7fffc2cbcac0 items=0 ppid=12391 pid=12392 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=16525 comm="kill" exe="/bin/kill" key="kill_signals"  

例子是一个 sleep 进程被 kill 的记录。

从上面的记录可以看出,sleep 进程是被 ses=16525、PID 为 12392 的 /bin/kill 命令所 kill 了。

但是这种级别的信息往往并没有找到真正的幕后黑手,比如是什么脚本使用了 kill 命令?

PPID 是个好线索,但是系统上并不会实时记录所有出现过的进程,所以我们需要另外一个配置来记录执行过的进程:

在 /etc/audit/audit.rules 再添加一条规则:

-a exit,always -F arch=b64 -S execve -k exe_cmd

当再次发生 kill 事件时,可以通过

ausearch -k exe_cmd  

可以看到

----
time->Wed Jun  6 13:34:38 2018  
type=PATH msg=audit(1528263278.060:68643): item=1 name=(null) inode=266642 dev=08:02 mode=0100755 ouid=0 ogid=0 rdev=00:00  
type=PATH msg=audit(1528263278.060:68643): item=0 name="/bin/ps" inode=260794 dev=08:02 mode=0100755 ouid=0 ogid=0 rdev=00:00  
type=CWD msg=audit(1528263278.060:68643):  cwd="/root"  
type=EXECVE msg=audit(1528263278.060:68643): argc=2 a0="ps" a1="-ef"  
type=SYSCALL msg=audit(1528263278.060:68643): arch=c000003e syscall=59 success=yes exit=0 a0=819ad0 a1=819a50 a2=819150 a3=7fff86e39e10 items=2 ppid=12387 pid=12388 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=16525 comm="ps" exe="/bin/ps" key="exe_cmd"  
----
time->Wed Jun  6 13:34:38 2018  
type=PATH msg=audit(1528263278.061:68644): item=1 name=(null) inode=266642 dev=08:02 mode=0100755 ouid=0 ogid=0 rdev=00:00  
type=PATH msg=audit(1528263278.061:68644): item=0 name="/bin/grep" inode=260749 dev=08:02 mode=0100755 ouid=0 ogid=0 rdev=00:00  
type=CWD msg=audit(1528263278.061:68644):  cwd="/root"  
type=EXECVE msg=audit(1528263278.061:68644): argc=2 a0="/bin/grep" a1="[s]leep"  
type=SYSCALL msg=audit(1528263278.061:68644): arch=c000003e syscall=59 success=yes exit=0 a0=819ab0 a1=819440 a2=819150 a3=7fff86e39e10 items=2 ppid=12387 pid=12389 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=16525 comm="grep" exe="/bin/grep" key="exe_cmd"  
----
time->Wed Jun  6 13:34:38 2018  
type=PATH msg=audit(1528263278.061:68645): item=1 name=(null) inode=266642 dev=08:02 mode=0100755 ouid=0 ogid=0 rdev=00:00  
type=PATH msg=audit(1528263278.061:68645): item=0 name="/bin/awk" inode=260717 dev=08:02 mode=0100755 ouid=0 ogid=0 rdev=00:00  
type=CWD msg=audit(1528263278.061:68645):  cwd="/root"  
type=EXECVE msg=audit(1528263278.061:68645): argc=2 a0="awk" a1=7B7072696E742024327D  
type=SYSCALL msg=audit(1528263278.061:68645): arch=c000003e syscall=59 success=yes exit=0 a0=819b90 a1=81bda0 a2=819150 a3=7fff86e39e10 items=2 ppid=12387 pid=12390 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=16525 comm="awk" exe="/bin/gawk" key="exe_cmd"  
----
time->Wed Jun  6 13:34:38 2018  
type=PATH msg=audit(1528263278.061:68646): item=1 name=(null) inode=266642 dev=08:02 mode=0100755 ouid=0 ogid=0 rdev=00:00  
type=PATH msg=audit(1528263278.061:68646): item=0 name="/usr/bin/xargs" inode=393019 dev=08:02 mode=0100755 ouid=0 ogid=0 rdev=00:00  
type=CWD msg=audit(1528263278.061:68646):  cwd="/root"  
type=EXECVE msg=audit(1528263278.061:68646): argc=3 a0="xargs" a1="-r" a2="/bin/kill"  
type=SYSCALL msg=audit(1528263278.061:68646): arch=c000003e syscall=59 success=yes exit=0 a0=819c30 a1=81a270 a2=819150 a3=7fff86e39e10 items=2 ppid=12387 pid=12391 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=16525 comm="xargs" exe="/usr/bin/xargs" key="exe_cmd"  
----
time->Wed Jun  6 13:34:38 2018  
type=PATH msg=audit(1528263278.057:68642): item=1 name=(null) inode=266642 dev=08:02 mode=0100755 ouid=0 ogid=0 rdev=00:00  
type=PATH msg=audit(1528263278.057:68642): item=0 name="/bin/bash" inode=260616 dev=08:02 mode=0100755 ouid=0 ogid=0 rdev=00:00  
type=CWD msg=audit(1528263278.057:68642):  cwd="/root"  
type=EXECVE msg=audit(1528263278.057:68642): argc=2 a0="bash" a1="b.sh"  
type=SYSCALL msg=audit(1528263278.057:68642): arch=c000003e syscall=59 success=yes exit=0 a0=961630 a1=961980 a2=984890 a3=7fff8b19d190 items=2 ppid=12091 pid=12387 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=16525 comm="bash" exe="/bin/bash" key="exe_cmd"  
----
time->Wed Jun  6 13:34:38 2018  
type=PATH msg=audit(1528263278.081:68647): item=1 name=(null) inode=266642 dev=08:02 mode=0100755 ouid=0 ogid=0 rdev=00:00  
type=PATH msg=audit(1528263278.081:68647): item=0 name="/bin/kill" inode=261067 dev=08:02 mode=0100755 ouid=0 ogid=0 rdev=00:00  
type=CWD msg=audit(1528263278.081:68647):  cwd="/root"  
type=EXECVE msg=audit(1528263278.081:68647): argc=2 a0="/bin/kill" a1="12287"  
type=SYSCALL msg=audit(1528263278.081:68647): arch=c000003e syscall=59 success=yes exit=0 a0=7fd51221a010 a1=783f80 a2=7fffb8eceb08 a3=7fffb8ece690 items=2 ppid=12391 pid=12392 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=16525 comm="kill" exe="/bin/kill" key="exe_cmd"  
----

注意到这些进程的 ses 都是 16525。

(The ses field records the session ID of the session from which the analyzed process was invoked.)

从上面的信息就可清楚地看到是一个 b.sh 脚本所执行的操作:

ps -> grep -> awk -> kill

事实上该脚本的内容为

ps -ef | /bin/grep [s]leep | awk '{print $2}' | xargs -r /bin/kill  

以上。

PS: 需要注意的是 auditd execve 会产生相当多的日志,请自行取舍。