适用场景
rsyslog 集中日志审计适合需要统一收集多台服务器系统日志、Nginx 访问日志、防火墙与数据库日志的运维安全团队。服务器数量达到 5 台以上后,逐台登录查日志效率极低,且攻击者清除单机日志后难以还原现场。通过 rsyslog 将日志实时转发到中央日志服务器,可以实现集中存储、统一检索与长期保留,为安全审计、入侵溯源和合规检查提供完整证据链。
前置条件
- 一台中央日志服务器(建议独立 2 核 4GB 以上配置,磁盘按日志量规划)
- 若干台需要接入的客户端服务器(Linux 系统)
- 各节点已安装 rsyslog(CentOS/RHEL 7+ 与 Ubuntu 16.04+ 默认自带)
- 客户端与服务端之间网络可达,默认使用 UDP/TCP 514 端口
原理说明
rsyslog 基于 syslog 协议工作,客户端将日志按 facility(来源类型)与 severity(级别)标记后发送至服务端;服务端按模板(template)将日志写入按主机与日期分区的文件。相比 ELK 方案,rsyslog 轻量、无 Java 依赖,单机即可支撑数千台设备的日志转发。配合 TLS 模块可加密传输,防止日志在网络上被窃听篡改。
操作步骤
1. 配置中央日志服务器
# 编辑服务端配置
vim /etc/rsyslog.conf
# 取消注释以下三行,启用 TCP 接收
module(load="imtcp")
input(type="imtcp" port="514")
$ModLoad imudp
$UDPServerRun 514
# 在文件末尾追加模板:按客户端 IP 与日期归档
$template RemoteLogs,"/var/log/remote/%fromhost-ip%/%$YEAR%-%$MONTH%-%$DAY%.log"
*.* ?RemoteLogs
# 重启 rsyslog 并放行防火墙
systemctl restart rsyslog
firewall-cmd --permanent --add-port=514/tcp --add-port=514/udp
firewall-cmd --reload
2. 配置客户端转发
# 编辑客户端配置
vim /etc/rsyslog.d/50-forward.conf
# 追加以下内容,*.* 表示所有日志全部转发
*.* @10.0.0.10:514
# 使用 @@ 表示 TCP,单 @ 表示 UDP
# *.* @@10.0.0.10:514
systemctl restart rsyslog
logger -t test "rsyslog forward test"
3. 转发 Nginx 访问日志
# 在 nginx.conf 的 http 段配置
log_format json_escape escape=json '{'
'"time":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"request":"$request",'
'"status":$status,'
'"body_bytes_sent":$body_bytes_sent,'
'"http_user_agent":"$http_user_agent"'
'}';
access_log syslog:server=10.0.0.10:514,tag=nginx,facility=local6 json_escape;
# 测试
nginx -t && nginx -s reload
4. 配置日志轮转与保留策略
# /etc/logrotate.d/remote
/var/log/remote/*/*.log {
daily
rotate 90
compress
delaycompress
missingok
notifempty
create 0640 syslog adm
sharedscripts
postrotate
/usr/bin/systemctl kill -s HUP rsyslog.service
endscript
}
5. 启用 TLS 加密传输(可选)
# 服务端生成自签证书(生产建议使用 CA 签发)
mkdir -p /etc/rsyslog-tls && cd /etc/rsyslog-tls
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout server.key -out server.crt -subj "/CN=logserver"
# 服务端配置文件添加
module(load="imtcp" StreamDriver.Name="gtls" StreamDriver.Mode="1" StreamDriver.AuthMode="anon")
input(type="imtcp" port="6514")
# 客户端配置改为 TLS
module(load="imtcp" StreamDriver.Name="gtls" StreamDriver.Mode="1" StreamDriver.AuthMode="anon")
*.* @@10.0.0.10:6514
# 同时将 server.crt 复制到客户端 /etc/rsyslog-tls/ 并配置 Global CA
配置验证
# 服务端查看收到的日志
tail -f /var/log/remote/10.0.0.20/$(date +%Y-%m-%d).log
# 客户端确认消息已发出
logger -t test "hello central log"
# 服务端应出现包含 "hello central log" 的新行
# 检查端口监听
ss -lntup | grep 514
# 统计每日日志量,评估磁盘
du -sh /var/log/remote/
常见问题
FAQ 1:客户端重启后日志不再转发?
检查服务端 imtcp 模块是否加载、514 端口是否被防火墙拦截,以及 systemctl status rsyslog 是否有报错。UDP 模式丢包不重传,关键日志建议使用 TCP(@@)模式 保证可靠投递。
FAQ 2:日志时间与本地时间不一致?
syslog 默认携带的是发送端时间。建议所有服务器统一使用 NTP 时钟同步(chronyc sources 验证),并在模板中加入 %timegenerated% 记录接收时间,方便溯源时对比两端时间戳。
FAQ 3:日志文件增长过快如何控制?
通过 logrotate 按天轮转并压缩(示例中保留 90 天),同时可在模板中按 facility 拆分,如将 nginx 访问日志单独归档。对于高频 debug 日志,可在客户端限制转发级别,例如 *.info;mail.none;authpriv.none;cron.none @10.0.0.10:514。
总结
rsyslog 集中日志审计方案以最小改动实现日志统一汇聚:服务端按来源 IP 与日期归档,客户端一行配置即可接入,Nginx 等应用日志可序列化为 JSON 便于后续分析。日志集中后,安全团队可基于统一数据源执行入侵检测、攻击溯源与合规审计,配合 ELK 或 Grafana Loki 可进一步实现可视化检索与告警,是构建日志审计体系成本最低的起步方案。