作为Write for DOnations计划的一部分,作者选择了免费和开源基金来接受捐赠。
介绍
系统日志是管理 Linux 系统的极其重要的组成部分。它们提供了对系统如何工作以及它们如何被使用的宝贵见解,因为除了错误之外,它们还记录操作信息,例如安全事件。Linux 系统的标准配置是将它们的日志本地存储在它们发生的同一系统上。这适用于独立系统,但随着系统数量的增加,很快就会成为一个问题。管理所有这些日志的解决方案是创建一个集中式日志服务器,每个 Linux 主机将其日志实时发送到专用日志管理服务器。
与在每个主机上存储日志相比,集中式日志记录解决方案具有以下几个优点:
- 减少每个主机上存储日志文件所需的磁盘空间量。
- 日志可以保留更长时间,因为专用日志服务器可以配置更大的存储容量。
- 可以执行高级日志分析,这需要来自多个系统的日志以及比主机上可用的更多计算资源。
- 出于安全原因,系统管理员可以访问他们可能无法直接登录的所有系统的日志。
在本指南中,您将配置systemd工具套件的一个组件,以将日志消息从客户端系统中继到集中式日志收集服务器。您将配置服务器和客户端以使用 TLS 证书对通过不安全网络(如 Internet)传输的日志消息进行加密,并相互进行身份验证。
先决条件
在开始本指南之前,您需要具备以下条件:
- 两台 Debian 10 服务器。
- 在两台服务器上都具有 sudo 权限的非 root 用户。按照Debian 10指南的初始服务器设置了解如何执行此操作的说明。您还应该按照指南中的说明在两台服务器上配置 UFW 防火墙。
- 指向您的服务器的两个主机名。一个用于生成日志的客户端系统的主机名和另一个用于日志收集服务器的主机名。通过查阅域和 DNS文档,了解如何将主机名指向 DigitalOcean Droplets 。
本指南将使用以下两个示例主机名:
client.your_domain
:生成日志的客户端系统。server.your_domain
: 日志收集服务器。
以非 root sudo 用户身份通过 SSH 在不同终端中登录客户端和服务器以开始本教程。
注意:在整个教程中,命令块都标有应该运行命令的服务器名称(客户端或服务器)。
步骤 1 — 安装 systemd-journal-remote
在此步骤中,您将systemd-journal-remote
在客户端和服务器上安装软件包。此包包含客户端和服务器用于中继日志消息的组件。
首先,在客户端和服务器上,运行系统更新以确保包数据库和系统是最新的:
- sudo apt update
- sudo apt upgrade
接下来,安装systemd-journal-remote
软件包:
- sudo apt install systemd-journal-remote
在服务器上,systemd
使用以下命令启用并启动它需要接收日志消息的两个组件:
- sudo systemctl enable --now systemd-journal-remote.socket
- sudo systemctl enable systemd-journal-remote.service
第--now
一个命令中的选项会立即启动服务。您没有在第二个命令中使用它,因为此服务只有在拥有 TLS 证书(您将在下一步中创建)后才会启动。
在客户端上,启用systemd
用于将日志消息发送到服务器的组件:
- sudo systemctl enable systemd-journal-upload.service
接下来,在服务器上,打开端口19532
和80
UFW 防火墙。这将允许服务器接收来自客户端的日志消息。端口80
是certbot
将用于生成 TLS 证书的端口。以下命令将打开这些端口:
- sudo ufw allow in 19532/tcp
- sudo ufw allow in 80/tcp
在客户端,您只需要80
使用以下命令打开端口:
- sudo ufw allow in 80/tcp
您现在已经安装了所需的组件并完成了客户端和服务器上的基本系统配置。在您可以配置这些组件以开始中继日志消息之前,您将使用该实用程序为客户端和服务器注册Let’s Encrypt TLS 证书。certbot
步骤 2 — 安装 Certbot 并注册证书
Let’s Encrypt 是颁发免费 TLS 证书的证书颁发机构。这些证书允许计算机加密它们在它们之间发送的数据并验证彼此的身份。这些证书允许您使用 HTTPS 保护您的互联网浏览。需要相同安全级别的任何其他应用程序都可以使用相同的证书。无论您使用它们做什么,注册证书的过程都是相同的。
在此步骤中,您将安装该certbot
实用程序并使用它来注册证书。它还会在证书到期时自动更新证书。这里的注册过程在客户端和服务器上是一样的。您只需要更改主机名以匹配您运行注册命令的主机。
首先,在两台主机上安装certbot
该curl
实用程序:
- sudo apt install certbot curl
现在您已安装certbot
,运行以下命令在客户端和服务器上注册证书:
- 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
将使用此文件来验证客户端和服务器相互通信时证书的真实性。
以下命令将从 Let’s Encrypt 网站下载两个证书,并将它们放入letsencrypt-combined-certs.pem
用户主目录中名为的单个文件中。
在客户端和服务器上运行此命令以下载证书并创建组合文件:
- 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/
您现在已经注册了证书和密钥。在下一步中,您将配置日志收集服务器以开始侦听和存储来自客户端的日志消息。
第 3 步 – 配置服务器
在此步骤中,您将配置服务器以使用您在上一步中生成的证书和密钥文件,以便它可以开始接受来自客户端的日志消息。
systemd-journal-remote
是监听日志消息的组件。/etc/systemd/journal-remote.conf
用文本编辑器打开它的配置文件,开始在服务器上配置它:
- sudo nano /etc/systemd/journal-remote.conf
接下来,取消注释该[Remote]
部分下的所有行,并将路径设置为指向您刚刚创建的 TLS 文件:
[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
可以读取和使用它们。
首先,更改权限,使证书和私钥可读:
- 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
您的日志收集服务器现在正在运行并准备开始接受来自客户端的日志消息。在下一步中,您将配置客户端以将日志中继到您的收集服务器。
第 4 步 – 配置客户端
在此步骤中,您将配置将日志消息中继到日志收集服务器的组件。该组件称为systemd-journal-upload
.
的默认配置systemd-journal-upload
是它使用仅在进程运行时存在的临时用户。这使得systemd-journal-upload
读取 TLS 证书和密钥变得更加复杂。要解决此问题,您将创建一个与临时用户同名的新系统用户,该用户将在其位置使用。
首先,在被呼叫新用户systemd-journal-upload
的对客户端使用以下adduser
命令:
- sudo adduser --system --home /run/systemd --no-create-home --disabled-login --group systemd-journal-upload
命令的这些选项是:
--system
: 将新用户创建为系统用户。这会在 下为用户提供一个 UID(用户标识符)编号1000
。UID 的结束1000
通常提供给人类将用来登录的用户帐户。--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
编辑此文件,使其如下所示:
[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'
接下来,在客户端上写一条日志消息,以检查服务器是否按预期接收客户端的消息。您将使用记录器实用程序在客户端上创建自定义日志消息。如果一切正常,systemd-journal-upload
就会将此消息转发到服务器。
在客户端运行以下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 ###
您的日志集中服务器现在成功地从您的客户端系统收集日志。
结论
在本文中,您设置了一个日志中央收集服务器并配置了一个客户端以将其系统日志的副本中继到服务器。您可以使用您在此处使用的客户端配置步骤,根据需要配置任意数量的客户端,将消息中继到日志收集服务器。