在CentOS系统中,使用auditctl添加文件修改监控规则,核心命令就是通过auditctl工具对指定文件或目录设置监控策略,一旦有写入、属性变更、删除等操作,系统就会记录详细的审计日志。最常用的做法是针对关键配置文件和系统目录添加-w参数的监控规则,比如监控/etc/passwd、/etc/shadow、/etc/crontab等文件的变动,命令格式为:auditctl -w /etc/passwd -p wa -k passwd_change。这条规则的意思是监控/etc/passwd文件的写入(w)和属性变更(a)操作,并给这条规则打上"passwd_change"的标签方便后续检索。
很多运维人员在做安全合规检查时,都会被要求开启文件完整性监控。CentOS 7和CentOS 8都内置了audit子系统,这是Linux内核层面的审计框架,比单纯用inotify或者第三方工具更底层、更可靠。下面我从原理、实操、持久化、日志分析几个维度把这件事讲透。
一、audit子系统的工作原理Linux audit子系统由三部分组成:内核审计框架(kernel audit framework)、用户空间守护进程auditd、以及管理工具auditctl。当你用auditctl添加一条规则时,这条规则会被传递到内核层,内核会在对应的系统调用路径上挂载钩子。一旦有进程触发了被监控的系统调用(比如open、write、unlink等),内核就会生成一条审计记录,交给auditd守护进程写入/var/log/audit/audit.log。
这里有个关键点:audit监控的是系统调用级别的操作,不是文件内容的变化。也就是说,它记录的是"谁、在什么时间、对哪个文件、做了什么操作",而不是文件内容从A变成了B。如果你需要对比文件内容差异,还需要配合其他工具,但对于安全审计来说,知道"谁改了什么"已经足够核心。
二、auditctl添加文件监控规则的具体命令先说最基础的命令格式。auditctl的-w参数用于指定要监控的文件或目录,-p参数用于指定要监控的操作权限,常见的权限标识如下:
r - 读取(read) w - 写入(write) x - 执行(execute) a - 属性变更(attribute change)
多个权限可以组合使用,比如-p wa表示同时监控写入和属性变更。另外还有几个重要参数:-k用于给规则打标签(key),方便用ausearch或aureport检索;-S用于指定系统调用名称(比如open、unlink)。
下面是几个实战中最常用的规则示例:
# 监控/etc/passwd文件的写入和属性变更 auditctl -w /etc/passwd -p wa -k passwd_mod # 监控/etc/shadow文件的所有操作 auditctl -w /etc/shadow -p rwxa -k shadow_mod # 监控/etc/crontab定时任务文件的变更 auditctl -w /etc/crontab -p wa -k crontab_mod # 监控整个/etc目录下所有文件的写入和属性变更 auditctl -w /etc/ -p wa -k etc_mod # 监控/var/log目录下所有文件的写入操作 auditctl -w /var/log/ -p w -k log_mod # 监控某个用户家目录下的文件删除操作(针对unlink系统调用) auditctl -w /home/ -p x -S unlink -k home_del
特别注意:如果你用-w监控的是一个目录,那么该目录下所有文件都会被监控,但不会递归到子目录。如果需要递归监控,需要对每个子目录单独添加规则,或者使用-w /path/ -p r(监控读取)配合其他参数。
三、规则持久化——重启不丢失直接用auditctl添加的规则是临时的,系统重启后就会消失。要让规则持久化,需要把规则写入配置文件。CentOS 7和CentOS 8的配置文件路径都是/etc/audit/rules.d/audit.rules。
# 编辑规则文件 vi /etc/audit/rules.d/audit.rules # 在文件末尾添加规则,格式和auditctl命令一样(去掉auditctl关键字) -w /etc/passwd -p wa -k passwd_mod -w /etc/shadow -p rwxa -k shadow_mod -w /etc/crontab -p wa -k crontab_mod -w /etc/ -p wa -k etc_mod -w /var/log/ -p w -k log_mod
写完之后需要重启auditd服务让规则生效:
# CentOS 7 systemctl restart auditd # CentOS 8 systemctl restart auditd
验证规则是否加载成功,可以用以下命令:
# 查看当前所有生效的规则 auditctl -l # 查看规则文件内容 cat /etc/audit/rules.d/audit.rules四、审计日志的查看和分析
规则加好了,接下来就是看日志。所有审计记录都存放在/var/log/audit/audit.log中。直接用cat或less看这个文件会很痛苦,因为格式是机器可读的,需要用专门的工具解析。
最常用的查询工具是ausearch,它可以按关键字、时间范围、用户、文件路径等条件过滤:
# 按关键字检索(对应-k参数) ausearch -k passwd_mod # 按时间范围检索(今天的记录) ausearch -ts today # 按用户检索(比如监控root用户的操作) ausearch -u root # 按文件路径检索 ausearch -f /etc/passwd # 组合条件:今天root用户对/etc/passwd的操作 ausearch -ts today -u root -f /etc/passwd
另一个实用工具是aureport,它可以生成统计报告:
# 生成今天的审计事件摘要 aureport --summary # 按用户统计事件数量 aureport -u # 按事件类型统计 aureport -e # 按文件统计被访问最多的文件 aureport -f
如果你需要把日志转成人类可读的格式,可以用ausearch配合-i参数:
ausearch -k passwd_mod -i
输出会类似这样:
type=SYSCALL msg=audit(1700000000.123:456): arch=c000003e syscall=2 success=yes exit=3 a0=... type=PATH msg=audit(1700000000.123:456): item=0 name="/etc/passwd" inode=12345 dev=... type=CWD msg=audit(1700000000.123:456): cwd="/root" type=SYSCALL msg=audit(1700000000.123:456): arch=c000003e syscall=88 success=yes exit=0 a0=...五、实战中的高级技巧和注意事项
第一,监控范围不要太大。如果你对整个/目录都加-w规则,系统性能会明显下降,因为每个文件操作都要触发内核钩子。建议只监控关键路径:/etc、/usr/bin、/usr/sbin、/var/log、/home下的敏感目录等。
第二,配合exclude规则排除噪音。如果某个目录下有大量临时文件变动,可以用-a exclude排除:
# 先添加排除规则(排除/var/log/audit自身的日志写入) auditctl -a never,exclude -F dir=/var/log/audit
第三,注意audit日志本身也会增长很快。建议配置logrotate对/var/log/audit/audit.log做轮转,否则磁盘会被撑满。CentOS默认已经配置了logrotate,但你可以检查一下/etc/logrotate.d/audit是否存在且配置合理。
第四,如果你需要监控特定用户的操作,可以在规则中加-F uid=1000这样的过滤条件,只记录指定UID用户的操作:
auditctl -w /etc/passwd -p wa -F uid=0 -k passwd_root_mod
这条规则只记录UID为0(root用户)对/etc/passwd的修改,其他用户的操作不会被记录,减少日志量。
第五,CentOS 8中auditd服务默认是开启的,但CentOS 7最小化安装时可能没有安装audit包,需要先安装:
yum install audit -y systemctl enable auditd systemctl start auditd六、常见问题排查
如果添加规则后发现日志里没有记录,先检查几点:一是确认auditd服务是否在运行(systemctl status auditd);二是确认规则是否真正加载(auditctl -l);三是确认你的操作确实触发了被监控的系统调用,比如用echo追加文件内容和用vim编辑文件触发的系统调用可能不同;四是检查SELinux是否阻止了审计记录的生成,可以临时setenforce 0测试。
还有一个容易忽略的点:audit规则有数量上限,默认是8192条。如果你添加了太多规则,可能会报"No space left on device"之类的错误。可以通过修改/etc/audit/auditd.conf中的max_log_file和max_log_file_action参数来调整。
七、总结CentOS上用auditctl做文件修改监控,本质上就是给关键文件挂上内核级的"摄像头"。操作不复杂,核心就是三步:用auditctl -w添加规则、写入/etc/audit/rules.d/audit.rules持久化、用ausearch和aureport分析日志。把/etc/passwd、/etc/shadow、/etc/crontab、/usr/bin这些关键路径都监控起来,基本就能满足大多数安全合规要求。记住监控范围要精准,不要贪多,否则性能和日志管理都会成为负担。
