《100个“反常识”经验19:日志被人删了?用rsyslog远程备份》
远程日志备份是安全应急的核心防线,攻击者无法同时删除两端日志。rsyslog配置步骤:服务端开启UDP/TCP接收模块,客户端添加转发规则 *.* @@服务器IP:514。公网传输建议启用TLS加密。合规要求保留日志6个月,配置logrotate。注意防火墙开放514端口,避免把自己锁在外面。
本期摘要
攻击者入侵服务器后,第一件事往往是清理日志,抹掉自己的痕迹。如果你只有本地日志,被删了就什么都查不到了。本文从一次真实入侵事件切入,讲解如何用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:离职员工删库,我们怎么提前防的》
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)