auditd监控目录属性篡改仅作用于该目录自身inode,不递归子项;-w /etc -p a仅捕获chmod /etc等操作,无法记录chmod /etc/passwd,因后者属独立inode,需单独添加规则如-w /etc/passwd -p a。

auditd 能监控敏感目录的属性篡改,但必须用 -p a 显式指定,且仅作用于目录自身 inode 层级(如 chmod/chown),不递归子项。
为什么 auditctl -w /etc -p a 只记录 chmod /etc,不记录 chmod /etc/passwd
因为 -w 监控的是路径对应的 inode,/etc 是个目录,它的“属性”仅指该目录自身的权限、所有者、时间戳等元数据。子文件(如 /etc/passwd)是独立 inode,需单独加规则或配合其他机制。常见误判是以为 -w /etc -p a 能捕获整个树的 chown 行为——它不能。
- 验证方式:
sudo chmod 755 /etc会触发日志;sudo chmod 644 /etc/passwd不会,除非你额外加了-w /etc/passwd -p a - 若要覆盖关键子项,应显式列出:/etc/shadow、/etc/passwd、/etc/group、/etc/sudoers
- 注意软链接:规则路径必须是真实 inode 路径,
ls -i /etc确认,别写成/etc/尾部斜杠(部分内核版本会忽略)
auditctl -w /root -p a 不生效的几个硬性前提
目录属性监控对运行环境要求更严,缺一不可:
- 必须以 root 执行
auditctl,普通用户调用静默失败 -
auditd必须已启动且enabled为 1:sudo auditctl -s | grep enabled - 路径必须存在且可访问:
sudo ls -ld /root应返回drwx------,若被 SELinux 或ProtectSystem=strict阻断,规则加载时会报错(查ausearch -m CONFIG_CHANGE) - 不要混用
-a和-w:监控路径属性只能用-w,-a always,exit -F path=/root -F perm=a是无效写法
如何让 -p a 规则真正落地并可查
光加规则不够,得确保能定位到是谁、何时、为什么改了目录权限:
- 务必加
-k参数,例如:sudo auditctl -w /etc -p a -k etc_attr_change,否则后续ausearch只能靠grep /etc,极易漏掉或误匹配 - 查日志时用
ausearch -k etc_attr_change -m SYSCALL -i,重点看auid=(登录用户)、comm=(命令名)、exe=(绝对路径)字段 - 永久化必须写进
/etc/audit/rules.d/并重载:echo "-w /etc -p a -k etc_attr_change" | sudo tee /etc/audit/rules.d/10-attr.rules && sudo augenrules --load
- 避免日志爆炸:只监控真正敏感的目录(如
/etc、<code>/root、/var/log),别对/tmp或/home全局启用-p a
真正容易被忽略的是:目录属性变更本身极少单独发生,它往往伴随文件内容修改(-p wa)或进程执行(-p x)。单加 -p a 只能看到“权限变了”,但看不到“谁用什么命令变的”——所以生产环境建议组合使用,比如 -p wa,再靠 comm= 和 exe= 字段反推行为动机。











