如何在rsyslog配置中获取TLS客户端证书专有名称用于日志处理?
问题描述
我有如下rsyslog配置文件10-custom.conf,希望获取用于与rsyslog建立连接的TLS客户端证书的专有名称(CN、OU、L等):
module( load="imtcp" StreamDriver.Name="gtls" StreamDriver.Mode="1" StreamDriver.Authmode="x509/name" PermittedPeer="peers.mydomain.com" ) $DefaultNetstreamDriver gtls $DefaultNetstreamDriverCAFile ca-root.cer $DefaultNetstreamDriverCertFile rsyslog.cer $DefaultNetstreamDriverKeyFile syslog_private.key ruleset(name="tofile"){ action(type="omfile" file="/var/log/test.log") } input(type="imtcp" port="1514" ruleset="tofile")
请问是否可以访问上述专有名称属性进行日志处理?例如根据通用名称将日志发送到不同位置?以下是一个无法正常工作的示例:
if ($commonname contains "client1") then { action(type="omfile" file="/var/log/client1.log") } if ($commonname contains "client2") then { action(type="omfile" file="/var/log/client2.log") }
解决方案
可以实现根据TLS客户端证书的专有名称属性路由日志,但你使用的变量名不正确,需调整为rsyslog官方定义的TLS证书相关变量:
- 通用名称(CN)对应变量:
$tls_cert_cn - 组织单元(OU)对应变量:
$tls_cert_ou - 地理位置(L)对应变量:
$tls_cert_l - 其他属性对应变量:组织名(O)为
$tls_cert_o、国家代码(C)为$tls_cert_c等
同时需确保rsyslog版本在8.30.0及以上,这些证书属性变量是该版本后引入的。
修改后的规则配置示例:
ruleset(name="tofile"){ if ($tls_cert_cn contains "client1") then { action(type="omfile" file="/var/log/client1.log") stop # 避免日志匹配后续规则 } if ($tls_cert_cn contains "client2") then { action(type="omfile" file="/var/log/client2.log") stop } # 默认日志存储路径 action(type="omfile" file="/var/log/test.log") }
另外要确认TLS配置已正确启用客户端证书验证:
StreamDriver.Mode="1"表示强制使用TLSStreamDriver.Authmode="x509/name"表示基于证书名称验证对等方,会触发rsyslog提取证书属性变量- 确保
$DefaultNetstreamDriverCAFile指向的CA证书可正确验证客户端证书
内容的提问来源于stack exchange,提问作者dmuensterer
相关产品推荐
相关产品推荐

