在CentOS系统安全运维中,/etc/sudoers文件是权限控制的核心文件,任何对它的非授权修改都可能导致提权漏洞或系统被入侵。要实现对该文件修改的实时告警,最直接有效的方法就是利用Linux自带的auditd审计框架,通过配置专门的文件监控规则,一旦有人修改sudoers文件,系统就会立即记录日志并触发告警。具体做法是:先确认auditd服务已安装并运行,然后添加一条针对/etc/sudoers的watch规则,设置权限和属性监控,最后配合告警脚本或日志分析工具实现实时通知。
这套方案不需要额外安装第三方软件,CentOS 7和CentOS 8都原生支持,配置简单、开销极低,是企业级服务器安全基线检查中的必选项。下面我会从原理、配置、验证、告警联动到进阶优化,一步步给你讲透。
一、auditd是什么以及为什么选它监控sudoersauditd是Linux内核审计子系统的用户空间守护进程,它能监控文件访问、系统调用、用户登录等几乎所有安全相关的事件。相比于inotify等文件监控工具,auditd直接工作在内核层面,记录更完整、更难被绕过,而且日志格式统一,方便后续分析。
/etc/sudoers文件决定了哪些用户可以执行sudo命令、以什么身份执行、是否需要密码。如果攻击者获取了root权限后修改这个文件,比如添加一行"ALL ALL=(ALL) NOPASSWD: ALL",就等于给自己开了永久后门。所以监控这个文件的完整性,是安全运维的基本功。
auditd的优势在于:第一,它记录的是内核级别的事件,即使攻击者删除了bash_history也无法清除审计记录;第二,它支持按文件路径、权限、属主等多维度监控;第三,CentOS默认就装了,不用额外折腾。
二、检查和启动auditd服务在配置之前,先确认auditd已经安装并处于运行状态。执行以下命令检查:
systemctl status auditd
如果显示active (running),说明服务正常。如果没有安装,执行:
yum install audit -y systemctl start auditd systemctl enable auditd
CentOS 8使用dnf,命令一样。确保开机自启,否则重启后监控就失效了。同时确认audit规则目录存在:
ls -la /etc/audit/rules.d/
这个目录下的.rules文件会被auditd自动加载,我们的规则就写在这里。
三、配置auditd监控/etc/sudoers文件创建一个专门的规则文件,比如/etc/audit/rules.d/sudoers_monitor.rules,写入以下内容:
-w /etc/sudoers -p wa -k sudoers_change
这条规则的含义逐字解释:-w表示监控文件/目录;/etc/sudoers是目标路径;-p wa表示监控写入(w)和属性变更(a)两种操作;-k sudoers_change是给这条规则打一个自定义标签,方便后续在日志中快速检索。
如果你还想监控/etc/sudoers.d/目录下的所有文件(很多系统会把sudo规则拆分到这个目录),可以再加一条:
-w /etc/sudoers.d/ -p wa -k sudoers_d_change
注意,如果/etc/sudoers.d/目录不存在,auditd会报错。可以先确认目录是否存在:
ls -la /etc/sudoers.d/
配置完成后,需要重新加载规则。有两种方式:
augenrules --load
或者直接重启服务:
systemctl restart auditd
推荐用augenrules,它会把rules.d下的规则合并到/etc/audit/audit.rules主文件中,然后重新加载,不会中断现有监控。
四、验证监控是否生效规则加载后,做一次测试修改。用visudo打开sudoers文件(visudo会做语法检查,避免改错导致sudo不可用),随便加一个注释:
visudo
在文件末尾加一行注释,比如:
# test audit monitoring 2024
保存退出后,用ausearch命令搜索刚才的事件:
ausearch -k sudoers_change
如果看到类似以下输出,说明监控正常工作:
type=SYSCALL msg=audit(1718000000.123:456): arch=c000003e syscall=82 success=yes exit=3 a0=... a1=... items=1 ppid=1234 pid=5678 auid=0 uid=0 gid=0 euid=0 ... type=CWD msg=audit(...): cwd="/root" type=PATH msg=audit(...): name="/etc/sudoers" ...
关键信息包括:auid=0表示实际用户ID是root(因为visudo以root运行),name="/etc/sudoers"确认是目标文件,syscall=82对应openat系统调用。这些都证明auditd精确捕获了文件修改事件。
如果没有输出,检查几个点:规则文件是否被加载(看/etc/audit/audit.rules里有没有你的规则)、文件权限是否正确、auditd服务是否正常。
五、实现实时告警通知光记录日志还不够,安全运维需要实时知道有人动了sudoers。有几种告警方式,从简单到复杂排列。
方式一:配合audispd插件实时推送
auditd自带audispd守护进程,可以把事件实时转发。编辑/etc/audisp/plugins.d/syslog.conf,确保active = yes。然后配置rsyslog把audit日志单独输出到一个文件:
# /etc/rsyslog.d/audit.conf :msg, contains, "sudoers_change" /var/log/audit_sudoers.log
重启rsyslog后,用inotifywait监控这个日志文件,触发告警脚本:
inotifywait -m /var/log/audit_sudoers.log -e modify |
while read path action file; do
echo "ALERT: /etc/sudoers was modified at $(date)" | \
mail -s "SUDOERS FILE CHANGED" security@yourdomain.com
done
方式二:写一个定时扫描脚本
如果不想装额外工具,可以用crontab每分钟跑一次ausearch:
* * * * * root /usr/sbin/ausearch -k sudoers_change -ts recent -i | grep -q . && echo "SUDOERS ALERT" | mail -s "Critical" admin@example.com
-ts recent表示只查最近的事件,-i忽略大小写。这个方案简单粗暴,但有分钟级延迟。
方式三:对接SIEM或日志平台
企业环境通常有集中日志平台。把audit日志通过rsyslog或filebeat转发到ELK、Splunk等平台,在平台上配置告警规则,一旦检测到sudoers_change标签的事件就触发工单或短信通知。这是最规范的做法。
六、进阶优化和注意事项1. 防止规则被篡改
auditd的规则文件本身也应该被监控。在/etc/audit/rules.d/目录下的文件一旦被修改,也会触发告警。可以额外加一条:
-w /etc/audit/rules.d/ -p wa -k audit_rules_change
这样形成闭环:监控sudoers的规则被改了,也会被记录。
2. 监控sudoers文件的完整性哈希
除了监控修改操作,还可以定期计算文件哈希值做对比。写一个脚本每天计算一次:
sha256sum /etc/sudoers > /var/lib/audit_hash/sudoers.sha256
然后用auditd监控这个哈希文件的变化,一旦哈希变了就说明文件内容变了。这种方式可以检测到通过非正常途径(比如直接写磁盘)的修改。
3. 排除正常维护操作的误报
日常运维中,管理员确实会修改sudoers。为了区分正常操作和异常操作,可以在告警脚本中加入判断逻辑:比如检查修改时间是否在维护窗口内、修改者是否是已知管理员账号、是否有对应的工单记录。把这些信息关联起来,减少误报。
4. 审计日志的保留策略
audit日志会持续增长,需要合理配置保留策略。编辑/etc/audit/auditd.conf:
max_log_file = 100 max_log_file_action = ROTATE num_logs = 10
这表示单个日志文件最大100MB,满了就轮转,保留10个文件。根据磁盘空间和合规要求调整数值。注意,审计日志通常要求保留至少6个月,很多行业标准(等保、PCI DSS)都有明确规定。
5. CentOS 8的注意点
CentOS 8(以及RHEL 8)的auditd配置文件路径略有不同,规则文件统一放在/etc/audit/rules.d/,但主配置文件是/etc/audit/auditd.conf。另外CentOS 8默认使用augenrules工具生成/etc/audit/rules.d/audit.rules,不要直接编辑这个生成的文件,否则下次augenrules运行会覆盖你的修改。
七、完整配置清单总结把所有步骤汇总成一个可直接执行的清单:
# 1. 安装并启动auditd yum install audit -y systemctl enable auditd systemctl start auditd # 2. 创建监控规则 cat > /etc/audit/rules.d/sudoers_monitor.rules << 'EOF' -w /etc/sudoers -p wa -k sudoers_change -w /etc/sudoers.d/ -p wa -k sudoers_d_change -w /etc/audit/rules.d/ -p wa -k audit_rules_change EOF # 3. 加载规则 augenrules --load # 4. 验证 ausearch -k sudoers_change # 5. 配置告警(示例:rsyslog + mail) echo ':msg, contains, "sudoers_change" /var/log/audit_sudoers.log' > /etc/rsyslog.d/audit.conf systemctl restart rsyslog
这套配置部署下来,你的CentOS服务器就具备了对sudoers文件的实时监控和告警能力。作为安全基线的一部分,建议在所有生产服务器上统一部署,并纳入定期巡检清单。
八、常见问题排查如果配置后没有产生日志,按以下顺序排查:第一,确认auditd在运行;第二,用auditctl -l查看当前加载的规则,看你的规则是否在列表中;第三,确认文件路径正确,特别注意/etc/sudoers.d/目录是否存在;第四,检查SELinux是否阻止了auditd访问,可以用ausearch -m avc查看SELinux拒绝事件;第五,确认磁盘空间充足,auditd磁盘满了会停止记录。
另外提醒一点,auditd本身也会产生大量日志,如果服务器负载高、事件多,建议把audit日志单独放在一个分区,避免写满根分区影响系统运行。这是很多人踩过的坑。
总的来说,用auditd监控/etc/sudoers是CentOS安全加固中投入产出比极高的操作。配置只需要几行规则,但能有效防止权限被静默篡改,是等保测评、安全审计中的加分项。建议配合文件完整性监控(如AIDE)和最小权限原则一起使用,构建多层防御体系。
