CentOS服务器上的系统日志一旦被入侵者篡改,安全审计就形同虚设。很多人以为把rsyslog装好就万事大吉,实际上默认配置下的/var/log目录对root用户完全开放,攻击者拿到root权限后第一件事就是清理日志。要解决这个问题,核心思路不是单纯依赖文件权限,而是要让日志在写入的瞬间就脱离当前系统的可控范围,同时保留完整性校验能力。

理解日志篡改的常见路径

攻击者篡改日志通常有三条路径:直接删除或修改/var/log下的日志文件;利用日志轮转机制覆盖历史记录;通过停止rsyslog服务让日志停止记录。针对这三条路径,我们需要分别设置应对策略。单纯设置chattr +a只能防止文件被覆盖写入,但无法阻止root用户用chattr -a解除属性,也无法阻止整个日志目录被删除重建。所以防篡改必须建立在“日志实时外发”和“完整性独立校验”两个基础之上。

第一步:配置rsyslog实时转发到独立日志服务器

在CentOS 7/8/9上,rsyslog默认已安装。要让日志实时脱离本机,需要在/etc/rsyslog.conf中增加UDP或TCP转发规则。推荐使用TCP协议,虽然性能略低于UDP,但能保证日志传输的可靠性,避免网络波动时丢失关键安全事件。编辑配置文件:

# 在/etc/rsyslog.conf末尾添加
*.* @@192.168.10.50:514

这里的@@表示使用TCP协议,单个@表示UDP。192.168.10.50是独立日志服务器的IP地址。配置完成后执行systemctl restart rsyslog。注意防火墙需要放行出站514端口。在日志服务器端,需要修改/etc/rsyslog.conf中的模块加载部分,取消TCP接收模块的注释:

module(load="imtcp")
input(type="imtcp" port="514")

同时要在日志服务器上配置好日志存储模板,按客户端IP或主机名分目录存放,避免所有日志混在一个文件里。这种实时转发机制确保了即使CentOS服务器被完全攻陷,已经产生的日志也已经安全地保存在独立设备上,攻击者无法回溯删除。

第二步:使用auditd审计日志文件访问行为

rsyslog转发解决的是日志丢失问题,但无法阻止攻击者在本机读取日志内容。如果日志中包含敏感信息,比如登录失败的用户名、防火墙拦截的IP等,攻击者读取后可以调整攻击策略。auditd是Linux内核级的审计系统,可以监控任何对/var/log目录的访问行为。安装并配置:

yum install audit -y
systemctl enable auditd
systemctl start auditd
auditctl -w /var/log/ -p rwxa -k log_access

这条规则会监控/var/log目录下所有文件的读取、写入、执行和属性变更操作。当攻击者使用cat、tail、vim等命令查看日志时,auditd会记录下进程名、用户、时间戳和具体操作。这些审计记录本身也需要转发到日志服务器,在/etc/audit/auditd.conf中配置audisp插件或者直接在rsyslog中读取audit日志进行转发。auditd的监控规则对root用户同样生效,因为审计框架运行在内核层面,普通用户态工具无法绕过。

第三步:日志文件完整性校验与告警

即使日志已经实时转发,本机的日志文件仍然可能被篡改。完整性校验的目的是在攻击者修改本机日志后能够及时发现。这里推荐使用AIDE或Tripwire这类文件完整性监控工具。以AIDE为例,安装后初始化数据库:

yum install aide -y
aide --init
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

然后在/etc/aide.conf中确保/var/log目录在监控范围内。默认配置通常已包含,但需要检查是否有针对日志目录的特殊规则。建议对/var/log使用更严格的校验级别,包括权限、所有者、内容哈希等。配置完成后设置cron定时任务,每小时执行一次aide --check,并将结果通过邮件或syslog发送。当检测到日志文件被修改时,说明系统可能已被入侵,需要立即启动应急响应流程。

第四步:利用chattr设置日志文件不可变属性

chattr +a和chattr +i是Linux文件系统层面的保护机制。+a属性允许文件追加内容但不能删除或修改已有内容,+i属性则完全锁定文件。对于已经轮转归档的日志文件,可以设置+i属性防止被篡改。对于正在写入的日志文件,设置+a属性可以让rsyslog继续追加写入,同时阻止攻击者清空或覆盖文件。操作命令:

chattr +a /var/log/secure
chattr +a /var/log/messages
chattr +a /var/log/audit/audit.log

需要注意,设置+a属性后,logrotate轮转日志时会因为无法重命名文件而失败。解决方法是修改logrotate配置,在轮转脚本中先移除属性,轮转完成后再重新添加。具体做法是在/etc/logrotate.d/syslog中的postrotate脚本里加入chattr -a和chattr +a命令。另外,攻击者如果拿到root权限,同样可以执行chattr -a解除属性,所以这个措施只能增加攻击难度,不能作为唯一的防线。

第五步:配置日志轮转的防覆盖策略

默认的logrotate配置通常使用rotate 4,即保留4份历史日志。攻击者如果希望清除痕迹,可能会手动触发logrotate多次,让旧日志被新日志覆盖。要防止这种情况,可以增加保留份数,比如rotate 12或更多,同时启用dateext参数,让轮转后的日志文件名带上日期后缀,避免被覆盖。在/etc/logrotate.conf中设置:

rotate 12
dateext
compress

另外,可以设置maxage参数限制日志保留的最长时间,但不要设置过短,否则攻击者可以等待日志自动过期。对于安全审计要求较高的场景,建议保留至少6个月的日志。日志轮转后的归档文件同样需要设置chattr +i属性,并纳入AIDE的监控范围。

第六步:监控rsyslog服务状态

攻击者可能会直接停止rsyslog服务,让后续的攻击行为不再产生日志。要防止这种情况,可以使用systemd的守护功能。在/lib/systemd/system/rsyslog.service中添加Restart=always和RestartSec=5,这样即使服务被手动停止,也会在5秒后自动重启。同时,使用monit或自定义脚本监控rsyslog进程,一旦发现进程不存在就立即告警并尝试重启。更严格的方案是使用systemd的单元文件锁定功能,但CentOS默认的rsyslog服务单元没有启用该特性,需要手动修改。另外,可以在auditd中添加对systemctl stop rsyslog命令的监控规则,记录是谁在什么时间停止了日志服务。

第七步:远程日志的加密传输与身份验证

使用TCP明文传输日志存在被中间人截获的风险。如果日志中包含敏感信息,建议使用rsyslog的TLS加密功能。在日志服务器上生成自签名证书,然后在客户端配置证书路径:

# 客户端配置
$DefaultNetstreamDriver gtls
$DefaultNetstreamDriverCAFile /etc/rsyslog.d/ca.pem
$DefaultNetstreamDriverCertFile /etc/rsyslog.d/client-cert.pem
$DefaultNetstreamDriverKeyFile /etc/rsyslog.d/client-key.pem
$ActionSendStreamDriver gtls
$ActionSendStreamDriverMode 1
*.* @@(o)192.168.10.50:6514

服务器端同样需要配置对应的证书和监听端口。TLS加密不仅能防止日志在传输过程中被窃听,还能通过证书验证日志服务器的身份,防止攻击者将日志重定向到伪造的服务器上。

实际部署中的注意事项

以上措施需要根据实际环境灵活调整。对于小型环境,至少要实现日志实时转发和chattr保护;对于等保合规或金融行业环境,需要完整实施所有七步措施。在实施chattr之前,务必先测试logrotate是否能正常工作,否则可能导致磁盘空间被写满。AIDE的数据库初始化需要在系统刚安装完成、确认干净的状态下进行,否则基线本身就不可信。远程日志服务器需要独立于业务网络,最好使用专用的管理网段,并限制只有日志端口可以访问。

日志防篡改不是一次性配置就能解决的问题,需要定期检查各项措施是否仍然生效。建议每季度进行一次日志完整性抽查,每年进行一次完整的日志安全审计。当发现日志文件属性异常、AIDE告警或rsyslog服务频繁重启时,要立即排查是否发生了入侵事件。安全日志是事后追溯的唯一依据,保护好日志的完整性和真实性,就是保护整个安全体系的可信基础。