在CentOS系统安全运维中,/etc/sudoers文件是权限控制的核心文件,任何对它的非授权修改都可能导致提权漏洞或系统被入侵。要实现对该文件修改的实时告警,最直接有效的方法就是利用Linux自带的auditd审计框架,通过配置专门的文件监控规则,一旦有人修改sudoers文件,系统就会立即记录日志并触发告警。具体做法是:先确认auditd服务已安装并运行,然后添加一条针对/etc/sudoers的watch规则,设置权限和属性监控,最后配合告警脚本或日志分析工具实现实时通知。

这套方案不需要额外安装第三方软件,CentOS 7和CentOS 8都原生支持,配置简单、开销极低,是企业级服务器安全基线检查中的必选项。下面我会从原理、配置、验证、告警联动到进阶优化,一步步给你讲透。

一、auditd是什么以及为什么选它监控sudoers

auditd是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)和最小权限原则一起使用,构建多层防御体系。