auditctl -w /bin/rm 无效,因 -w 监控路径 inode 变更而非命令执行;正确方式是用 -a always,exit -F arch=b64 -S execve -F exe=/usr/bin/rm -k cmd_rm 捕获 execve 调用,并写入 .rules 文件后执行 augenrules --load 生效。

auditctl -w /bin/rm 加规则为什么没效果
直接执行 sudo auditctl -w /bin/rm -p xa -k cmd_rm 看似合理,但几乎一定失败——/bin/rm 是个符号链接(多数发行版指向 /usr/bin/rm),而 -w 监控的是**文件路径的 inode 层级变更**,不是执行行为。你删的是文件,不是 rm 二进制本身;这条规则实际监控的是“谁改了 /bin/rm 这个链接”,和命令执行完全无关。
真正要捕获的是「用户调用 rm 命令」这个动作,它由 execve 系统调用触发,必须用 -a always,exit -S execve 规则,并配合路径过滤。
正确写法:用 -F exe=/usr/bin/rm 过滤 execve
Linux 下实际执行的 rm 通常在 /usr/bin/rm(检查可用 which rm 或 readlink -f $(which rm))。监控它的标准方式是:
sudo auditctl -a always,exit -F arch=b64 -S execve -F exe=/usr/bin/rm -k cmd_rm
-
-F arch=b64必须显式指定(x86_64 系统不加就无效) -
-F exe=/usr/bin/rm是关键:匹配execve调用中实际被执行的程序路径 - 如果系统有 32 位兼容需求(如某些容器),再补一条
-F arch=b32规则 - 别用
-F path=/usr/bin/rm—— 它走的是路径查找路径,性能差且可能漏匹配
永久生效必须写进 /etc/audit/rules.d/
auditctl 添加的规则重启即丢。生产环境必须固化到磁盘:
- 创建文件:
sudo vim /etc/audit/rules.d/cmd_rm.rules - 写入规则(注意结尾换行):
-a always,exit -F arch=b64 -S execve -F exe=/usr/bin/rm -k cmd_rm
- 加载:
sudo augenrules --load - 验证:
sudo auditctl -l | grep cmd_rm应该有输出 - 若提示
augenrules: No rules found,说明文件名没以.rules结尾或权限不对(需 root:root,644)
查日志时别直接翻 audit.log
原始日志字段密集难读。查 rm 操作请用 ausearch:
- 查所有 rm 执行记录:
sudo ausearch -m execve -k cmd_rm --raw | aureport -f -i - 只看某用户(如 john)的 rm:
sudo ausearch -m execve -k cmd_rm -ui john --raw | aureport -f -i - 注意:
-k cmd_rm是规则里定义的 key,不是文件名;--raw | aureport -f -i才能还原出可读命令行(含参数) - 如果
ausearch返回空但确认规则已加载,先检查内核是否禁用了 audit(cat /proc/cmdline | grep audit=0)
真正容易被忽略的是:规则里 -F exe= 的路径必须和 which rm 输出完全一致,包括软链接展开后的绝对路径;很多环境 rm 在 /bin/rm,但那是链接,真实路径仍是 /usr/bin/rm。不验证这点,规则就等于没配。


















