首页 / 帮助文档 / centos安全之rsyslog加密传输与日志完整性

centos安全之rsyslog加密传输与日志完整性

在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通道搭好、把完整性校验做实、把权限和防火墙管严,日志安全这件事就基本到位了。