【问题标题】:rsyslog x509/certvalid requiring permitted peerrsyslog x509/certvalid 需要允许的对等方
【发布时间】:2016-05-20 09:02:53
【问题描述】:

编辑:在与此问题作斗争之后,实际上似乎是许多不同的问题都在有关 Rsyslog 的一些一般问题下混在一起。 因此,对问题进行了更好的“TL;DR”摘要:“将 Rsyslog 与 TLS 结合使用会产生许多模糊/混淆的问题。我怎样才能使其工作?”我的答案总结如下。


原帖:

我一直在努力让rsyslog 将 TLS 从客户端输出到服务器,特别是在使用“指纹”或“证书有效”模式时。

我有多台机器,其中一台是通过 TCP/TLS 在端口 11514 上接收 syslog 数据的服务器。其余机器是发送 TCP/TLS 的客户端。所有证书都使用相同的证书颁发机构签名(其密钥存储在其他地方)。这些机器不直接连接到公共 IP 地址,也没有 DNS 条目。

根据可用于哪个平台的版本(从 7.6 到 8.4),即使尝试在它们之间共享相似的配置,不同的机器也会表现出不同的行为。 gtls 模块被证明是一个不变的、反复无常的麻烦,因为它会在每台机器上以奇怪的、不同的方式出错。它可能会出错,具体取决于配置行的顺序,或者我是否使用 Rainer-script 样式或使用 Legacy 样式或在证书的 CN 中使用机器的主机名或没有,等等等等。

虽然每种模式的具体功能没有得到很好的记录(在查看了这样的稀疏解释后:http://www.rsyslog.com/doc/ns_gtls.html),但我选择不使用“x509/name”,因为它似乎没有用对我来说任何目的。除非我弄错了,否则“x509/name”会将服务器上安装的机器证书的 CN 与 PermittedPeers 中的任何内容相匹配。但是,与所有示例相反,我的机器没有 DNS 条目,因此证书的 CN 完全是任意的。 (但是,对于最后一台机器的配置,gtls 继续失败,直到我使 CN 与我的主机名匹配。巧合还是发生了什么......?)

我只想对每台机器上的签名证书进行相互验证(因为它们是相同的签名证书以及我使用“x509/certvalid”的原因)。我也不反对通过证书指纹进行验证,如果我能够让它工作(或找到关于具体如何工作的文档)。

在我的最后一台机器上,我收到一条错误消息,指出远程主机的名称(rsyslog 服务器)与允许的对等方不匹配。 为什么它甚至需要 “x509/certvalid”,我不知道。然后我尝试将服务器证书的指纹添加到允许的对等点(在我对预期格式的最佳猜测中,有或没有冒号、“:”或“SHA1:”)。都以同样的方式失败,我不知道为什么。

值得注意的是,在我不得不更改所有机器上的所有证书之前,这台机器上的这个设置确实有效(使用我一直使用的相同方法:http://www.rsyslog.com/doc/tls_cert_machine.html)。然后一系列荒谬的失败接踵而至:未能加载 gtls,未能使用带有新样式 action(type="omfwd"...) 等的 Legacy 选项,service rsyslog restartsystemctl restart rsyslogkill -HUP $(pidof rsyslog) 全部挂起或保持奇数不同的状态。在最终的配置优化和完整的机器重启后(嘘,不确定这是系统问题还是其他问题......),我留下了一个允许的从该客户端生成的对等错误......

客户端机器的rsyslog版本:

rsyslogd 8.4.2, compiled with:
    FEATURE_REGEXP:                         Yes
    GSSAPI Kerberos 5 support:              Yes
    FEATURE_DEBUG (debug build, slow code): No
    32bit Atomic operations supported:      Yes
    64bit Atomic operations supported:      Yes
    memory allocator:                       system default
    Runtime Instrumentation (slow code):    No
    uuid support:                           Yes
    Number of Bits in RainerScript integers: 64

客户端机器rsyslog.conf的片段:

$DefaultNetstreamDriverCAFile /folder/ca_cert.pem
$DefaultNetstreamDriver gtls
$DefaultNetstreamDriverCAFile /folder/ca_cert.pem
$DefaultNetstreamDriverCertFile /folder/client1_cert.pem
$DefaultNetstreamDriverKeyFile /folder/client1_key.pem
$ActionSendStreamDriverAuthMode x509/certvalid
$ActionSendStreamDriverMode 1
...
ruleset(name="forwardtls") {
    action(type="omfwd" target="192.168.1.1" port="11514" protocol="tcp"
      ResendLastMSGOnReconnect="on" StreamDriverMode="1"   
      StreamDriverAuthMode="x509/certvalid" 
      StreamDriverPermittedPeers="SHA1:AA:BB:CC:11:22:33:44:55:66:77:88:99:11:22:33:44:55:66:77:88")
}
*.* call forwardtls

客户端机器错误:

Feb  7 23:59:35 client2 rsyslogd-2087: authentication not supported by  gtls netstream driver in the configured authentication mode - ignored [try http://www.rsyslog .com/e/2087 ]
Feb  7 23:59:35 client2 rsyslogd-2007: action 'action 1' suspended, next retry is Wed Feb 10 00:00:05 2016 [try http://www.rsyslog .com/e/2007 ]
Feb 8 00:00:01 client2 rsyslogd-2088: error: peer name not authorized -  not permitted to talk to it. Names: CN: server1;  [try http://www.rsyslog .com/e/2088 ]

服务器机器的 rsyslog.conf 片段:

$ModLoad imtcp
$DefaultNetstreamDriver gtls
$DefaultNetstreamDriverCAFile /folder/ca_cert.pem
$DefaultNetstreamDriverCertFile /folder/server1_cert.pem
$DefaultNetstreamDriverKeyFile /folder/server1_key.pem
$InputTCPServerStreamDriverAuthMode x509/certvalid
$InputTCPServerStreamDriverMode 1
$InputTCPServerRun 11514

【问题讨论】:

    标签: linux ssl tcp x509 rsyslog


    【解决方案1】:

    任何人都可以猜到,这个“问题”不仅仅是一个“有效对等”错误。不幸的是,实际的解决方案将非常具体到发行版、发行版、rsyslog 版本以及许多其他不一致的东西,没有快速的答案就足够了。

    在没有答案(代替过于笼统的“元”答案)的情况下,经过多次挣扎和盯着这个问题,这就是我发现的......

    如果您计划将 Rsyslog 与 TLS 结合使用,您首先应考虑以下几点:您的系统有多不同或有多旧,以及您对失败有多大的耐心。如果您需要它立即运行,请准备好更改一些计划。

    首先,大多数发行版都是第一个问题。如果你想将 RELP 与 Rsyslog 的 TLS 一起使用,你至少需要 Rsyslog 版本 7.5。一些发行版(尤其是基于 RedHat 的发行版)只有 7.4 版。即使是较旧的基于 Debian 的 LTS 发行版也没有足够新的版本来完全支持 Rainer 脚本。想知道一切所需的特定版本吗?开始挖掘更新日志或其他令人沮丧的论坛帖子。

    不要指望文档会告诉您所需的一切。虽然总体上非常好,但在线文档有时会出现问题。 (例如,“omrelp”模块显示了 TLS 指纹的确切格式,但带有 TLS 的普通“tcp”不显示;“omrelp”有示例全部采用 Rainer 脚本格式,但带有 TLS 的普通“tcp”没有)

    预计故障排除会很痛苦。不幸的是,Rsyslog 将 GnuTLS 合并到所有内容中,但也将日志消息推送到 GnuTLS。根据它在创建 TCP 连接、身份验证、确定正确的加密等过程中所处的位置,它会生成非常不透明的 GnuTLS 错误代码(当您查找它们或天真地挖掘答案时,这通常只会误导您从真正的问题在 GnuTLS 源代码中)和在线参考 URL(可能有也可能没有对任何有用的简短、模糊的引用)。

    有时 rsyslog 会告诉您连接不是来自授权对等方。有时它不会。我有很多“GnuTLS 错误代码 -110”,原因从僵尸 TCP 套接字到错误键入配置中的文件名。这些代码几乎没用。更糟糕的是,一些客户端安装对错误只字不提,因为它不会在 rsyslog 服务启动之后默默地记录任何内容(而且似乎还会破坏其他服务,可能是那些触及相同 unix 套接字的服务,尽管我不完全确定)。

    旧的发行版会给你带来痛苦。使用不同版本的 Rsyslog 的不同发行版也会导致非常不同的结果。例如,在最近的 Debian 构建(使用 Systemd)中,运行“service rsyslog stop”将正常停止它,但“systemctl stop rsyslog”将“停止”服务,但 rsyslogd 进程可能仍在运行背景。哎呀?如果您尝试重新启动 rsyslog 进程,很多时候服务器和客户端之间的 TCP 会话不会关闭 (FIN),从而导致新进程失败。

    不过,不要期望任何这些都会被“-N”选项捕获(因为它始终适用于语法)。

    调整配置的最佳建议:通过三次检查您的配置(包括所有文件名和任何声明的文件名的权限)自行弄清楚,停止服务,终止进程,等待几分钟让任何 TCP 会话超时,再试一次。否则,您可能会在具有旧配置和无效套接字的旧进程上运行新服务。

    如果您想从 rsyslog 存储库(“adiscon”)安装,以获取最新的 relp、Rainer 脚本等,它可能工作得很好,或者您可能仍然遇到上述问题和其他问题。在 Ubuntu 安装中,rsyslog、rsyslog-relp 和 rsyslog-gnutls 被拆分为单独的包,有人决定重叠核心文件,从而有效地破坏了安装。 (为什么几个月前发现这个问题时没有解决??)

    在某些安装中,第一次一切正常。在某些安装中,您会用头撞键盘。

    替代方案:

    -- 使用 RELP 或普通 UDP syslog 结合 stunnelsslwrap 或类似的。最好使用指向本地 TLS 隧道端口的 RELP。这样,如果您的隧道出现故障(与 Rsyslog 分开),它可以将日志排队直到修复(在该队列填满之前快速)。

    -- 使用 syslog-ng。如果您一开始就经历了足够的痛苦,为什么不尝试一个完整的替代方案...

    【讨论】:

      【解决方案2】:

      这是我不使用 DNS 条目的环境的工作配置:

      服务器和客户端具有相同的 rsyslog 版本:

      rsyslogd 8.16.0, compiled with:
      PLATFORM:               x86_64-pc-linux-gnu
      PLATFORM (lsb_release -d):      
      FEATURE_REGEXP:             Yes
      GSSAPI Kerberos 5 support:      Yes
      FEATURE_DEBUG (debug build, slow code): No
      32bit Atomic operations supported:  Yes
      64bit Atomic operations supported:  Yes
      memory allocator:           system default
      Runtime Instrumentation (slow code):    No
      uuid support:               Yes
      Number of Bits in RainerScript integers: 64
      

      (我也使用 x509/certvalid 而不是 x509/name)

      重要:

      • 在证书步骤中使用 IP 地址而不是名称

      • 检查系统日志帐户是否可以读取三个文件 ca-pm、client/server-cert.pm 和 client_server-key.pm(我必须在 client-key.pm 上 chmod 444)

      在服务器上:

      apt-get install rsyslog-gnutls

      /etc/rsyslog/conf(我刚刚开始... - 但顺序很重要!):

      #  /etc/rsyslog.conf    Configuration file for rsyslog.
      #
      #                       For more information see
      #                       /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html
      #
      #  Default logging rules can be found in /etc/rsyslog.d/50-default.conf
      
      
      #################
      #### MODULES ####
      #################
      
      
      $ModLoad imuxsock # provides support for local system logging
      $ModLoad imklog   # provides kernel logging support (previously done by rklogd)
      $ModLoad immark  # provides --MARK-- message capability
      
      
      ################
      #####TLS#######
      ###############
      
      # make gtls driver the default
      $DefaultNetstreamDriver gtls
      
      # certificate files
      $DefaultNetstreamDriverCAFile /home/server/ca.pem
      $DefaultNetstreamDriverCertFile /home/server/server-cert.pem
      $DefaultNetstreamDriverKeyFile /home/server/server-key.pem
      
      
      $ModLoad imtcp
      
      
      $InputTCPServerStreamDriverAuthMode x509/certvalid
      $ActionSendStreamDriverPermittedPeer=["CLIENT_IP"]
      $InputTCPServerStreamDriverMode 1
      $InputTCPServerRun 10514
      

      服务 rsyslog 强制重新加载

      在客户端:

      (保留 /etc/rsyslog.conf 中的默认设置):

      • apt-get install rsyslog-gnutls

      触摸 /etc/rsyslog.d/lts.conf :

      # make gtls driver the default
      $DefaultNetstreamDriver gtls
      
      # certificate files
      $DefaultNetstreamDriverCAFile /home/client/ca.pem
      $DefaultNetstreamDriverCertFile /home/client/client-cert.pem
      $DefaultNetstreamDriverKeyFile /home/client/client-key.pem
      
      #### GLOBAL DIRECTIVES ####
      
      # Use default timestamp format
      $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
      
      # gtls Network Stream Driver
      #  x509/name - certificate validation and subject name authentication
      #  http://www.rsyslog.com/doc/ns_gtls.html
      $ActionSendStreamDriverAuthMode x509/certvalid
      $ActionSendStreamDriverPermittedPeer=["COLLLECTOR_IP"]
      $ActionSendStreamDriverMode 1
      
      
      *.*                                              @@COLLLECTOR_IP:10514
      

      服务 rsyslog 强制重新加载

      【讨论】:

      • 我不敢相信这么久后终于有答案了!我正在使用对等证书哈希"SHA1:123abc..." 做我允许的对等,并且效果很好。 IP 在我的网络场景(NAT/转发)中并不总是有效。我认为service rsyslog force-reloadservice rsyslog restart 没有重置套接字(至少)所以这是我的主要问题。我所知道的是,任何时候我必须触摸 CentOS 6,我现在都会采取胎儿的姿势。
      猜你喜欢
      • 2010-10-13
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 2010-10-18
      相关资源
      最近更新 更多