Linux 文件篡改审计(auditctl 实战指南)
在服务器安全中,仅仅"禁止修改文件"(例如 chattr +i)是不够的。
更重要的是:
当文件被修改时,能够知道是谁(进程 / 用户)在什么时候改了什么文件。
本文介绍如何使用 Linux 内核审计工具
👉 auditd
实现文件篡改监控。
一、核心命令
基础规则(推荐写法)
auditctl -a always,exit -F arch=b64 -F dir=/demo -F perm=wa -k filewatch
参数说明
-a always,exit → 在系统调用结束时记录日志
-F arch=b64 → 64位系统调用(必须加,否则性能差且可能漏日志)
-F dir=/demo → 监控目录(递归)
-F perm=wa → 监控 写(write) + 属性(attribute)
-k filewatch → 日志标签
二、效果演示
1)创建测试文件
mkdir /demo
echo "hello" > /demo/test.txt
2)修改文件
echo "hack" >> /demo/test.txt
3)查看审计日志
ausearch -k filewatch -i
4)示例输出(精简版)
type=SYSCALL ... syscall=openat ... comm=bash exe=/usr/bin/bash
type=PATH ... name=/demo/test.txt
日志含义
comm=bash → 执行修改的进程
exe=/usr/bin/bash → 程序路径
name=/demo/test.txt → 被修改的文件
如果出现:
O_RDWR|O_CREAT|O_TRUNC
说明:
👉 文件被打开并且清空后重写
三、查看规则
auditctl -l
示例:
-a always,exit -F arch=b64 -F dir=/demo -F perm=wa -F key=filewatch
四、删除规则
删除单条规则(旧写法)
auditctl -W /demo -p wa -k filewatch
清空所有规则(慎用)
auditctl -D
五、进阶用法
1)捕获更多修改行为
auditctl -a always,exit -F arch=b64
-S open,openat,rename,unlink,truncate
-F dir=/demo
-k filewatch_detail
可监控:
文件写入
重命名
删除
覆盖
2)只关注写操作
auditctl -a always,exit -F arch=b64
-S open,openat
-F dir=/demo
-k filewatch_open
重点看 flags:
O_WRONLY
O_RDWR
O_TRUNC
O_CREAT
3)只监控某个进程(推荐)
例如只监控 PHP:
auditctl -a always,exit -F arch=b64
-S open,openat
-F exe=/usr/sbin/php-fpm
-k php_write
六、查看日志(常用命令)
ausearch -k filewatch -i
查看最近:
ausearch -k filewatch -ts recent -i
查看今天:
ausearch -k filewatch -ts today -i
七、性能建议
⚠️ 审计是同步记录,规则不当会影响性能
建议:
❌ 不要监控整个系统
❌ 不要监控高频写目录
✅ 只监控核心代码目录
✅ 使用 key 分类日志
八、安全能力总结
能力 支持
记录谁改文件 ✅
记录进程路径 ✅
记录具体文件 ✅
阻止修改 ❌
九、防篡改最佳实践
- chattr +i → 防止关键文件被改
- auditd → 记录谁改
- AIDE → 定期完整性检测
- 日志远程备份 → 防止被删除