【rsyslog系列】使用certtool构建安全的TLS通信证书链

【rsyslog系列】使用certtool构建安全的TLS通信证书链 1. 为什么需要TLS证书链保护rsyslog通信当你用rsyslog传输系统日志时数据就像明信片一样在网络中裸奔。我亲眼见过某企业内网被攻破后攻击者直接截获了所有系统日志连root用户的登录记录都看得一清二楚。这就是为什么从rsyslog v8开始官方强烈推荐使用TLS加密通信——相当于给你的日志数据装上保险箱。certtool这个工具可能很多人不熟悉它其实是GNUTLS套件里的瑞士军刀。相比openssl那些动辄十几页参数的命令certtool的操作简单得让人感动。最近帮客户升级rsyslog时发现新版openssl砍掉了不少老接口导致rsyslog编译都报错。这时候certtool的优势就出来了——它不依赖openssl的版本用gnutls的库就能搞定全套证书体系。2. 搭建证书体系的准备工作2.1 环境配置实战不同Linux发行版的安装命令差异经常让人头疼。在CentOS 8上实测时发现gnutls-utils包被拆分了得用这个命令才能装全dnf install gnutls-utils gnutls-dane gnutls-c而Ubuntu 22.04则需要额外安装开发包apt install gnutls-bin libgnutls28-dev建议先运行certtool --version检查是否安装成功。我遇到过最坑的情况是系统存在多个版本冲突这时候得用whereis certtool确认调用路径。2.2 建立证书目录结构新手常犯的错误是把所有证书扔在同一个目录。建议按这个结构组织/tls_certs/ ├── ca/ │ ├── ca-key.pem # 根密钥 │ └── ca.pem # 根证书 ├── client/ │ ├── cert.pem # 客户端证书 │ └── key.pem # 客户端密钥 └── server/ ├── cert.pem # 服务端证书 └── key.pem # 服务端密钥用mkdir -p创建多级目录时记得用chmod 700保护私钥目录。去年有家公司就因为私钥权限设置太宽松被挖矿程序直接盗用了证书。3. 从零构建CA证书链3.1 生成CA私钥的注意事项执行这个命令时certtool --generate-privkey --outfile ca-key.pem --bits 2048密钥长度选2048位是平衡安全和性能的选择。有次客户非要上4096位密钥结果TLS握手时间从200ms暴涨到800msrsyslog队列直接堆积。建议在生成密钥时加上--sec-param high参数这样certtool会自动选择合适的安全参数。3.2 自签名CA证书的关键配置生成CA证书时最容易踩的坑是有效期设置。有次我忘了改默认值结果证书三个月后就过期了半夜被报警短信吵醒。建议这样生成certtool --generate-self-signed \ --load-privkey ca-key.pem \ --outfile ca.pem \ --template ca-template.txt配套的模板文件ca-template.txt应该包含# X.509证书属性 cn My Internal CA expiration_days 3650 ca cert_signing_key crl_signing_key重点注意一定要包含ca和cert_signing_key这两个标记否则后续签发证书时会报invalid CA certificate错误。4. 签发服务端与客户端证书4.1 服务端证书的特殊配置服务端证书必须包含服务器实际使用的域名或IP。在模板文件中要设置dns_name logsrv.example.com ip_address 192.168.1.100 tls_www_server曾经有客户在Kubernetes环境里因为只配了IP没配DNS名导致证书验证失败。现代TLS实现会同时检查SAN(Subject Alternative Name)和CN(Common Name)所以建议两个都填。4.2 客户端证书的批量生成技巧当需要给上百台服务器配客户端证书时可以用这个脚本自动化#!/bin/bash for i in {1..100}; do certtool --generate-privkey --outfile client-$i-key.pem certtool --generate-request --template client-template.txt --load-privkey client-$i-key.pem --outfile client-$i-request.pem certtool --generate-certificate --load-request client-$i-request.pem --load-ca-certificate ca.pem --load-ca-privkey ca-key.pem --outfile client-$i-cert.pem done关键是在client-template.txt中设置tls_www_client这个标记告诉certtool生成的是客户端专用证书否则rsyslog会报peer certificate not for TLS web client authentication错误。5. 证书部署与验证5.1 rsyslog服务端配置要点在/etc/rsyslog.conf中添加TLS配置时路径一定要用绝对路径# 服务端配置 global( DefaultNetstreamDrivergtls DefaultNetstreamDriverCAFile/tls_certs/ca/ca.pem DefaultNetstreamDriverCertFile/tls_certs/server/cert.pem DefaultNetstreamDriverKeyFile/tls_certs/server/key.pem ) input( typeimtcp port6514 StreamDrivergtls StreamDriverMode1 # 1双向认证 StreamDriverAuthModex509/name PermittedPeer[client.example.com] )StreamDriverMode的取值特别容易混淆0服务器不验证客户端证书1双向验证推荐2客户端必须提供证书但不验证5.2 客户端配置避坑指南客户端配置最常见的错误是时间不同步# 客户端配置 action( typeomfwd Targetlogsrv.example.com Port6514 Protocoltcp StreamDrivergtls StreamDriverMode1 StreamDriverAuthModex509/name StreamDriverPermittedPeers[logsrv.example.com] )遇到证书错误时先用这个命令测试连通性gnutls-cli --insecure --port 6514 logsrv.example.com如果看到Handshake was completed但rsyslog连不上八成是SELinux在作怪。用audit2allow工具生成新策略模块就能解决。6. 证书生命周期管理6.1 证书过期监控方案建议在crontab里添加定期检查0 0 * * * /usr/bin/find /tls_certs/ -name *.pem -exec openssl x509 -checkend 86400 -noout -in {} \; -print | mail -s 证书过期预警 adminexample.com这个命令会检查所有证书是否在24小时(86400秒)内过期。更专业的做法是用Prometheus的ssl_exporter做监控。6.2 证书撤销列表(CRL)实战当员工离职需要吊销证书时# 生成CRL certtool --generate-crl --load-ca-privkey ca-key.pem --load-ca-certificate ca.pem --load-certificate revoked-certs.pem --outfile ca-crl.pem # rsyslog配置添加 global( DefaultNetstreamDriverCRLFile/tls_certs/ca/ca-crl.pem )被吊销的证书要保存到revoked-certs.pem文件中每行一个证书PEM内容。记得定期更新CRL文件否则吊销不会生效。7. 高级调试技巧遇到TLS握手失败时先开启rsyslog调试模式rsyslogd -dn /var/log/rsyslog-debug.log 21重点关注这些错误码-110通常表示证书过期或时间不同步-54证书链验证失败-80密钥不匹配对于偶发性的连接中断可以用tcpdump抓包分析tcpdump -i eth0 -w tls.pcap port 6514然后用Wireshark解密TLS流量需要导入服务器私钥能直观看到握手失败的具体阶段。