auditd是唯一能精准回溯文件属主变更的方案,它通过捕获内核级chown、fchownat等系统调用,记录uid、进程名、命令行及时间戳等完整上下文,而其他方法如grep日志、find或inotifywait均存在漏报、无法区分操作类型或无持久日志等严重缺陷。

auditd 是唯一能精准回溯属主变更的方案
只有 auditd 能捕获内核层面的 `chown`、`fchownat` 等系统调用,并附带 UID、进程名、命令行、时间戳等完整上下文。其他方法如日志 grep 或 `find -cmin` 都存在严重局限:
- grep /var/log/secure:只记录部分 sudo 或 ssh 会话中的命令输入,漏掉直接 root 执行、脚本调用、systemd service 启动时的 chown;
- find -cmin -1440:只能查出 inode 元数据(含属主)在过去 24 小时内被改过,但无法区分是 chmod、chown 还是 setfacl 导致,更不知道是谁执行的;
- inotifywait:仅监听实时事件,不存日志,进程退出即失效,且无法识别属主变更(需 `-e attrib`,但不记录用户和命令)。
快速配置 auditd 监控属主变更
以监控 `/etc/shadow` 的属主变动为例,分三步操作:
- 添加临时规则(立即生效,重启后丢失):
sudo auditctl -a always,exit -F arch=b64 -S chown,fchown,fchownat -F path=/etc/shadow -k shadow_owner_change - 若要长期生效,写入永久规则文件:
echo '-a always,exit -F arch=b64 -S chown,fchown,fchownat -F path=/etc/shadow -k shadow_owner_change' | sudo tee /etc/audit/rules.d/shadow.rules
然后加载:sudo augenrules --load - 确认规则已加载:
sudo auditctl -l | grep shadow
检索并解读属主变更记录
执行变更后,用以下命令查日志:
- 查最近 24 小时内所有匹配关键字的事件:
sudo ausearch -k shadow_owner_change --start today -i - 关键字段说明:
• comm="chown":触发命令名
• exe="/usr/bin/chown":实际执行程序路径
• uid=1001:操作用户 ID
• auid=1001:原始登录用户的审计 UID(防 sudo 伪装)
• name="/etc/shadow":被修改的目标路径
排查非 auditd 场景下的异常属主变更
如果 auditd 未启用或规则未覆盖,可结合以下线索缩小范围:
- 检查 cron 中是否含定时 chown:
sudo crontab -l; for u in $(cut -f1 -d: /etc/passwd); do sudo crontab -u $u -l 2>/dev/null | grep -i chown; done - 查 systemd timer 或 service 是否调用 chown:
systemctl list-timers --all | grep -i chown; systemctl cat *.service 2>/dev/null | grep -A2 -B2 chown - 确认 SELinux 是否触发 restorecon 自动重设:
sestatus -b | grep restore; sudo restorecon -v /path/to/file - 用 stat 查 ctime 是否突变:
stat -c "%n → ctime: %z" /path/to/file,若时间接近当前,说明近期有元数据变更,但需进一步确认类型。











