CentOS系统中sudo日志默认分散在各台服务器的本地/var/log/secure文件里,管理起来非常麻烦,尤其是在服务器数量多、需要审计安全事件的时候。一个高效的解决方案是配置sudo日志的集中存储,将所有服务器的sudo命令执行记录统一发送到一台专用的日志服务器上。这不仅能实现日志的统一管理和备份,还能增强安全审计的便利性,防止本地日志被篡改。核心方法是利用系统自带的rsyslog服务,通过配置客户端将特定日志转发,并在服务端进行归集和存储。

为什么必须集中管理sudo日志?

在分布式服务器环境中,安全审计是一个严峻挑战。如果每台服务器的sudo日志都独立存放,安全管理员需要逐台登录检查,效率极低,且容易遗漏关键安全事件。更危险的是,一旦服务器被入侵,攻击者可以轻松删除或篡改本地的/var/log/secure日志,抹去入侵痕迹。通过将sudo日志实时集中发送到一台受严格保护的独立日志服务器,可以实现日志的完整性保护、统一分析和长期归档。这不仅满足了等保合规中对审计日志集中管理的要求,也为事后追溯和实时告警提供了坚实的数据基础。

配置前的准备工作与环境说明

我们假设有一个简单的日志收集架构:多台CentOS服务器作为客户端(假设IP为192.168.1.10),一台CentOS服务器作为日志接收端(假设IP为192.168.1.100)。所有服务器需确保时间同步(使用NTP服务),以便日志时间戳准确。同时,需要确保网络连通性,客户端能访问服务端的514端口(syslog默认端口)。本文以CentOS 7/8为例,其默认的系统日志服务是rsyslog,功能强大且兼容syslog协议。

第一步:配置日志服务器端(集中存储端)

首先在IP为192.168.1.100的服务器上操作。我们需要修改rsyslog配置,使其能够接收来自网络的日志,并将接收到的sudo日志单独存储为一个文件。

1. 使用root身份编辑rsyslog主配置文件:

vi /etc/rsyslog.conf

2. 找到以下关于启用网络接收的模块和输入指令,默认是被注释的。确保这两行生效(对于CentOS 7/8,通常是取消注释):

# 启用UDP日志接收(可选,速度更快但不可靠)
$ModLoad imudp
$UDPServerRun 514

# 启用TCP日志接收(推荐,更可靠)
$ModLoad imtcp
$InputTCPServerRun 514

3. 在文件末尾或合适位置,添加规则,将来自客户端的认证相关日志(包括sudo)单独记录。我们可以根据日志的“设施-级别”或内容过滤。一个更精准的方式是使用rsyslog的属性过滤。添加如下规则:

# 定义一个模板,指定接收日志的文件名和格式
$template RemoteAuthLogs, "/var/log/remote/%FROMHOST-IP%/%PROGRAMNAME%.log"

# 过滤条件:如果日志来自非本机(即客户端),且包含"sudo"程序名,则按模板存储
if ($fromhost-ip != '127.0.0.1' and $programname == 'sudo') then ?RemoteAuthLogs
& stop

这个规则的意思是:如果日志的发送IP不是本机,并且程序名是“sudo”,那么就将其按照模板“RemoteAuthLogs”存储。模板定义了存储路径:在/var/log/remote目录下,以客户端IP地址创建子目录,并以程序名(sudo)命名日志文件。“& stop”表示匹配此规则后不再继续处理。

4. 创建存储目录并设置权限:

mkdir -p /var/log/remote
chmod -R 700 /var/log/remote

5. 保存配置文件后,重启rsyslog服务并确保防火墙开放514端口:

systemctl restart rsyslog
# 若使用firewalld
firewall-cmd --permanent --add-port=514/tcp
firewall-cmd --permanent --add-port=514/udp
firewall-cmd --reload
# 若使用iptables,相应添加规则

第二步:配置客户端(发送sudo日志的服务器)

在需要监控的CentOS客户端(如192.168.1.10)上操作。目标是配置sudo和rsyslog,让所有sudo命令日志除了记录在本地,也转发到中央日志服务器。

1. 首先配置sudo,确保其日志详细且通过syslog记录。编辑/etc/sudoers文件(务必使用visudo命令):

visudo

在文件内找到或添加以下默认行,确保存在:

Defaults syslog=authpriv

这一行指示sudo将日志通过authpriv设施(设施编号10)发送给syslog。这是默认设置,通常无需更改,但请确认。

2. 接下来配置rsyslog,将authpriv设施的消息转发到远程服务器。编辑/etc/rsyslog.conf:

vi /etc/rsyslog.conf

在文件末尾添加一行转发规则:

# 将authpriv设施的所有级别日志转发到远程日志服务器,使用@@表示TCP,@表示UDP
authpriv.* @@192.168.1.100:514

这里使用了“@@”表示通过TCP协议发送,可靠性更高。如果网络环境对性能要求极高且可接受少量丢失,可以用“@”通过UDP发送。

3. (可选但建议)为了防止网络中断导致日志丢失,可以配置rsyslog的队列和磁盘辅助。这涉及到更高级的配置,如$ActionQueueType等参数。

4. 保存配置后,重启客户端rsyslog服务:

systemctl restart rsyslog

第三步:测试与验证配置

配置完成后,必须进行测试以验证日志转发是否正常工作。

1. 在任意客户端上,执行一个需要sudo的命令:

sudo ls /root

2. 首先检查客户端本地是否生成了日志:

sudo tail -f /var/log/secure

应该能看到一条关于本次sudo命令执行的记录。

3. 然后登录到中央日志服务器(192.168.1.100),检查集中存储的日志文件:

tail -f /var/log/remote/192.168.1.10/sudo.log

如果配置成功,这里应该能看到从客户端IP(192.168.1.10)发来的、格式相同的sudo执行日志。日志内容通常包括时间戳、用户名、终端、执行的命令等详细信息。

高级配置与优化建议

基础的集中存储已经实现,但在生产环境中,还需要考虑更多因素来优化这套系统。

1. 加密与认证传输: 明文传输日志存在被窃听的风险。rsyslog支持使用GnuTLS或OpenSSL进行加密传输。你需要在服务端和客户端配置证书,并使用“omfwd”模块指定协议为“tcp”且启用TLS。这能大幅提升日志传输过程的安全性。

2. 日志轮替与归档: 集中存储的日志文件会不断增长。需要配置logrotate对/var/log/remote下的日志进行轮替。可以创建一个专门的配置文件:

vi /etc/logrotate.d/remote-sudo

内容示例:

/var/log/remote/*/*.log {
    daily
    missingok
    rotate 365
    compress
    delaycompress
    notifempty
    create 0600 root root
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

3. 使用更专业的日志管理工具: 当服务器规模达到数百上千台时,原生的rsyslog配置管理会变得复杂。此时可以考虑引入专业的日志管理套件,如ELK Stack(Elasticsearch, Logstash, Kibana)或Graylog。这些工具提供了更强大的日志收集、解析、索引、搜索和可视化能力。你仍然可以用rsyslog作为前端收集器,通过TCP将日志转发给Logstash或Graylog的输入接口。

4. 设置实时告警: 可以编写一个简单的脚本,实时监控新到的sudo.log文件,当检测到关键用户(如root)执行危险命令(如rm -rf, passwd等)时,立即发送邮件或即时消息告警。也可以利用Logstash的filter和output插件,或者Graylog的Streams和Alerts功能来实现。

可能遇到的问题与故障排查

在配置过程中,可能会遇到日志无法接收的情况。请按照以下步骤排查:

1. 网络连通性: 在客户端使用telnet或nc测试服务端514端口是否开放:nc -zv 192.168.1.100 514

2. 服务状态: 确保服务端和客户端的rsyslog服务都在运行:systemctl status rsyslog

3. 防火墙与SELinux: 这是最常见的问题。确保服务端防火墙允许514端口。同时,如果服务端SELinux处于Enforcing模式,需要允许rsyslog接收网络流量:setsebool -P rsyslogd\_enable\_tcp 1semanage port -a -t syslogd\_port\_t -p tcp 514

4. 配置文件语法: rsyslog配置语法严格,一个多余的空格都可能导致规则失效。使用rsyslogd -N1命令可以测试配置文件的语法是否正确。

5. 查看rsyslog内部日志: rsyslog的详细运行日志通常记录在/var/log/messages中,查看这里可以获得错误信息。

总结

通过以上步骤,我们成功在CentOS环境中构建了一个sudo日志集中存储系统。这套方案的核心价值在于将分散的安全审计数据集中化、标准化,极大地提升了运维安全水平和事件响应能力。从基础的rsyslog转发,到加密传输、日志轮替,再到与专业日志平台集成,你可以根据自身环境的规模和安全性要求,灵活选择和扩展这些组件。记住,集中存储只是第一步,更重要的是建立定期审查和分析这些日志的流程,让数据真正发挥出安全预警和合规审计的作用。