You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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" 表示强制使用TLS
  • StreamDriver.Authmode="x509/name" 表示基于证书名称验证对等方,会触发rsyslog提取证书属性变量
  • 确保$DefaultNetstreamDriverCAFile指向的CA证书可正确验证客户端证书

内容的提问来源于stack exchange,提问作者dmuensterer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 06:31:15