用rsyslog进行加密传输

本文最后更新于2016年12月17日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!

=Start=

缘由:

工作需要、学习需要,所以翻译了一下rsyslog的一篇官方文档,方便自己进行配置,记录在此也方便有需要的人进行参考。

参考解答:

概述

本文档描述了一个设置rsyslog TLS的安全方法。一个安全日志环境需要的不仅仅是加密传输通道。本文档提供了一个可能的方法来创建这样的一个安全系统。

Rsyslog的TLS认证非常灵活,从而可以支持多种安全策略。本部分试图给出一些适用于多种环境的场景的建议。然而,它可能并不适合你,所以请先评估你的安全需求再使用下面的建议。如果不提供您所需要的功能也请不要怪我们;)

我们的策略可以提供以下的安全效益:

  • 消息是加密传输的
  • syslog发送者需要提供认证给syslog接收者
  • syslog接收者也需要提供认证给syslog发送者
  • 双向认证可以预防MITM攻击

我们的安全目标是通过公私钥安全来建立的,所以,私钥的安全就至关重要了,私钥决不能被任意第三方得到。

如果私钥已经被第三方知道了,本系统不提供任何安全保证。另外,我们的解决方案基于X.509证书和一个(非常有限的)信任链。我们有一个CA记录了所有机器的证书。我们通过机器上的证书来鉴别机器的身份。在理论和实践上,可能有几个“sub-CA”为特定的adminitrative域分发证书,但并不包括在我们这个“简单又安全”的设置中。如果你打算使用这个方案,rsyslog会支持它,但你需要自己深入查阅文档(或通过论坛提问)。一般来说,如果你不使用我们的简单模型,你应该要有很好的理由(知道自己为什么这么做),清楚的知道你自己在做什么,否则可能会影响您整体的系统安全。

请注意,安全是需要努力才能达到的。在本文描述的场景中,我们尽量减少了需要的努力。剩下的就是一些对中央CA的设置,为各机器配置证书以及少量的配置命令的工作。在我们的配置过程中最大的限制性因素可能是——所有发送方和接收方必须支持IETF的syslog-transport-tls标准(尚未完成)。我们使用mandatory-to-implement技术,但你可能很难找到一个完成了所有需要功能的实现。更常见的不幸是,你会发现一个完全不支持即将到来的IETF标准的实现——特别是在“早期”(从2008年5月开始)当rsyslog是所谓标准的唯一实现。

幸运的是,rsyslog几乎支持所有的syslog协议。所以在发送方transport-tls不可用的情况下,我们推荐使用rsyslog作为最初的中继器。在这种模式下,not-capabe发送方通过另一个协议发送给rsyslog,然后通过transport-tls中继器将消息传递给另一个临时中继器或最终目的地(当然,这必须具有transport-tls能力)。在这种情况下,最好先试试看发送者能够支持哪些协议。也许可以使用行业标准——普通的tcp syslog。通常你甚至可以把它与stunnel结合,然后就可以把消息安全交付给第一个rsyslog中继器。如果上述条件都不满足,你可以(通常是必须…)诉诸于UDP。尽管这可能出现丢包并且也不安全,但这总比完全没有接收能力要好。它甚至可能是安全的,当uncapable发送者和第一个rsyslog中继器是通过私有网络通信的时候,如专用的网络链接。

最后一个警告:transport-tls只能保护发送者和接收者之间的连接,它没法防止存在于消息本身的攻击。特别是在中继环境中,消息可能是来源于一个恶意的系统,将无效的主机名和/或其他内容混在一起。如果没有提供这样的东西,这些记录可能出现在接收者的存储库中。transport-tls不能防止这种(但它可能对正确使用起到一定帮助)。谨记,syslog-transport-tls只能提供点到点的安全,它不保证端到端的安全,同时它并不验证消息本身(只是最后一个发送者)。

如果你想快速获取所有信息,可以看下面的图片,它包含了所有你需要知道的内容(从证书透视的角度来看)。如果你感到疑惑也不用觉得奇怪,在这种情况下,你可以看看完整的说明


操作步骤
0x01.安装v8-stable版本的rsyslog

下载地址:http://www.rsyslog.com/downloads/download-v8-stable/

# rpm -qa | grep rsyslog
# rsyslogd -v
# wget http://rpms.adiscon.com/v8-stable/rsyslog.repo
# ls -lt /etc/yum.repos.d/
# cp rsyslog.repo /etc/yum.repos.d/
# yum install rsyslog
# rsyslogd -v
0x02.设置一个证书颁发机构(CA)

参考链接:http://www.rsyslog.com/doc/v8-stable/tutorials/tls_cert_ca.html

# yum search gnutls-utils
# yum install gnutls-utils
生成私钥
# certtool --generate-privkey --outfile ca-key.pem --bits 2048
创建(自签名)的CA证书本身
# certtool --generate-self-signed --load-privkey ca-key.pem --outfile ca.pem
# chmod 400 ca-key.pem
0x03.生成&分发各机器需要的证书

参考链接:http://www.rsyslog.com/doc/v8-stable/tutorials/tls_cert_machine.html

# 在这一步中,我们为每个机器生成证书。请注意,客户端和服务器都需要证书。证书用于标识各机器的身份。证书中的 DNSName 属性可以通过:$<object>PermittedPeer进行设置。
# certtool --generate-privkey --outfile key.pem --sec-param 2048
# certtool --generate-request --load-privkey key.pem --outfile request.pem
# certtool --generate-certificate --load-request request.pem --outfile cert.pem --load-ca-certificate ca.pem --load-ca-privkey ca-key.pem
# rm -f request.pem
# ls -l
# mv cert.pem machine-cert.pem
# mv key.pem machine-key.pem
# 需要给机器提供以下几个文件:
a copy of ca.pem
cert.pem
key.pem
# 然后在目标机器的 rsyslog.conf 配置文件中通过以下指令进行设定:
$DefaultNetstreamDriverCAFile /path/to/proj/rsyslog/sample/ca.pem
$DefaultNetstreamDriverCertFile /path/to/proj/rsyslog/sample/machine-cert.pem
$DefaultNetstreamDriverKeyFile /path/to/proj/rsyslog/sample/machine-key.pem
0x04.设置中央日志服务器

参考链接:http://www.rsyslog.com/doc/v8-stable/tutorials/tls_cert_server.html

$ModLoad imuxsock # local messages
$ModLoad imtcp # TCP listener
# make gtls driver the default
$DefaultNetstreamDriver gtls
# certificate files
$DefaultNetstreamDriverCAFile /rsyslog/protected/ca.pem
$DefaultNetstreamDriverCertFile /rsyslog/protected/machine-cert.pem
$DefaultNetstreamDriverKeyFile /rsyslog/protected/machine-key.pem
$InputTCPServerStreamDriverAuthMode x509/name
$InputTCPServerStreamDriverPermittedPeer *.example.net
$InputTCPServerStreamDriverMode 1 # run driver in TLS-only mode
$InputTCPServerRun 10514 # start up listener at port 10514
0x05.设置日志客户端

参考链接:http://www.rsyslog.com/doc/v8-stable/tutorials/tls_cert_client.html

# make gtls driver the default
$DefaultNetstreamDriver gtls
# certificate files
$DefaultNetstreamDriverCAFile /rsyslog/protected/ca.pem
$DefaultNetstreamDriverCertFile /rsyslog/protected/machine-cert.pem
$DefaultNetstreamDriverKeyFile /rsyslog/protected/machine-key.pem
$ActionSendStreamDriverAuthMode x509/name
$ActionSendStreamDriverPermittedPeer central.example.net
$ActionSendStreamDriverMode 1 # run driver in TLS-only mode
*.* @@central.example.net:10514 # forward everything to remote server
0x06.其它
总结
如果你按照这篇文章中列出的操作步骤进行操作了的话,你现在应该就已经完成了一个合理的(可满足大多数情况的)安全设置——对于下图所示的环境而言:

在这个例子中您已经了解了其中涉及到的安全决策。但我们还是要再次提醒你必须确保你所做的能够满足你自己的安全需求。因为我们没法百分百保证我们讲的对你也是有用的,它可能并不适用于你的环境。

在这个例子中,我们创建了一个rsyslog证书颁发机构(CA)。保护CA的文件。当你需要为新机器颁发证书的时候你会需要他们。同时我们也看到自己如何生成机器证书和将它们分发给各个机器。同样,你发现了一些配置服务器、客户端和syslog中继器的样例。希望,这能使你在许多环境中建立一个类似的系统。

重要提示,你在生成证书的时候有设置一个过期时间,当超过过期时间的时候,证书就不再有效了,rsyslog也就不会接受它们,此时syslog消息就不会被传递出去(rsyslogd的压力会很大)。因此请记得在证书过期之前重新申请一下。在某个地方设置一个提示会是一个好办法。

参考链接:

=END=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/3036.html

《用rsyslog进行加密传输》上有3条评论

  1. 从”嘿,今晚…”谈消息安全传输中的技术点
    https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651960315&idx=1&sn=8592c5cd15732096bb3b84b3074a2d37

    黑客定理一:网络上传递的明文数据是不安全的,属于黑客公共场所,能被截取
    黑客定理二:客户端的代码是不安全的,属于黑客本地范畴,能被逆向工程,任何客户端与服务端提前约定好的算法与密钥都是不安全的
    黑客定理三:用户客户端内存是安全的,属于黑客远端范畴,不能被破解

    总结:
    · 明文消息传递如同裸奔,不安全
    · 客户端和服务端提前约定加密算法和密钥,不安全(好多公司都是这么实现的=_=)
    · 服务端随机生成密钥,发送给客户端,不安全
    · 一人一密,客户端使用“具备用户特性的东西”作为加密密钥,弱安全
    · 一次一密,三次握手建立安全信道,安全

发表评论

电子邮件地址不会被公开。 必填项已用*标注