应监控rename系统调用和/etc/目录下可写openat行为,因/etc/passwd修改采用“写临时文件+原子重命名”方式;仅-w /etc/passwd -p wa无法捕获临时文件写入与重命名过程。

直接监控 /etc/passwd 的原子性写入行为,关键不是盯住文件本身,而是捕获“替换文件”这一动作背后的真实系统调用序列。因为现代工具(如 usermod、vipw 或编辑器)修改该文件时,几乎都采用“写临时文件 + 原子重命名”方式——即先创建 /etc/passwd.XXXXXX,写入新内容,再用 rename() 系统调用把临时文件覆盖原文件。auditd 无法直接审计“原子覆盖”,但能精准捕获 rename 和关键写入行为。
为什么只加 -w /etc/passwd -p wa 不够?
单纯用 auditctl -w /etc/passwd -p wa 只能捕获对已有文件的直接写(write)或属性变更(chmod/chown),而绕过原子写入的临时文件环节。实际修改中,原文件可能根本没被 write 过,日志里就查不到有效记录。
真正有效的审计路径:监控 rename + 临时文件写入
需组合两条规则,覆盖整个原子写流程:
-
捕获覆盖动作本身:
-a always,exit -F arch=b64 -S rename -F path=/etc/passwd -k passwd_atomic
这条规则监听所有试图将某个文件rename成/etc/passwd的系统调用,无论源文件名是什么。这是识别“最终落地”的最可靠信号。 -
捕获临时文件写入内容:
-a always,exit -F arch=b64 -S openat -F path=/etc/ -F perm=w -k passwd_temp_write
它不锁定具体文件名,而是监控对/etc/目录下任意文件的可写打开行为(openatwithO_WRONLYorO_RDWR)。配合-k标签,后续可用ausearch -k passwd_temp_write查到谁在往/etc/下写新内容。
如何部署并验证
把上面两条规则写入永久配置文件:
sudo tee /etc/audit/rules.d/10-passwd-atomic.rules ## Monitor atomic replacement of /etc/passwd<br>-a always,exit -F arch=b64 -S rename -F path=/etc/passwd -k passwd_atomic<br>-a always,exit -F arch=b64 -S openat -F path=/etc/ -F perm=w -k passwd_temp_write<br>EOF
然后加载生效:
sudo augenrules --load-
sudo systemctl restart auditd(RHEL 8+/CentOS 8+)或sudo service auditd reload(CentOS 7)
验证是否加载成功:sudo auditctl -l | grep -E "(passwd_atomic|passwd_temp_write)"
触发测试(例如运行 sudo useradd testuser),再执行:sudo ausearch -k passwd_atomic -i | head -20sudo ausearch -k passwd_temp_write -i | head -20
你会看到清晰的 rename 记录和对应的 openat 写入路径(如 /etc/passwd.12345),从而完整还原原子写入链。
补充说明:避免漏掉 32 位兼容调用
若系统运行 32 位程序(如某些旧版管理工具),还需补一条 32 位规则:
-a always,exit -F arch=b32 -S rename -F path=/etc/passwd -k passwd_atomic-a always,exit -F arch=b32 -S openat -F path=/etc/ -F perm=w -k passwd_temp_write
这样能确保混合架构环境下的全覆盖。不复杂但容易忽略。











