Linux文件系统不记录属性变更历史,仅保存当前状态和三个时间戳;stat与lsattr只能显示当前属性及ctime(元数据最后变更时间),无法追溯操作者、命令或旧值;唯有auditd能完整审计chmod、chown、chattr等操作,记录UID、PID、命令路径和精确时间。

Linux本身不记录文件属性的“变更历史”,只保留当前状态和三个时间戳(atime、mtime、ctime)。所谓“属性变更记录”,实际指的是谁在何时改了权限、所有者、扩展属性等——这需要外部机制支撑,不是ls或stat能直接回溯的。
为什么stat和lsattr只能看当前状态,不能查“谁什么时候改的”
stat输出的Change字段(即ctime)确实会随chown、chmod、chattr等操作更新,但它只存一个时间点,不存操作者、命令、旧值;lsattr只显示当前是否带i、a等标志,也不记录变更日志。两者都无审计能力。
-
ctime≠ “创建时间”,而是“元数据最后变更时间”,比如touch -a也会触发它 -
chattr +i /etc/passwd后ctime更新,但你无法从stat里看出是root还是攻击者执行的 - 普通用户运行
lsattr能看到i标志,但没权限知道它哪天被设上
真正能查到“谁在什么时候改了属性”的只有auditd
Linux内核的auditd服务是唯一能持续记录chmod、chown、chattr等系统调用的机制,且包含UID、PID、命令路径、时间戳。
- 先加监控规则:
sudo auditctl -w /etc/passwd -p wa -k passwd_attr(-p wa表示监控写+属性变更) - 查记录:
sudo ausearch -k passwd_attr | aureport -f -i,输出含执行用户、时间、调用命令(如/usr/bin/chmod) - 注意:
auditd默认不启用,需sudo systemctl enable --now auditd,且规则重启后失效,应写入/etc/audit/rules.d/下持久化 - 如果系统没装
auditd,ausearch会报错,此时stat和lsattr真就只能告诉你“现在是什么样”,而非“怎么变成这样的”
find配合stat只能查“改过”,不能查“谁改的”
常用组合如find /etc -type f -ctime -1 -exec stat -c "%n %U %z" {} \;,看似能列出一天内属性变更的文件及用户,但有严重缺陷:
-
%U显示的是文件当前所有者,不是修改操作发起者(比如root改了普通用户文件,%U仍显示原用户) -
%z是ctime,但find -ctime -1精度为24小时整块,无法定位到具体分钟级操作 - 若文件被多次修改,该命令只返回最终状态,无法还原中间过程
- 对
chattr引起的变更,find -ctime能捕获,但依然无法区分是chattr +i还是chattr -i
真正要追溯属性变更源头,auditd是刚需;没它时,stat和lsattr只是快照工具,不是日志工具。别指望ls -l或stat输出里藏着“张三在7月8日14:22执行了chmod 600”这种信息——它根本不存在于文件系统元数据中。











