在CentOS系统中,要监控关键文件的变更,最直接有效的方法就是通过auditd审计守护进程配置规则,对指定文件或目录的读写、属性修改、权限变更等操作进行实时记录。具体做法是编辑/etc/audit/rules.d/audit.rules文件,添加针对关键路径的监控规则,然后重启auditd服务使其生效。这套机制能帮你第一时间发现谁动了系统核心文件,是安全运维的基本功。
很多运维人员觉得系统安全靠防火墙就够了,实际上内部威胁、误操作、恶意篡改才是最难防的。auditd作为Linux内核自带的审计框架,工作在系统调用层,比任何第三方工具都靠谱。它不依赖日志文件的完整性,而是直接从内核捕获事件,几乎无法被绕过。下面我把这套东西从原理到实操全部讲透。
一、auditd审计框架的工作原理auditd是用户空间的审计守护进程,它与Linux内核的审计子系统(audit subsystem)配合工作。当你配置了一条规则,内核会在对应的系统调用发生时生成审计事件,auditd负责接收、过滤并写入/var/log/audit/audit.log。整个链路是:系统调用触发 → 内核审计钩子捕获 → 事件传递到用户空间 → auditd写入日志。
这个机制的优势在于它工作在最底层。即使攻击者拿到了root权限并删除了日志文件,只要auditd服务还在运行,新产生的事件依然会被记录。当然,如果攻击者直接kill掉auditd进程或者篡改规则文件,那就另当别论了。所以后续我会讲如何保护auditd自身的安全。
二、安装和启动auditd服务CentOS 7和CentOS 8/Stream都自带audit包,但不一定默认安装。先检查一下:
rpm -qa | grep audit systemctl status auditd
如果没有安装,执行:
yum install audit -y systemctl enable auditd systemctl start auditd
启动之后确认服务状态是active (running),这一步是基础中的基础。很多人规则配了一堆,结果服务没启动,等于白干。
三、理解auditd规则的语法结构auditd规则文件通常放在/etc/audit/rules.d/audit.rules。每条规则的基本格式如下:
-w /path/to/file -p permissions -k key_name
各部分含义:-w指定要监控的文件或目录路径;-p指定要监控的权限类型,常见的有r(读)、w(写)、x(执行)、a(属性变更);-k是给这条规则打的标签,方便后续用ausearch或aureport检索。多个权限可以组合,比如-p rwxa表示监控所有操作。
还有一种规则是监控系统调用的,格式不太一样:
-a always,exit -F arch=b64 -S open,openat -F path=/etc/passwd -k passwd_change
这种适合监控特定系统调用对特定文件的操作,更精细但也更复杂。对于大多数场景,用-w方式就够了。
四、监控关键文件的具体规则配置下面给出一套实战级别的规则,覆盖CentOS最核心的安全文件。直接编辑/etc/audit/rules.d/audit.rules:
# 监控用户和组文件变更 -w /etc/passwd -p wa -k identity -w /etc/group -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/gshadow -p wa -k identity # 监控认证相关配置 -w /etc/ssh/sshd_config -p wa -k ssh_config -w /etc/pam.d/ -p wa -k pam_config -w /etc/login.defs -p wa -k login_config # 监控sudo权限 -w /etc/sudoers -p wa -k sudo_config # 监控系统服务和定时任务 -w /etc/crontab -p wa -k cron_config -w /etc/cron.d/ -p wa -k cron_config -w /var/spool/cron/ -p wa -k cron_config # 监控网络配置 -w /etc/hosts -p wa -k network_config -w /etc/sysconfig/network-scripts/ -p wa -k network_config # 监控内核和启动相关 -w /etc/grub2.cfg -p wa -k boot_config -w /etc/default/grub -p wa -k boot_config # 监控防火墙规则 -w /etc/sysconfig/iptables -p wa -k firewall_config # 监控系统命令完整性(防止被替换) -w /bin/ -p wa -k binary_integrity -w /sbin/ -p wa -k binary_integrity -w /usr/bin/ -p wa -k binary_integrity -w /usr/sbin/ -p wa -k binary_integrity # 锁定规则文件本身,防止被篡改 -e 2
最后一行-e 2非常关键,它的意思是把规则设为不可更改状态。设置之后,任何人包括root都无法通过auditctl命令新增或删除规则,除非重启auditd服务。这是防止攻击者在入侵后清除审计规则的最后一道防线。但注意,这也意味着你以后想改规则必须手动编辑文件再重启服务。
五、规则生效和验证方法规则写好之后,有两种方式让它生效。第一种是重启服务:
systemctl restart auditd
第二种是用auditctl加载(不重启):
augenrules --load
加载完成后,用auditctl -l查看当前生效的规则列表,确认所有规则都在。如果发现有规则没加载,检查语法是否有误,或者路径是否写错了。
验证规则是否真正工作,最简单的方法是做一个测试操作。比如:
touch /etc/passwd echo "test" >> /etc/group
然后用ausearch查询:
ausearch -k identity -ts recent
如果能看到对应的审计记录,说明规则正常工作。记录中会包含操作时间、执行者UID、进程名、操作类型等详细信息。
六、审计日志的分析和检索技巧auditd的日志文件在/var/log/audit/audit.log,默认是纯文本格式,直接看比较费劲。推荐用ausearch和aureport两个工具。
按关键字搜索特定事件:
ausearch -k identity -i
-i参数会把数字UID自动转换成用户名,可读性更强。按时间范围搜索:
ausearch -ts today -k ssh_config
生成统计报告,比如查看哪个用户触发的审计事件最多:
aureport --auth --summary
查看文件访问报告:
aureport -f --summary
这些工具组合起来用,基本能覆盖日常安全审计的需求。如果你有SIEM系统或者日志集中管理平台,可以把audit.log通过rsyslog转发过去做长期存储和关联分析。
七、保护auditd自身不被篡改前面提到了-e 2锁定规则,但这还不够。auditd自身的配置文件和二进制也需要保护。建议做以下几件事:
第一,把/etc/audit/目录和/etc/audit/rules.d/目录的权限设为700,属主设为root:
chmod 700 /etc/audit/ chmod 700 /etc/audit/rules.d/ chown root:root /etc/audit/rules.d/audit.rules
第二,用chattr给规则文件加不可修改属性:
chattr +i /etc/audit/rules.d/audit.rules
这样即使root用户也无法直接修改文件内容,必须先chattr -i才行。第三,定期用auditctl -l导出规则快照,和之前的版本做diff对比,发现异常立即排查。
八、常见问题和排错指南实际使用中经常遇到几个问题。第一个是规则太多导致性能下降。auditd对系统性能有一定影响,尤其是监控/bin/、/sbin/这种大目录时。建议只监控真正关键的文件,不要把整个根目录都加进去。如果发现系统变慢,先用auditctl -s查看统计信息,看哪条规则触发频率最高,针对性优化。
第二个问题是日志文件膨胀太快。audit.log增长速度取决于监控范围和系统活动量。建议配置logrotate:
cat /etc/logrotate.d/audit
/var/log/audit/audit.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
}
第三个问题是重启后规则丢失。这通常是因为规则写在了/etc/audit/audit.rules而不是/etc/audit/rules.d/audit.rules。CentOS 7/8推荐把规则放在rules.d目录下,用augenrules工具管理,这样重启后会自动合并加载。
九、进阶用法:监控特定用户的操作除了监控文件路径,auditd还可以针对特定用户设置规则。比如你想监控nobody用户对敏感文件的访问:
-w /etc/passwd -p r -F uid=nobody -k nobody_access
或者监控某个UID范围内的所有操作:
-a always,exit -F uid>=1000 -F uid!=4294967295 -k user_activity
这种细粒度的规则在多用户环境或者有服务账号的服务器上特别有用。比如你跑了一个Web服务用的是apache用户,你可以专门监控这个用户对配置文件的操作。
十、和其他安全工具的配合auditd不是万能的,它负责记录,但不负责实时告警。要实现实时告警,可以配合audisp-plugins插件,比如把事件发到syslog或者通过邮件通知。安装:
yum install audit-libs-python -y
或者用aureport配合cron定时扫描,发现异常就发邮件。更高级的做法是把audit日志接入ELK、Splunk等平台做实时分析和可视化。但不管用什么方案,auditd本身的规则配置是地基,地基打不好上面全白搭。
总结一下,CentOS上用auditd监控关键文件变更,核心就是三步:配规则、锁规则、查日志。规则要精准不要贪多,锁定机制要到位防止被绕过,日志分析要形成习惯定期review。这套东西配置一次,长期受益,是Linux服务器安全加固中性价比最高的手段之一。
