监控敏感文件权限变更需用 auditd 的 -p a 规则捕获 chmod/chown 等属性修改,绑定真实 inode 路径,结合 auid 和 comm 定位操作者与命令,并通过脚本或 audispd 实现告警。

监控敏感文件权限变更,关键不是盯住“文件被读了没”,而是精准捕获 chmod、chown、chgrp 这类改变文件属性的操作。auditd 必须用 -p a(attribute)规则,搭配 auid 和 comm 字段,才能锁定真实操作者和命令。
只用 -p a,别加 r 或 w
权限变更属于文件属性(attribute)修改,对应内核系统调用是 chmod、chown 等,不是读写行为:
-
-p a覆盖所有属主、属组、权限位、SELinux 上下文等变更 -
-p wa会混入写入事件(比如覆盖写入/etc/shadow),导致日志噪音大、排查困难 -
-p r完全没必要——读取权限本身不构成篡改风险,且高频触发(如getpwent调用)
路径必须真实存在且匹配 inode
auditd 的 -w 规则绑定的是文件 inode,不是路径字符串:
- 先运行
ls -i /etc/shadow,确认路径是真实文件,不是软链接(如/etc/shadow-) - 规则中路径必须与
ls -i输出完全一致,大小写、末尾斜杠、空格都不能错 - 如果目标是
/root/.ssh/authorized_keys,要确保/root/.ssh目录存在且权限为700
用 auid 和 comm 定位真实操作人
UID 可能被切换(如 sudo),但原始登录用户 ID(auid)不会变:
-
ausearch -k shadow_attr_change -m SYSCALL -i | grep "auid="显示谁最初登录并触发了操作 -
ausearch -k shadow_attr_change -m SYSCALL -i | grep "comm="显示执行的命令,如comm="chmod"或comm="ansible" - 若只关心非 root 操作,可在规则里加
-F auid!=0,提前过滤掉管理员日常维护
告警靠脚本,不是 auditd 自带
auditd 记录事件,但不发通知。轻量级实时告警可这样实现:
- 写一个每 5 秒轮询的脚本:
ausearch -k shadow_attr_change --start recent -i | grep "auid=" - 发现新条目就用
logger写入 syslog,或调用mail发邮件 - 生产环境建议用
audispd插件,把匹配事件转发给 Python 脚本,自动提取auid、comm、exe并推送企业微信/钉钉


















