如何在Ubuntu20.04上使用Journald集中日志
作为 Write for DOnations 计划的一部分,作者选择了 Free and Open Source Fund 来接受捐赠。
介绍
系统日志是管理 Linux 系统的一个极其重要的组成部分。 它们提供了有关系统如何工作以及如何使用它们的宝贵见解,因为除了错误之外,它们还记录了安全事件等操作信息。 Linux 系统的标准配置是将它们的日志本地存储在它们发生的同一系统上。 这适用于独立系统,但随着系统数量的增加,很快就会成为问题。 管理所有这些日志的解决方案是创建一个集中式日志服务器,每个 Linux 主机将其日志实时发送到专用日志管理服务器。
与在每个主机上存储日志相比,集中式日志记录解决方案提供了几个好处:
- 减少每台主机上存储日志文件所需的磁盘空间量。
- 日志可以保留更长时间,因为可以为专用日志服务器配置更多存储容量。
- 可以执行高级日志分析,这需要来自多个系统的日志以及比主机上可用的更多计算资源。
- 系统管理员可以访问他们出于安全原因可能无法直接登录的所有系统的日志。
在本指南中,您将配置 systemd 工具套件的一个组件,以将日志消息从客户端系统中继到集中式日志收集服务器。 您将配置服务器和客户端以使用 TLS 证书来加密日志消息,因为它们在不安全的网络(如 Internet)上传输,并相互验证。
先决条件
在开始本指南之前,您需要以下内容:
- 两台 Ubuntu 20.04 服务器。
- 在两台服务器上都具有 sudo 权限的非 root 用户。 请按照 Initial Server Setup with Ubuntu 20.04 指南获取有关如何执行此操作的说明。 您还应该按照指南中的说明在两台服务器上配置 UFW 防火墙。
- 两个指向您的服务器的主机名。 一个主机名用于生成日志的 client 系统,另一个用于日志收集 server。 通过查阅 Domains 和 DNS 文档,了解如何将主机名指向 DigitalOcean Droplets。
本指南将使用以下两个示例主机名:
client.your_domain
:生成日志的客户端系统。server.your_domain
:日志收集服务器。
以非 root sudo 用户身份通过 SSH 在单独的终端中登录客户端和服务器以开始本教程。
注意:在整个教程中,命令块都标有应该运行命令的服务器名称(client 或 server)。
第 1 步 — 安装 systemd-journal-remote
在此步骤中,您将在 客户端 和 服务器 上安装 systemd-journal-remote
包。 这个包包含 client 和 server 用来中继日志消息的组件。
首先,在 client 和 server 上,运行系统更新以确保包数据库和系统是最新的:
客户端和服务器
sudo apt update sudo apt upgrade
接下来,安装 systemd-journal-remote
包:
客户端和服务器
sudo apt install systemd-journal-remote
在 server 上,使用以下命令启用并启动它需要接收日志消息的两个 systemd 组件:
服务器
sudo systemctl enable --now systemd-journal-remote.socket sudo systemctl enable systemd-journal-remote.service
第一个命令中的 --now
选项会立即启动服务。 您没有在第二个命令中使用它,因为此服务在具有 TLS 证书之前不会启动,您将在下一步中创建该证书。
在 client 上,启用 systemd
用于向服务器发送日志消息的组件:
客户
sudo systemctl enable systemd-journal-upload.service
接下来,在服务器上,在 UFW 防火墙中打开端口 19532
和 80
。 这将允许服务器从客户端接收日志消息。 端口 80
是 certbot
将用于生成 TLS 证书的端口。 以下命令将打开这些端口:
服务器
sudo ufw allow in 19532/tcp sudo ufw allow in 80/tcp
在客户端,您只需要使用以下命令打开端口 80
:
客户
sudo ufw allow in 80/tcp
您现在已经安装了所需的组件并完成了客户端和服务器上的基本系统配置。 在配置这些组件以开始中继日志消息之前,您将使用 certbot 为 client 和 server 注册 Let's Encrypt TLS 证书] 效用。
第 2 步 — 安装 Certbot 并注册证书
Let's Encrypt 是一个 证书颁发机构 颁发免费 TLS 证书。 这些证书允许计算机加密它们之间发送的数据并验证彼此的身份。 这些证书允许您使用 HTTPS 保护您的 Internet 浏览。 任何其他需要相同安全级别的应用程序都可以使用相同的证书。 无论您将证书用于什么用途,注册证书的过程都是相同的。
在此步骤中,您将安装 certbot
实用程序并使用它来注册证书。 它还将在证书到期时自动更新证书。 这里的注册过程在client和server上是一样的。 您只需更改主机名以匹配您运行注册命令的主机。
首先,启用 Ubuntu 的 universe
存储库,因为 certbot
实用程序位于 universe
存储库中。 如果您已经启用了 universe
存储库,则运行这些命令不会对您的系统做任何事情并且可以安全运行:
客户端和服务器
sudo apt install software-properties-common sudo add-apt-repository universe sudo apt update
接下来,在两台主机上安装 certbot
:
客户端和服务器
sudo apt install certbot
现在您已经安装了 certbot
,运行以下命令在 client 和 server 上注册证书:
客户端和服务器
sudo certbot certonly --standalone --agree-tos --email sammy@your_domain -d your_domain
该命令中的选项含义如下:
certonly
:注册证书,不对系统进行其他更改。--standalone
:使用 certbot 的内置 Web 服务器来验证证书请求。--agree-tos
:自动同意 Let's Encrypt 服务条款。--email your_email
:这是 Let's Encrypt 用来通知您证书到期和其他重要信息的电子邮件地址。-d your_domain
:将注册证书的主机名。 这必须与您运行它的系统相匹配。
当您运行此命令时,系统会询问您是否要与 Let's Encrypt 共享电子邮件地址,以便他们可以通过电子邮件向您发送有关他们工作的新闻和其他信息。 这样做是可选的,如果您不共享您的电子邮件地址,证书注册仍将正常完成。
证书注册过程完成后,它将把证书和密钥文件放在 /etc/letsencrypt/live/your_domain/
中,其中 your_domain
是您为其注册证书的主机名。
最后,您需要下载一份 Let's Encrypt 的 CA 和中间证书,并将它们放入同一个文件中。 journald
将使用该文件来验证 client 和 server 上的证书在相互通信时的真实性。
以下命令将从 Let's Encrypt 的网站下载这两个证书,并将它们放入用户主目录中名为 letsencrypt-combined-certs.pem
的单个文件中。
在 client 和 server 上运行此命令以下载证书并创建组合文件:
客户端和服务器
curl -s https://letsencrypt.org/certs/{isrgrootx1.pem.txt,letsencryptauthorityx3.pem.txt} > ~/letsencrypt-combined-certs.pem
接下来,将此文件移动到包含证书和密钥的 Let's Encrypt 目录中:
客户端和服务器
sudo cp ~/letsencrypt-combined-certs.pem /etc/letsencrypt/live/your_domain/
您现在已经注册了证书和密钥。 在下一步中,您将配置日志收集 server 以开始侦听和存储来自 client 的日志消息。
第 3 步 — 配置服务器
在此步骤中,您将配置 服务器 以使用您在上一步中生成的证书和密钥文件,以便它可以开始接受来自 客户端 的日志消息。
systemd-journal-remote
是监听日志消息的组件。 使用文本编辑器在 /etc/systemd/journal-remote.conf
打开其配置文件,开始在 服务器 上进行配置:
sudo nano /etc/systemd/journal-remote.conf
接下来,取消注释 [Remote]
部分下的所有行,并将路径设置为指向您刚刚创建的 TLS 文件:
/etc/systemd/journal-remote.conf
[Remote] Seal=false SplitMode=host ServerKeyFile=/etc/letsencrypt/live/server.your_domain/privkey.pem ServerCertificateFile=/etc/letsencrypt/live/server.your_domain/fullchain.pem TrustedCertificateFile=/etc/letsencrypt/live/server.your_domain/letsencrypt-combined-certs.pem
以下是您在此处使用的选项:
Seal=false
:对日志中的日志数据进行签名。 如果您需要最大的安全性,请启用此选项; 否则,您可以将其保留为false
。SplitMode=host
:来自远程客户端的日志将在/var/log/journal/remote
中按主机拆分。 如果您希望将所有日志添加到单个文件中,请将其设置为SplitMode=false
。ServerKeyFile
:服务器的私钥文件。ServerCertificateFile
:服务器的证书文件。TrustedCertificateFile
:包含 Let's Encrypt CA 证书的文件。
现在,您需要更改包含证书和密钥的 Let's Encrypt 目录的权限,以便 systemd-journal-remote
可以读取和使用它们。
首先,更改 permissions 以便证书和私钥可读:
sudo chmod 0755 /etc/letsencrypt/{live,archive} sudo chmod 0640 /etc/letsencrypt/live/server.your_domain/privkey.pem
接下来,将私钥的组所有权更改为 systemd-journal-remote
的组:
sudo chgrp systemd-journal-remote /etc/letsencrypt/live/server.your_domain/privkey.pem
您现在可以启动 systemd-journal-remote
:
sudo systemctl start systemd-journal-remote.service
您的日志集合 server 现在正在运行并准备开始接受来自 client 的日志消息。 在下一步中,您将配置 客户端 以将日志中继到您的集合 服务器 。
第 4 步 — 配置客户端
在此步骤中,您将配置将日志消息中继到日志收集服务器的组件。 该组件称为 systemd-journal-upload
。
systemd-journal-upload
的默认配置是它使用仅在进程运行时存在的临时用户。 这使得 systemd-journal-upload
读取 TLS 证书和密钥变得更加复杂。 要解决此问题,您将创建一个与临时用户同名的新系统用户,该用户将在其位置使用。
首先,使用以下 adduser
命令在 client 上创建名为 systemd-journal-upload
的新用户:
sudo adduser --system --home /run/systemd --no-create-home --disabled-login --group systemd-journal-upload
该命令的这些选项是:
--system
:创建新用户为系统用户。 这会在1000
下为用户提供一个 UID(用户标识符)编号。 超过1000
的 UID 通常提供给人类用来登录的用户帐户。--home /run/systemd
:将/run/systemd
设置为该用户的主目录。--no-create-home
:不要创建主目录集,因为它已经存在。--disabled-login
:用户无法通过SSH等方式登录服务器。--group
:创建与用户同名的组。
接下来,设置 Let's Encrypt 证书文件的权限和所有权:
sudo chmod 0755 /etc/letsencrypt/{live,archive} sudo chmod 0640 /etc/letsencrypt/live/client.your_domain/privkey.pem sudo chgrp systemd-journal-upload /etc/letsencrypt/live/client.your_domain/privkey.pem
现在,编辑 systemd-journal-upload
的配置,它位于 /etc/systemd/journal-upload.conf
。 使用文本编辑器打开此文件:
sudo nano /etc/systemd/journal-upload.conf
编辑此文件,使其如下所示:
/etc/systemd/journal-upload.conf
[Upload] URL=https://server.your_domain:19532 ServerKeyFile=/etc/letsencrypt/live/client.your_domain/privkey.pem ServerCertificateFile=/etc/letsencrypt/live/client.your_domain/fullchain.pem TrustedCertificateFile=/etc/letsencrypt/live/client.your_domain/letsencrypt-combined-certs.pem
最后,重启 systemd-journal-upload
服务,让它使用新的配置:
sudo systemctl restart systemd-journal-upload.service
您的 客户端 现在已设置并运行,并且正在将其日志消息发送到日志收集服务器。 在下一步中,您将检查日志是否正确发送和记录。
第 5 步 — 测试客户端和服务器
在此步骤中,您将测试 客户端 是否将日志消息中继到 服务器 并且 服务器 是否正确存储它们。
日志收集服务器将来自客户端的日志存储在 /var/log/journal/remote/
的目录中。 当您在最后一步结束时重新启动 客户端 时,它开始发送日志消息,因此 /var/log/journal/remote/
中现在有一个日志文件。 该文件将以您用于 TLS 证书的主机名命名。
使用 ls
命令检查 客户端的 日志文件是否存在于 服务器 上:
服务器
sudo ls -la /var/log/journal/remote/
这将打印显示日志文件的目录内容:
Outputtotal 16620 drwxr-xr-x 2 systemd-journal-remote systemd-journal-remote 4096 Jun 30 16:17 . drwxr-sr-x+ 4 root systemd-journal 4096 Jun 30 15:55 .. -rw-r----- 1 systemd-journal-remote systemd-journal-remote 8388608 Jul 1 10:46 'remote-CN=client.your_domain'
接下来,在 客户端 上写入一条日志消息,以检查 服务器 是否按预期接收 客户端的 消息。 您将使用 logger 实用程序在 client 上创建自定义日志消息。 如果一切正常,systemd-journal-upload
会将此消息中继到 服务器。
在 client 上运行以下 logger
命令:
客户
sudo logger -p syslog.debug "### TEST MESSAGE from client.your_domain ###"
此命令中的 -p syslog.debug
设置消息的 功能和严重性 。 将此设置为 syslog.debug
将表明这是一条测试消息。 此命令会将消息 ### TEST MESSAGE from client.your_domain ###
记录到客户端的日志中,然后 systemd-journal-upload
将其中继到 服务器。
接下来,读取 服务器 上的 客户端的 日志文件,以检查日志消息是否来自 客户端 。 该文件是一个二进制日志文件,因此您将无法使用 less
等工具读取它。 相反,使用 journalctl
和 --file=
选项读取文件,该选项允许您指定自定义日志文件:
服务器
sudo journalctl --file=/var/log/journal/remote/remote-CN=client.your_domain.journal
日志消息将如下所示:
Test log message. . . Jun 29 13:10:09 client root[3576]: ### TEST MESSAGE from client.your_domain ###
您的日志集中服务器现在已成功从您的客户端系统收集日志。
结论
在本文中,您设置了一个日志中央收集服务器并配置了一个客户端以将其系统日志的副本中继到服务器。 您可以使用此处使用的客户端配置步骤配置任意数量的客户端,以将消息中继到日志收集服务器。