本期摘要

攻击者入侵服务器后,第一件事往往是清理日志,抹掉自己的痕迹。如果你只有本地日志,被删了就什么都查不到了。本文从一次真实入侵事件切入,讲解如何用rsyslog搭建远程日志备份系统:将日志实时发送到另一台安全的日志服务器,即使入侵者删除了本地日志,远程服务器上仍然保留完整记录。文章涵盖了rsyslog的客户端配置、服务端配置、传输加密(TLS)、以及日志轮转策略。读完你就能建起一道让攻击者无法抹去的防线。

一次让人后背发凉的应急响应

某天,安全团队发现一台业务服务器被入侵。攻击者通过Redis未授权访问植入了挖矿程序。

应急响应第一步:查看攻击痕迹。

bash

last -20
grep "Accepted" /var/log/auth.log

结果:日志被清空了。/var/log/auth.log 只剩下几行,/var/log/wtmp 也被删了。

攻击者显然是有备而来,知道自己的IP会留在登录记录里,于是顺手清掉了。

好在,这台服务器配置了rsyslog远程备份。所有的日志在产生的同时,就已经实时发送到了另一台独立的安全日志服务器上。

在那台日志服务器上,我们找到了完整的攻击时间线:暴力破解SSH的时间、来源IP、执行过的命令、修改的文件。这些证据最终帮我们锁定了攻击者。

为什么需要远程日志备份?

问题 本地日志 远程日志
被删了怎么办 找不回来 远程还有一份
服务器被格式化了 彻底丢失 安全保存
攻击者篡改日志 可能被改 难以同时篡改两端
取证和溯源 信息不足 完整记录

合规要求:等保2.0、ISO 27001 等标准都要求日志至少保存6个月,且需要集中存储。

rsyslog远程备份配置

rsyslog是Linux上最常用的日志守护进程,支持将日志实时转发到远程服务器。

架构图:

text

应用服务器 (客户端)  ----->  日志服务器 (服务端)
/var/log/*              UDP/TCP 514     /var/log/remote/

第一步:服务端配置(日志服务器)

编辑 /etc/rsyslog.conf,启用远程接收:

bash

# 加载TCP/UDP模块
module(load="imudp")
module(load="imtcp")

# 监听端口
input(type="imudp" port="514")
input(type="imtcp" port="514")

创建接收模板,将不同客户端的日志分开存放:

bash

# 按客户端IP分目录
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%$YEAR%-%$MONTH%-%$DAY%/%PROGRAMNAME%.log"
*.* ?RemoteLogs

重启服务端:

bash

systemctl restart rsyslog

确保防火墙开放514端口:

bash

firewall-cmd --add-port=514/tcp --permanent
firewall-cmd --add-port=514/udp --permanent
firewall-cmd --reload

第二步:客户端配置(应用服务器)

编辑 /etc/rsyslog.conf,添加转发规则:

bash

# 将所有日志发送到日志服务器(TCP方式,更可靠)
*.* @@日志服务器IP:514

如果是UDP,用一个 @

bash

*.* @日志服务器IP:514

重启客户端:

bash

systemctl restart rsyslog

测试是否成功:

bash

logger "test message from client"

在服务端检查 /var/log/remote/客户端主机名/ 目录下是否收到日志。

进阶配置:加密传输(防止被中间人窃听或篡改)

如果日志经过公网传输,建议启用TLS加密。

服务端生成证书:

bash

# 生成CA证书和服务器证书(省略具体步骤)

服务端配置(启用TLS):

bash

module(load="imtls")
input(type="imtcp" port="6514" StreamDriver.Name="gtls" StreamDriver.Mode="1" StreamDriver.AuthMode="x509/name")

客户端配置:

bash

module(load="omtls")
*.* action(type="omtls" target="日志服务器IP" port="6514" StreamDriver.Name="gtls" StreamDriver.Mode="1" StreamDriver.AuthMode="x509/name" PermittedPeer="CN=server")

日志轮转与保留策略

远程日志同样需要轮转,避免占满磁盘。

在日志服务器上配置 /etc/logrotate.d/rsyslog-remote

bash

/var/log/remote/*/*.log {
    daily
    rotate 180
    compress
    delaycompress
    missingok
    notifempty
    sharedscripts
    postrotate
        systemctl kill -s HUP rsyslog
    endscript
}

rotate 180 保留180天(约6个月),符合等保要求。

一键部署脚本

客户端配置脚本:

bash

#!/bin/bash
LOG_SERVER_IP="192.168.1.100"
echo "*.* @@${LOG_SERVER_IP}:514" >> /etc/rsyslog.conf
systemctl restart rsyslog
echo "rsyslog client configured."

服务端配置脚本:

bash

#!/bin/bash
cat >> /etc/rsyslog.conf << EOF
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")
\$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%\$YEAR%-%\$MONTH%-%\$DAY%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
EOF
systemctl restart rsyslog
firewall-cmd --add-port=514/tcp --add-port=514/udp --permanent
firewall-cmd --reload
echo "rsyslog server configured."

下期预告

《100个“反常识”经验20:离职员工删库,我们怎么提前防的》

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐