需用auditd通过-S指定stat类系统调用并-F path=绝对路径添加规则,如-a always,exit -F arch=b64 -S stat,lstat,fstat -F path=/bin/ls -k binary_stat_ls,保存至/etc/audit/rules.d/后augenrules --load生效。

要记录所有对系统关键二进制文件(如 /bin/ls、/usr/bin/sudo、/sbin/init 等)的 stat() 类系统调用(含 stat、fstat、lstat),需借助 auditd 的系统调用过滤能力,重点监控 stat 相关 syscall,并精确限定目标路径。
确认 auditd 已启用并运行
确保审计子系统已启动:
- 运行
sudo systemctl status auditd检查服务状态;若未运行,执行sudo systemctl enable --now auditd - 验证内核支持:
zcat /proc/config.gz | grep CONFIG_AUDIT(或检查/boot/config-$(uname -r))应含CONFIG_AUDIT=y - 检查审计规则是否持久:规则默认写入
/etc/audit/rules.d/下的.rules文件,由auditctl -R加载
添加针对 stat 系统调用的路径监控规则
auditd 不直接支持“监控某个文件的所有 stat 调用”,但可通过 -S(系统调用)+ -F path= 组合实现。关键点是:必须使用 -F perm=x 或显式指定 -S,且路径需为绝对路径、真实 inode 路径(避免符号链接干扰)。
推荐做法:为每个关键二进制文件单独添加规则,例如:
-a always,exit -F arch=b64 -S stat,statatime,lstat,fstat,fstatat -F path=/bin/ls -F uid!=0 -k binary_stat_ls -a always,exit -F arch=b64 -S stat,statatime,lstat,fstat,fstatat -F path=/usr/bin/sudo -F uid!=0 -k binary_stat_sudo -a always,exit -F arch=b64 -S stat,statatime,lstat,fstat,fstatat -F path=/sbin/init -F uid!=0 -k binary_stat_init
-
-F arch=b64:适配 x86_64 架构(若为 32 位系统改用b32) -
-S ...:覆盖常见 stat 变体(statatime是较新内核中statx的别名,可酌情保留) -
-F uid!=0:排除 root 自身调用(减少噪音;如需完整记录可删掉) -
-k binary_stat_xxx:为每条规则打标签,便于后续ausearch -k过滤
加载规则并验证日志输出
将上述规则保存为 /etc/audit/rules.d/binary-stat.rules,然后重载:
-
sudo augenrules --load(推荐,自动合并所有.rules文件) - 或手动:
sudo auditctl -R /etc/audit/rules.d/binary-stat.rules
触发测试(如 ls -l /bin/ls 或 stat /usr/bin/sudo),再查日志:
sudo ausearch -k binary_stat_ls -i | grep "syscall=stat\|syscall=lstat"- 日志中会显示调用进程(
exe)、PID、UID、时间、参数(如name="/bin/ls")及返回值(res=1表示成功)
注意事项与常见问题
该方案有实际约束,需提前知晓:
-
符号链接限制:若规则中
path=/usr/bin/python3,但实际调用的是/usr/bin/python3.9(通过 symlink),则不会匹配——需对最终目标文件(readlink -f /usr/bin/python3)设规则 -
性能影响:高频 stat(如某些监控工具反复检查)可能显著增加 audit 日志量,建议配合
-F key=...和定期轮转(/etc/audit/auditd.conf中max_log_file、num_logs) -
权限绕过风险:普通用户仍可调用
stat,audit 规则本身不阻止行为,仅记录;如需阻断,需结合 SELinux 或 eBPF(如bpftool+ tracepoint) -
替代方案提示:若需更细粒度(如只记录非 root 对
/usr/bin/sudo的 stat),可在规则中加-F auid>=1000(假设普通用户 auid ≥ 1000)
不复杂但容易忽略:务必用 readlink -f 确认真实路径,且每次更新规则后用 sudo auditctl -l 检查是否生效。











