audit日志是唯一可信的权限变更凭证,它在内核层捕获chmod/chown等系统调用,记录UID、AUID、exe路径、命令行及精确时间戳;而stat或find仅显示结果快照,无法溯源操作者与上下文。

查权限变更不能只看文件当前状态,得把 audit 日志和文件实际变化对照着看——日志告诉你“谁、何时、用什么命令改的”,文件状态只告诉你“现在是什么样”。两者不一致时,往往意味着操作被绕过、日志丢失,或权限被间接修改(比如通过硬链接、bind mount 或容器挂载)。
audit 日志是唯一可信的操作凭证
Linux 文件系统本身不记录操作者信息。stat 显示的 ctime 或 mtime 是时间戳快照,可被 touch 伪造、被内核行为(如 remount、fsck)刷新,无法区分是管理员 chmod 还是某个脚本自动执行。只有 auditd 在内核系统调用层捕获 chown、chmod、setxattr 等动作,附带 UID、AUID、exe 路径、命令行参数和精确时间戳,且 root 也无法绕过。
- 规则示例:监控 /etc/shadow 属主变更 —— sudo auditctl -a always,exit -F arch=b64 -S chown,fchown,fchownat -F path=/etc/shadow -k shadow_owner_change
- 查日志必须用 ausearch + aureport 组合:sudo ausearch -k shadow_owner_change | aureport -f -i,才能看到真实用户(auid)、命令(comm)、路径(name)
- 仅靠 grep /var/log/secure 或 find -cmin -60 会漏掉:直接 root 执行、systemd service 内部调用、容器内进程、以及未走 sudo 的提权场景
文件变更状态只是结果,不是证据
ls -l、stat 或 find -path "/etc" -cmin -30 这类命令只能回答“哪些文件变了”,但无法说明“为什么变”或“是否合法”。例如:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 一个 cron job 每小时运行 chown -R root:root /opt/app,stat 看到 /opt/app 的属主在整点更新,但你不知道它是否该运行、是否被篡改
- 某人用 cp --attributes-only 替换配置文件,mtime 不变但权限已改 —— find -mmin 失效,只有 audit -p a(attribute change)能捕获
- /etc/passwd 被硬链接到 /tmp/.passwd 并在别处修改,原文件 inode 不变,ctime 却更新 —— 这种间接变更,audit 仍能通过路径规则(-w /etc/passwd)精准定位
对比时要关注三个关键一致性
做审计比对,不是简单“日志里有没这条记录”,而是验证三重一致性:
- 时间一致性:audit 日志中的 time 字段(如 msg=audit(1720394820.123:456))应与 stat /path/to/file 输出的 Change 时间基本吻合(允许秒级偏差)
- 主体一致性:auid(原始登录用户)应与实际运维排班、SSH 登录记录(last /var/log/wtmp)、或 sudo 日志中对应时段的操作者匹配
- 行为一致性:comm 字段(如 "chown")和 exe 路径(如 "/usr/bin/chown")需符合预期操作方式;若出现 /usr/local/bin/malware 或 unknown,就是异常信号
常见不一致场景及应对
当 audit 日志“查无记录”,但文件权限明显异常,说明审计链断裂,需逐层排查:
- auditd 服务未运行或规则未加载:运行 sudo systemctl status auditd 和 sudo auditctl -l 确认
- 规则未覆盖目标路径:-w 只监控精确路径,/etc/ssh/sshd_config 被改,但规则只写了 /etc/ssh —— 需加 -w /etc/ssh/sshd_config 或启用 -r 递归(注意性能)
- 内核架构不匹配:x86_64 系统用了 -F arch=b32 规则,会导致 64 位 chmod 不被捕获 —— 必须用 -F arch=b64 配合 -S chmod,chown
- 日志轮转或磁盘满导致丢日志:检查 sudo cat /etc/audit/auditd.conf | grep -E "(max_log_file|max_log_file_action)",确认是否设为 rotate 而非 ignore

















