在CentOS环境下,rsyslog默认以明文方式传输日志,这意味着日志在网络传输过程中可以被轻易截获和篡改。要实现rsyslog的加密传输与日志完整性保障,核心方案有三条路径:一是通过TLS加密通道保护传输过程;二是通过数字签名或哈希校验确保日志内容不被篡改;三是结合两者构建完整的安全日志体系。下面我会把每一步操作、配置细节、常见坑点全部讲透。
一、为什么rsyslog必须做加密传输
很多运维人员觉得日志只是系统运行记录,没什么敏感信息。但实际上,rsyslog传输的日志中可能包含用户登录信息、IP地址、错误堆栈、甚至应用层面的业务数据。一旦传输链路被中间人攻击截获,攻击者不仅能看到所有日志,还能伪造日志来掩盖入侵行为。CentOS 7和CentOS 8上rsyslog的版本不同,配置方式也有差异,但核心逻辑一致——用TLS把日志通道锁起来。
二、准备工作:生成证书和密钥
要实现TLS加密,首先需要CA证书、服务端证书和客户端证书。在CentOS上最快的方式是用OpenSSL自签证书。在服务器端执行以下操作:
# 创建工作目录 mkdir -p /etc/rsyslog.d/certs cd /etc/rsyslog.d/certs # 生成CA私钥 openssl genrsa -out ca.key 2048 # 生成CA证书(有效期365天) openssl req -new -x509 -key ca.key -out ca.crt -days 365 -subj "/CN=RsyslogCA" # 生成服务端私钥 openssl genrsa -out server.key 2048 # 生成服务端证书请求 openssl req -new -key server.key -out server.csr -subj "/CN=$(hostname)" # 签发服务端证书 openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 # 生成客户端私钥 openssl genrsa -out client.key 2048 # 生成客户端证书请求 openssl req -new -key client.key -out client.csr -subj "/CN=rsyslog-client" # 签发客户端证书 openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365 # 设置权限(非常重要) chmod 600 *.key chmod 644 *.crt
证书生成后,把ca.crt、server.crt、server.key放在日志服务器上,把ca.crt、client.crt、client.key分发到每台需要发送日志的客户端机器上。注意:私钥文件权限必须是600,否则rsyslog启动时会报权限错误直接拒绝加载。
三、配置rsyslog服务端(接收端)开启TLS
在CentOS 7上,rsyslog的TLS模块需要单独加载。编辑主配置文件:
vim /etc/rsyslog.conf
在文件顶部添加模块加载指令:
module(load="imtcp"
StreamDriver.Name="gtls"
StreamDriver.Mode="1"
StreamDriver.AuthMode="anon")
module(load="imtcp"
StreamDriver.Name="gtls"
StreamDriver.Mode="1"
StreamDriver.AuthMode="x509/name"
StreamDriver.CertFile="/etc/rsyslog.d/certs/server.crt"
StreamDriver.KeyFile="/etc/rsyslog.d/certs/server.key"
StreamDriver.CAFile="/etc/rsyslog.d/certs/ca.crt")这里有两个imtcp模块:第一个允许匿名TLS连接(用于测试),第二个要求客户端提供有效证书。生产环境建议只保留第二个。同时需要打开TCP 514端口:
# 修改 /etc/rsyslog.conf 中的监听配置 $ModLoad imtcp $InputTCPServerRun 514
在CentOS 8上,配置方式有所不同,需要在/etc/rsyslog.d/目录下创建独立配置文件:
vim /etc/rsyslog.d/tls.conf
global(
DefaultNetstreamDriver="gtls"
DefaultNetstreamDriverCAFile="/etc/rsyslog.d/certs/ca.crt"
DefaultNetstreamDriverCertFile="/etc/rsyslog.d/certs/server.crt"
DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/certs/server.key"
)
module(load="imtcp"
StreamDriver.Name="gtls"
StreamDriver.Mode="1"
StreamDriver.AuthMode="x509/name")
input(type="imtcp" port="514")配置完成后重启服务并检查状态:
systemctl restart rsyslog systemctl status rsyslog
四、配置rsyslog客户端(发送端)使用TLS
客户端需要指定远程日志服务器地址,并启用TLS发送。在CentOS 7上编辑/etc/rsyslog.conf:
# 注释掉或删除原有的 UDP/TCP 转发规则 # *.* @192.168.1.100:514 # 添加TLS转发规则 *.* @@(o)192.168.1.100:514
其中@@表示TCP,(o)表示使用TLS。同时需要指定客户端证书路径,创建/etc/rsyslog.d/client.conf:
global(
DefaultNetstreamDriver="gtls"
DefaultNetstreamDriverCAFile="/etc/rsyslog.d/certs/ca.crt"
DefaultNetstreamDriverCertFile="/etc/rsyslog.d/certs/client.crt"
DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/certs/client.key"
)
action(type="omfwd" target="192.168.1.100" port="514" protocol="tcp"
StreamDriver="gtls" StreamDriverMode="1" StreamDriverAuthMode="x509/name")CentOS 8的写法类似,放在/etc/rsyslog.d/目录下即可。配置完成后同样重启rsyslog。
五、日志完整性校验:防止日志被篡改
TLS只解决了传输过程的加密问题,日志落盘后仍然面临被篡改的风险。要保障日志完整性,有两种实用方案。
第一种是使用rsyslog的omfile模块配合文件哈希。在服务端配置中加入:
module(load="omfile"
FileOwner="root"
FileGroup="root"
FileCreateMode="0600"
DirCreateMode="0700")
# 每天生成日志文件的SHA256摘要
$ActionExecOnlyOnceEveryInterval 86400
$template DailyHash,"/var/log/remote/%HOSTNAME%/%$YEAR%%$MONTH%%$DAY%.sha256"
*.* ?DailyHash但更可靠的做法是配合外部工具。推荐使用auditd或者aide来监控日志文件完整性。安装aide:
yum install aide -y aide --init cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
然后把日志目录加入监控:
vim /etc/aide.conf
/var/log/remote/ R+p+i+n+u+g+s+m+S+sha512
每天定时运行aide --check,一旦发现日志文件哈希值变化就会告警。这种方式简单有效,适合大多数生产场景。
第二种方案是使用rsyslog的数字签名功能(rsyslog 8.x以上支持)。通过mmjsonparse模块对日志进行结构化处理后签名:
module(load="mmjsonparse")
template(name="SignedLog" type="string"
string="%timestamp:::date-rfc3339% %hostname% %syslogtag%%msg%\n")
*.* action(type="omfile" file="/var/log/signed/%HOSTNAME%/%$YEAR%%$MONTH%%$DAY%.log"
template="SignedLog")然后用外部脚本对日志文件做定期签名:
#!/bin/bash
LOGDIR="/var/log/signed"
SIGDIR="/var/log/signed/signatures"
mkdir -p $SIGDIR
for f in $LOGDIR/*/*.log; do
sha256sum "$f" > "$SIGDIR/$(basename $f).sha256"
done把这个脚本加入crontab每天执行,签名文件单独存储在不同磁盘或备份到远程,这样即使日志被改也能通过对比发现。
六、防火墙和SELinux的注意事项
配置TLS后,很多人会遇到连接不上的问题,十有八九是防火墙或SELinux在阻拦。先放行端口:
firewall-cmd --permanent --add-port=514/tcp firewall-cmd --reload
SELinux方面,rsyslog使用非标准端口或自定义证书路径时可能被拦截。查看审计日志:
ausearch -m avc -ts recent
如果发现deny记录,可以创建自定义策略:
ausearch -c 'rsyslogd' --raw | audit2allow -M rsyslog_tls semodule -i rsyslog_tls.pp
或者直接把SELinux设为permissive模式做测试(生产环境不推荐):
setenforce 0
七、验证整个链路是否正常工作
配置完不验证等于没配。在客户端发送一条测试日志:
logger -t test "This is a TLS encrypted log test"
在服务端查看是否收到,同时用tcpdump抓包确认传输内容是否加密:
tcpdump -i eth0 port 514 -A
如果看到的是乱码而不是明文syslog内容,说明TLS生效了。再检查日志文件是否正常写入,哈希值是否匹配。同时查看rsyslog自身的状态日志:
journalctl -u rsyslog -f
八、生产环境的几个实操建议
第一,证书有效期要设长一点,建议一年以上,但要建好到期提醒机制,证书过期后rsyslog会直接拒绝连接导致日志丢失。第二,客户端证书建议每台机器单独签发,方便出问题时精准定位和吊销。第三,日志存储建议用独立分区,避免系统盘满导致日志写入失败。第四,定期做一次全链路演练,模拟证书过期、网络中断、磁盘满等故障场景,确保监控告警能及时触发。第五,如果日志量很大,考虑在rsyslog前面加一层缓冲队列或者用Kafka做中转,避免TLS握手开销影响性能。
总结一下,CentOS上rsyslog的安全加固不是单一操作,而是证书管理、传输加密、落盘校验、访问控制的组合拳。把TLS通道搭好、把完整性校验做实、把权限和防火墙管严,日志安全这件事就基本到位了。
