rsyslog x509 / certvalid要求允许的对等体

时间:2016-02-10 06:01:18

标签: linux ssl tcp x509 rsyslog

编辑:在与这个问题作斗争之后,似乎实际上有许多不同的问题在Rsyslog的一些一般性问题下汇集在一起​​。  因此,问题的一个更好的“TL; DR”总结:“使用Rsyslog和TLS会产生许多模糊/混淆的问题。我怎样才能使它工作?”我的回答摘要如下。

原始邮件:

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

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

根据哪个版本可用于哪个版本(范围从7.6到8.4),不同的计算机即使在尝试共享其中的类似配置时也会表现出不同的行为。 gtls模块被证明是一个持续的,变化无常的麻烦,因为它会以奇怪的,不同的方式为每台机器出错。它可能会出错,具体取决于配置行的顺序,或者我是否使用了Rainer脚本样式或使用了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"...)service rsyslog restart和{{1}的新样式systemctl restart rsyslog等等的旧版选项所有悬挂或留在奇怪的不同状态。在最后的配置抛光和完整的机器重启(boo,不确定这是否是系统问题或其他...)之后,我留下了从该客户端生成的允许的对等错误......

客户端计算机的rsyslog版本:

kill -HUP $(pidof 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

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

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 ]

2 个答案:

答案 0 :(得分:5)

任何人都可以猜到,这个"问题"不仅仅是一个有效的同行,而且不仅仅是一个有效的同行。错误。不幸的是,实际的解决方案将非常特定于发行版,发行版,rsyslog版本以及许多其他不一致的事情,没有快速回答就足够了。

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

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

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

不要期望文档告诉您所需的一切。虽然通常非常好,但在线文档有时会出错。 (例如," omrelp"模块显示TLS指纹的确切格式,但普通" tcp" TLS没有;" omrelp"示例全部在Rainer脚本中格式但简单" tcp" TLS没有)

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

有时rsyslog会告诉您连接不是来自授权对等方。有时它不会。我有很多" GnuTLS错误代码-110"原因从僵尸TCP套接字到错误输入配置文件名。这些代码几乎没用。更糟糕的是,一些客户端安装不会对错误说什么,因为它会默默地不记录任何经过rsyslog服务启动的东西(并且似乎也会破坏其他服务,可能是那些触及相同unix套接字的服务,尽管我并不完全确定)。

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

不要指望任何一个被" -N"但是选项(因为它只能始终用于语法)。

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

如果你想从rsyslog repo(" adiscon")安装,获取最新的relp,Rainer脚本等,它可能工作得很好,或者你可能仍然有上述问题复杂化与其他问题。在Ubuntu安装上,使用rsyslog,rsyslog-relp和rsyslog-gnutls拆分成单独的包,有人决定重叠核心文件,有效地破坏了安装。 (为什么几个月前注意到这个问题并没有得到解决?)

在某些安装中,一切都会在第一时间正常工作。在某些安装中,你会把头撞在键盘上。

备选方案:

- 使用RELP或普通UDP系统日志与 stunnel sslwrap 或类似方法相结合。最好使用RELP指向本地TLS隧道端口。这样,如果您的隧道出现故障(单独从Rsyslog),它可以将日志排队直到固定(快速 - 在该队列填充之前)。

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

答案 1 :(得分: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地址代替证书步骤的名称

  • 检查syslog帐户是否可以读取三个文件ca-pm,client / server-cert.pm和client_server-key.pm(我必须在client-key.pm上使用chmod 444)

    < / LI>

在服务器上:

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 force-reload

在客户端:

(保留/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 force-reload