在 Ubuntu 20.04 上设置 Rsyslog 服务器

在本教程中,您将学习如何在 Ubuntu 20.04 上设置 rsyslog 服务器。 Rsyslog 是 syslogd(一个提供消息记录支持的系统实用程序)的多线程实现,其特性包括:

  • 基于 TCP、SSL/TLS 和 RELP 的可靠系统日志
  • 按需磁盘缓冲
  • 电子邮件提醒
  • 写入 MySQL 或 PostgreSQL 数据库(通过单独的输出插件)
  • 允许的发件人列表
  • 过滤系统日志消息的任何部分
  • 在线消息压缩
  • 细粒度的输出格式控制
  • 故障转移到备份目的地
  • 企业级加密系统日志中继
    .
    它是 Debian 系统上的默认 syslogd。

Rsyslog 可以在客户端/服务器模型中进行配置。 当配置为客户端时,它通过 TCP/UDP 协议通过网络将日志发送到远程服务器。 作为服务器,它通过网络从远程客户端在端口 514 TCP/UDP 或任何配置为侦听的自定义端口上接收日志。

Rsyslog 根据选定的过滤器过滤 syslog 消息。 您可能想查看我们之前关于 rsyslog 过滤器基本介绍的文章。

在 Ubuntu 20.04 上设置 Rsyslog 服务器

您在使用 Debian 10 吗? 检查下面的链接;

在 Debian 10 上设置 Rsyslog 服务器

在 Ubuntu 20.04 上安装 Rsyslog

Rsyslog 是 Debian 系统上的默认 syslogd,通常默认安装在 Ubuntu 20.04 上。

您可以通过检查已安装 rsyslog 的版本来验证这一点。

apt list -a rsyslog
Listing... Done rsyslog/focal-updates,now 8.2001.0-1ubuntu1.1 amd64 [installed,automatic] rsyslog/focal 8.2001.0-1ubuntu1 amd64

如果由于任何原因未安装,请运行以下命令进行安装。

apt update
apt install rsyslog -y

安装完成后,启动并启用 rsyslog 服务。

systemctl enable --now rsyslog

在 Ubuntu 20.04 上设置 Rsyslog 服务器

现在 rsyslog 已安装并运行,您需要将其配置为在服务器模式下运行。 如上所述,rsyslog 可以配置为客户端以将日志发送到中央日志服务器或服务器以接收和存储来自其他系统的日志。

在本指南中,我们将 Rsyslog 设置为 Ubuntu 20.04 机器上的服务器。

打开ryslog配置文件进行编辑;

vim /etc/rsyslog.conf

定义 Rsyslog 服务器协议和端口

首先,定义要接收日志的协议和端口。

您可以选择使用 UDP 或 TCP 以及您选择的任何端口。

请注意,TCP 系统日志接收比 UDP 系统日志更可靠,而且速度仍然相当快。 主要原因是,UDP 可能会丢失消息。 当系统日志服务器必须接收大量突发消息时,就会发生这种情况。 如果 UDP 的系统缓冲区已满,则将丢弃所有其他消息。 使用 TCP,这不会发生。 但有时也配置一个 UDP 服务器可能会很好。 也就是说,因为某些设备(如路由器)无法按设计发送 TCP 系统日志。 在这种情况下,您需要两种 syslog 服务器类型才能涵盖所有内容。

在此设置中,我们将配置 Rsyslog 以使用 UDP 和 TCP 协议分别通过端口 514 和 50514 接收日志。

默认情况下,UDP 系统日志在端口 514 上接收。

启用 UDP 系统日志接收:

/etc/rsyslog.conf 配置文件中,取消注释 UDP syslog 接收行 模块 部分如下图;

... ################# #### MODULES #### ################# ...  # provides UDP syslog reception module(load="imudp") input(type="imudp" port="514") 

启用 TCP 系统日志接收:

TCP syslog 可能需要使用不同的端口,因为 RPC 服务通常也使用此端口。

要将 rsyslog 设置为在不同的 TCP 端口上运行,例如 TCP 端口, 50514, 取消 TCP 接收行的注释并更改端口,如下所示;

# provides TCP syslog reception module(load="imtcp") input(type="imtcp" port="50514")

Save 并退出文件;

重启rsyslog服务;

systemctl restart rsyslog

验证 rsyslog 现在正在侦听两个端口;

ss -4altunp | grep 514
udp    UNCONN  0       0                   0.0.0.0:514            0.0.0.0:*      users:(("rsyslogd",pid=52382,fd=5))                                             tcp    LISTEN  0       25                  0.0.0.0:50514          0.0.0.0:*      users:(("rsyslogd",pid=52382,fd=7))

您可能会注意到 UDP 端口没有 LISTEN 状态,因为它是无连接的,并且没有“侦听”、“建立”、“关闭”等概念。

允许 Rsyslog 通过防火墙

如果防火墙正在运行,请通过它打开 rsyslog。

ufw allow 514/udp
ufw allow 50514/tcp

定义允许的发件人

您可能还想明确设置允许将 syslog 消息发送到 rsyslogd 的远程客户端。 为此,您可以使用以下命令设置全局指令 $AllowedSender 指示。

可以分别为 UDP 和 TCP 发件人定义允许的发件人列表。 指定它们的语法是:

$AllowedSender [UDP/TCP], ip[/bits], ip[/bits]

  • ip[/bits] 是机器或网络 IP 地址,如“192.0.2.0/24”或“192.0.2.10”。 如果 /位 省略部分,假定为单个主机。 “/0”是不允许的,因为它会匹配任何发送系统。
  • 主机名也可以提供带和不带通配符的 。 如果是,则使用反向 DNS 解析的结果进行过滤。 可以在逗号分隔的列表中指定多个允许的发件人。

最好先指定高流量的发件人,然后再指定低流量的发件人。

要允许特定主机进行 UDP 或 TCP 日志记录,请输入以下行;

vim /etc/rsyslog.conf
... ########################### #### GLOBAL DIRECTIVES #### ########################### # $AllowedSender - specifies which remote systems are allowed to send syslog messages to rsyslogd $AllowedSender UDP, 192.168.57.0/24, [::1]/128, *.example.net, servera.example.com $AllowedSender TCP, 192.168.58.0/24, [::1]/128, *.example.net, servera.example.com

主机名必须是可解析的,因为在更新 ACL 之前,它们将被解析为各自的 IP。

另请注意,上述指令仅允许来自 192.168.57.0/24 和 TCP 接收来自 192.168.58.0/24.

与通过此指令允许特定主机一样,通过防火墙强加允许的发件人限制是一个好主意。

例如,允许主机从 192.168.57.0/24192.168.58.0/24 网络;

ufw allow from 192.168.57.0/24 to any port 514 proto udp ufw allow from 192.168.57.0/24 to any port 50514 proto tcp
ufw allow from 192.168.58.0/24 to any port 514 proto udp ufw allow from 192.168.58.0/24 to any port 50514 proto tcp

配置 Rsyslog 模板

模板是 rsyslog 的一个关键特性。 rsyslog 生成的任何输出都可以根据您的需要使用模板进行修改和格式化。

要创建模板,请使用以下语法 /etc/rsyslog.conf

$template TEMPLATE_NAME,"text %PROPERTY% more text", [OPTION]

因此,我们可以创建我们的模板;

# provides TCP syslog reception module(load="imtcp") input(type="imtcp" port="50514")  #Custom template to generate the log filename dynamically based on the client's IP address. $template RemInputLogs, "/var/log/remotelogs/%FROMHOST-IP%/%PROGRAMNAME%.log" *.* ?RemInputLogs

这将从远程主机接收的日志分类为负责生成该日志的特定程序的日志文件。

完成配置后,保存并退出文件;

您现在可以重新启动 rsyslog 通过运行以下命令来提供服务。 在重新启动 rsyslogd 之前,请运行配置检查。

rsyslogd -f /etc/rsyslog.conf -N1
rsyslogd: version 8.2001.0, config validation run (level 1), master config /etc/rsyslog.conf  rsyslogd: End of config validation run. Bye.

如果一切正常,请继续重新启动 rsyslog。

systemctl restart rsyslog

Rsyslogd 现在已准备好接收来自远程主机的日志。

配置远程 Rsyslog 客户端转发日志 Rsyslog 服务器

现在是配置远程客户端以将 syslog 消息发送到远程 syslog 服务器的时候了。 登录并进行如下操作。

验证远程 Rsyslog 服务器端口连接

要验证与远程 rsyslog 服务器 TCP 端口 50514 的连接,请运行以下命令;

telnet 192.168.57.3 50514
Trying 192.168.57.3... Connected to 192.168.57.3. Escape character is '^]'. ^]  telnet>

验证与 UDP 端口 514 的连接。由于您无法 telnet 到 UDP 端口 514,请使用 netcat 命令。 在服务器上,运行以下命令;

nc -ul 514

在客户端上,运行以下命令,按 ENTER 并键入任何内容。 您应该能够看到您在服务器上键入的内容。

nc -u 192.168.57.3 514

如果一切正常,请编辑客户端系统 rsyslog 配置文件,如下所示;

vim /etc/rsyslog.conf

要通过端口 514/UDP 发送身份验证日志,请在文件末尾添加以下行。 请注意,这应该从主机下完成 192.168.57.0/24 根据 AllowedSender 指示。

# Send logs to remote syslog server over UDP auth,authpriv.* @192.168.57.3:514

要通过端口 50514/TCP 发送所有日志,请在文件末尾添加以下行。 请注意,这应该从主机下完成 192.168.58.0/24 根据 AllowedSender 指令。

# Send logs to remote syslog server over TCP 50514 *.* @@192.168.57.3:50514

作为一个缓冲,以防万一远程 rsyslog 服务器宕机并且您的日志非常重要,您不想丢失,请在 rsyslog 配置文件中设置用于缓冲的 rsyslog 磁盘队列,如下所示;

# Define Disk Queue Buffer in case the server goes down $ActionQueueFileName queue # define a file name for disk assistance. $ActionQueueMaxDiskSpace 1g  # The maximum size that all queue files together will use on disk. $ActionQueueSaveOnShutdown on  # specifies that data should be saved at shutdown $ActionQueueType LinkedList  # holds enqueued messages in memory which makes the process very fast.  $ActionResumeRetryCount -1  # prevents rsyslog from dropping messages when retrying to connect if server is not responding,

重新启动客户端上的 rsyslog 服务。

systemctl restart rsyslog

您现在可以退出客户端并再次登录。 身份验证日志应该在 rsyslog 服务器上可用。

登录到 Rsyslog 服务器并验证相同。

ls /var/log/remotelogs/
127.0.0.1/     192.168.57.35/

在我们的例子中,我们只将身份验证日志发送到远程 rsyslog 服务器。

ls /var/log/remotelogs/192.168.57.35/
CRON.log  sshd.log  sudo.log  su.log
tail -5 /var/log/remotelogs/192.168.57.35/sshd.log 
2021-03-25T22:14:19+03:00 debian sshd[590]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.57.1  user=root 2021-03-25T22:14:22+03:00 debian sshd[590]: Failed password for root from 192.168.57.1 port 56714 ssh2

这就是在 Ubuntu 20.04 上为中央远程日志设置 rsyslog 服务器是多么简单。

在 Solaris 11.4 上配置 Rsyslog 以将日志发送到远程日志服务器

在 Solaris 11.4 上配置 Syslog 以进行远程日志记录

想用NXLog转发日志吗? 通过以下链接查看我们的文章;

在 Ubuntu 20.04 上配置 NXLog 以将系统日志转发到 Rsyslog 服务器

如何在 Ubuntu 18.04 上使用 Rsyslog 配置远程日志记录