配置auditd规则来监控SYSCALL
让我们创建一个规则来监视“kill” SYSCALL,它可用于查找所有被杀死的进程。
1.将以下规则添加到auditd规则配置文件/etc/audit/rules.d/audit.rules:
# vi /etc/audit/rules.d/audit.rules -a exit,always -F arch=b64 -S kill -k kill_rule
其中:
-a exit,always 在这里,我们有动作和列表。
每当操作系统退出系统调用时,退出列表将用于确定是否需要生成审计事件。
-F arch=b64 -F 选项用于构建规则字段。
b64 表示计算机使用 x86_64 CPU 运行。
(无论是 Intel 还是 AMD 都无所谓。
)
-S kill -S 选项指定我们要监视的系统调用。
-k 这是用户定义的规则名称。
注意:“arch”是系统调用的 CPU 架构。
如果系统是 32 位操作系统,则需要设置“arch=b32”。
- 重启auditd服务使新规则生效。
# service restart auditd
- 我们可以使用“auditctl -l”命令验证定义的规则是否处于活动状态。
# auditctl -l -a always,exit -F arch=b64 -S kill -F key=kill_rule
检查确认
让我们看一个例子,我们刚刚创建的规则是否真的有效。
我们将简单地启动一个“sleep 500”进程并杀死它。
这应该生成一个审计日志,其中包含所有详细信息,例如谁用什么程序/命令杀死了进程(uid)等。
- 在后台生成一个简单的睡眠进程。
# sleep 600 &
- 检查sleep进程的进程ID并杀死它。
# ps -ef | grep sleep root 2089 1784 0 15:12 pts/0 00:00:00 sleep 600
# kill -9 2089
- 检查审计日志文件 /var/log/audit/audit.log 以获取终止审计日志。
日志应类似于下图所示。
# tail -f /var/log/audit/audit.log type=SYSCALL msg=audit(1529507591.700:304): arch=c000003e syscall=62 success=yes exit=0 a0=829 a1=9 a2=0 a3=829 items=0 ppid=1783 pid=1784 auid=1001 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/usr/bin/bash" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="kill_rule" type=OBJ_PID msg=audit(1529507591.700:304): opid=2089 oauid=1001 ouid=0 oses=1 obj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 ocomm="sleep" type=PROCTITLE msg=audit(1529507591.700:304): proctitle="-bash"
- 有时审计日志可能很难找到我们感兴趣的日志。
在这种情况下,我们也可以使用“ausearch”命令,并使用规则定义的键。
例如:
# ausearch -k kill_rule ... time->Wed Jun 20 15:13:11 2018 type=PROCTITLE msg=audit(1529507591.700:304): proctitle="-bash" type=OBJ_PID msg=audit(1529507591.700:304): opid=2089 oauid=1001 ouid=0 oses=1 obj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 ocomm="sleep" type=SYSCALL msg=audit(1529507591.700:304): arch=c000003e syscall=62 success=yes exit=0 a0=829 a1=9 a2=0 a3=829 items=0 ppid=1783 pid=1784 auid=1001 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/usr/bin/bash" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="kill_rule"
每当用户执行请求 Linux 内核提供服务的命令时,就会发生 SYSCALL。
有几个 SYSCALL,如 mount、umount、kill、open 等。
这些 SYSCALL 可以用 auditd 系统进行监控。
我们以“杀死”SYSCALL 为例。
用户想要捕获谁杀死了系统上的某个进程。
这可以通过编写一个审计规则来轻松实现,该规则可以在调用时捕获 SYSCALL 终止。
安装和配置auditd
auditd 主要预装在 Linux 发行版上。
如果它不可用,我们可以使用相应的操作系统包管理器来安装它。
例如,在 CentOS/RHEL 的情况下:
# yum install auditd
启用 auditd 服务以在启动时启动并使用“service”命令启动它。
# systemctl enable auditd # service start auditd