runsisi's

technical notes

使用 audit 定位文件访问进程

2019-03-16 runsisi#linux

有时可能会存在需要定位是哪个进程访问了文件的需求,使用 audit 可以实现该需求。

~# rpm -ql audit
...
/etc/audit/audit.rules
/etc/audit/auditd.conf
/etc/audit/rules.d
/etc/audit/rules.d/audit.rules
/sbin/audispd
/sbin/auditctl
/sbin/auditd
/sbin/augenrules
/sbin/aureport
/sbin/ausearch
/sbin/autrace
/usr/bin/aulast
/usr/bin/aulastlog
/usr/bin/ausyscall
/usr/bin/auvirt
/usr/lib/systemd/system/auditd.service
...

auditctl 命令行工具用于审计规则的查看、创建、删除等。

规则由 -C, -F, -S 三个选项定义:

  1. -C 用于如下两组字段内部的相互比较(= / !=):
auid, uid, euid, suid, fsuid, obj_uid;
gid, egid, sgid, fsgid, obj_gid;
  1. -F 用于指定字段与具体的值进行比较(支持的字段可参考 auditctl 手册页);
  2. -S 用于指定系统调用[1];

需要注意的是,通过 -S 指定系统调用还需要通过 -F 指定系统架构。

auditctl 使用

查看当前所有的规则

~# auditctl -l
No rules

追加规则

~# auditctl -a always,exit -F arch=b64 -S mount -k mount
~# auditctl -l
-a always,exit -F arch=b64 -S mount -F key=mount

在最前的位置插入规则

~# auditctl -A always,exit -F path=/dev/sdb1 -F perm=r -k sdb
~# auditctl -l
-w /dev/sdb1 -p r -k sdb
-w /dev/sdc1 -p r -k sdc

如果需要添加固化的规则(即重启也)也可以直接在配置文件夹 /etc/audit/rules.d/ 中进行添加配置文件

~# vi /etc/audit/rules.d/xxx.rules
-a always,exit -F arch=b64 -S mount -k mount

然后加载配置的规则

~# auditctl -R /etc/audit/rules.d/xxx.rules

需要注意的是 auditctl -R 逐行处理规则,如果存在重复的规则会直接报错退出。

删除规则

~# auditctl -d always,exit -S mount -F key=mount

根据关键词查找审计日志(/var/log/audit/audit.log,同时也是 selinux 的日志)

~# ausearch -k mount
----
time->Fri Mar 15 10:51:18 2019
type=CONFIG_CHANGE msg=audit(1552618278.813:18875): auid=0 ses=2504 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 op=add_rule key="mount" list=4 res=1
----
time->Fri Mar 15 10:51:34 2019
type=CONFIG_CHANGE msg=audit(1552618294.184:18876): auid=0 ses=2504 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 op=add_rule key="mount" list=4 res=1
----
...

根据审计日志生成简洁的报告

# ausearch -k mount | aureport -f -i

File Report
===============================================
# date time file syscall success exe auid event
===============================================
1. 03/15/2019 10:53:06 /dev/sdc1 mount no /usr/bin/mount root 18879
2. 03/15/2019 10:53:06 /dev/sdc1 mount no /usr/bin/mount root 18878
3. 03/15/2019 10:53:06 /dev/sdc1 mount no /usr/bin/mount root 18880
4. 03/15/2019 10:53:06 /dev/sdc1 mount no /usr/bin/mount root 18881
5. 03/15/2019 10:53:06 /media mount no /usr/bin/mount root 18882
6. 03/15/2019 10:53:06 /dev/sdc1 mount no /usr/bin/mount root 18883
7. 03/15/2019 10:53:06 /dev/sdc1 mount no /usr/bin/mount root 18884
8. 03/15/2019 10:53:06 /dev/sdc1 mount no /usr/bin/mount root 18885
9. 03/15/2019 10:53:06 /dev/sdc1 mount no /usr/bin/mount root 18886
10. 03/15/2019 10:53:06 /dev/sdc1 mount no /usr/bin/mount root 18887
11. 03/15/2019 10:53:06 /dev/sdc1 mount no /usr/bin/mount root 18888
12. 03/15/2019 10:53:06 /media mount no /usr/bin/mount root 18889
13. 03/15/2019 10:53:06 /media mount no /usr/bin/mount root 18890
14. 03/15/2019 10:55:07 /dev/sdc1 mount yes /usr/bin/mount root 18891

删除所有规则

# auditctl -D
No rules

使用 auditctl 时,不建议使用 -w, -p 选项,而应该直接使用 -F path=/path/to/file -F perm=rwx-F dir=/path/to/dir -F perm=rwx 代替

~# auditctl -a always,exit -F path=/dev/sdc1 -F perm=r -k sdc

参考资料

[1] syscalls - Linux system calls

http://man7.org/linux/man-pages/man2/syscalls.2.html