为什么 rsyslog 无法正常工作?

为什么 rsyslog 无法正常工作?

rsyslog 无法向/var/log/messages外部系统日志收集器发送消息,如下所述。

我有一个 AWS EC2 RHEL 7 实例和一个本地 RHEL 7 实例。它们都是最小安装、标准 AMI 等。rsyslog配置是默认的,除了添加.conf文件以/etc/rsyslog.d/将日志记录发送到外部系统日志收集器。本地实例将系统日志发送到本地收集器。 AWS 实例将其发送到基于 EC2 的收集器。两个收集器在相同的配置中运行相同的软件,并从其他源接收事件,并且在其他情况下正常运行。

/etc/rsyslog.conf两个实例之间是相同的。以下是未注释的行:

# grep -v "^#\|^$" /etc/rsyslog.conf
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
*.*;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 :omusrmsg:*
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log

在云实例上添加了/etc/rsyslog.d/21-cloudinit.conf

# Log cloudinit generated log messages to file
:syslogtag, isequal, "[CLOUDINIT]" /var/log/cloud-init.log

# comment out the following line to allow CLOUDINIT messages through.
# Doing so means you'll also get CLOUDINIT messages in /var/log/syslog
& stop

在这两个实例上还有/etc/rsyslog.d/listen.conf

# cat /etc/rsyslog.d/listen.conf
$SystemLogSocketName /run/systemd/journal/syslog

在这两个实例上/etc/rsylog.d/xdr.conf都已添加。它仅因系统日志消息的目的地而异,请参见下文。

云实例:

# cat /proc/version
Linux version 3.10.0-1160.62.1.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Wed Mar 23 09:04:02 UTC 2022

# yum list installed | grep rsyslog
rsyslog.x86_64               8.24.0-57.el7_9.2 @rhel-7-server-rhui-rpms

# cat /etc/rsyslog.d/xdr.conf
# Forward all log messages to Taegis XDR
# AWS Collector
*.*    @@aws-v-xxxxxx-xxxxxx-xxxxxxxxxxxxx.elb.us-east-1.amazonaws.com:601

# On-Prem Collector
#*.*    @@scwx-collector.xxx.local:601

本地实例:

# cat /proc/version
Linux version 3.10.0-1160.62.1.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Wed Mar 23 09:04:02 UTC 2022

# yum list installed | grep rsyslog
rsyslog.x86_64                    8.24.0-57.el7_9.2          @rhel-7-server-rpms

# cat /etc/rsyslog.d/xdr.conf
# Forward all log messages to Taegis XDR
# AWS Collector
#*.*    @@aws-v-xxxxxx-xxxxxx-xxxxxxxxxxxxx.elb.us-east-1.amazonaws.com:601

# On-Prem Collector
*.*    @@scwx-collector.xxx.local:601

中列出的端点xdr.conf可从端口 601 上的每个实例访问。我通过快速telnet会话独立确认。

# telnet scwx-collector.xxx.local 601
Trying 10.100.11.37...
Connected to scwx-collector.xxx.local.
Escape character is '^]'.

# telnet aws-v-xxxxxx-xxxxxx-xxxxxxxxxxxxx.elb.us-east-1.amazonaws.com 601
Trying 10.200.2.89...
Connected to aws-v-xxxxxx-xxxxxx-xxxxxxxxxxxxx.elb.us-east-1.amazonaws.com.
Escape character is '^]'.

AWS 实例运行良好。系统日志消息被传送到收集器和/var/log/messages.本地服务器无法将消息传送到这两个位置。

在本地服务器上,如果我重命名xdr.confxdr.conf.bak重新启动rsyslog服务,/var/log/messages则会立即开始填充。启用后xdr.conf,它们是空的 - 不会显示更多条目。外部系统日志收集器不显示任何接收到的事件,也不tcpdump显示系统日志端点之间传输的任何数据包。

为什么 rsyslog 不向/var/log/messages外部收集器发送消息?唯一的区别是它发送消息的端点,据我所知,这些端点都是可访问的并且正常运行。甚至系统日志收集器端点也是相同的配置。两个操作系统相同,rsyslog 版本相同。我该如何进一步解决这个问题?

答案1

我最终发现这是 SELinux 引起的问题。

我发现 SELinux 拒绝访问该/etc/rsyslog.d/xdr.conf文件。当进一步调查时,我看到以下输出:

[root@x rsyslog.d]# ls -Z
-rw-r--r--. root root system_u:object_r:syslog_conf_t:s0 listen.conf
-rw-r--r--. root root unconfined_u:object_r:syslog_conf_t:s0 test.conf
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 xdr.conf
-rw-r--r--. root root unconfined_u:object_r:syslog_conf_t:s0 xdr.orig

我发现该xdr.conf文件应用了错误的上下文。但是,当我复制xdr.conf到时xdr.orig,我看到应用了正确的上下文。

通过运行restorecon -Rv /etc/rsyslog.d我发现它重置了上下文:

[root@x rsyslog.d]# restorecon -Rv /etc/rsyslog.d
restorecon reset /etc/rsyslog.d/xdr.conf context unconfined_u:object_r:admin_home_t:s0->unconfined_u:object_r:syslog_conf_t:s0

我怀疑这个问题发生在这些本地服务器上,因为我xdr.conf通过 psftp 将文件上传到该/root文件夹​​,然后将其移动到/etc/rsyslog.d.因此,我认为该文件收到了错误的上下文,这就是 SELinux 拒绝它的原因。在 AWS 实例上,我使用 SSM 将文件推送到实例,显然在这种情况下它收到了正确的上下文。restorecon修复了上下文,问题就解决了。

在我的研究过程中,我还意识到我使用的是过时的配置,并更新了我的配置,如下所示:

# Forward all log messages to Taegis XDR
# AWS Collector
#*.*     action(type="omfwd" target="aws-v-xxxxxx-xxxxxx-xxxxxxxxxxxxx.elb.us-east-1.amazonaws.com" port="601" protocol="tcp"
                action.resumeRetryCount="-1"
                queue.type="linkedList" queue.size="10000")

# On-Prem Collector
*.*     action(type="omfwd" target="scwx-collector.xxx.local" port="601" protocol="tcp"
                action.resumeRetryCount="-1"
                queue.type="linkedList" queue.size="10000")

相关内容