_ 作者选择了 免费和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
系统日志是管理Linux系统的一个极为重要的组成部分. 它们提供了对系统如何运作和如何使用的宝贵见解,因为除了错误之外,它们还记录安全事件等业务信息。 Linux系统的标准配置是将其日志在本地存储在它们发生的同一系统中. 这对独立的系统有效,但随着系统数量的增加而迅速成为一个问题。 管理所有这些日志的解决方案是创建一个集中日志服务器,每个Linux主机将日志实时发送到专用日志管理服务器.
集中式日志解决方案提供与每个主机上存储日志相比的几个优点:
- 减少每个主机存储日志文件所需的磁盘空间。 * 日志可以保存更长时间,因为专用日志服务器可以配置更大的存储容量。 * 可以执行高级日志分析,需要来自多个系统的日志,以及比主机可用的更多的计算资源。 * 系统管理员可以访问所有系统的日志,他们可能无法直接登录安全原因。
在本指南中,您将配置 systemd工具套件的组件,以将客户端系统的日志消息传送到集中日志收集服务器。
前提条件
在您开始本指南之前,您将需要以下内容:
- 两个Ubuntu 20.04服务器。
- 两个服务器都有sudo权限的非root用户。 遵循 初始服务器设置与 Ubuntu 20.04 指南,指导如何做到这一点. 如指南所解释,您还应在两个服务器上配置UFW防火墙。
- 联合国 两个主机名指向您的服务器. 一个用于生成日志的 客户端** 系统的主机名,另一个用于日志集** 服务器** . 通过查阅[域和DNS]文档(https://www.digitalocean.com/docs/networking/dns/),学习如何将主机名指向 DigitalOcean Droplets. .
本指南将使用以下两个示例主机名称:
client.your_domain
:生成日志的客户端系统. *server.your_domain
:日志收集服务器。
通过SSH登录到单独的终端中的客户端和服务器,作为非 root sudo 用户开始本教程。
<$>[注] 注 :在整个教程中,命令块都标记为该命令应该运行的服务器名称(** client** 或** server** )。
步骤 1 — 安装systemd-journal-remote
在此步骤中,您将在 client 和** server** 上安装systemd-journal-remote
包,该包包含了** client** 和** server** 用于传输日志消息的组件。
首先,在客户端和服务器上运行系统更新,以确保数据库和系统是最新的:
1[label Client and Server]
2sudo apt update
3sudo apt upgrade
接下来,安装systemd-journal-remote
包:
1[label Client and Server]
2sudo apt install systemd-journal-remote
在 服务器上 ,启用并启动两个 systemd
组件,它需要通过以下命令接收日志消息:
1[label Server]
2[environment second]
3sudo systemctl enable --now systemd-journal-remote.socket
4sudo systemctl enable systemd-journal-remote.service
第一個命令中的「--現在」選項會立即啟動服務. 您沒有在第二個命令中使用它,因為此服務不會啟動,直到它有 TLS 證書,您將在下一步建立。
在 client 中,启用systemd
用于将日志消息发送到服务器的组件:
1[label Client]
2[environment third]
3sudo systemctl enable systemd-journal-upload.service
接下来,在服务器上,打开UFW防火墙中的端口19532
和80
。这将允许服务器接收客户端的日志消息。端口80
是certbot
将使用的端口来生成TLS证书。下列命令将打开这些端口:
1[label Server]
2[environment second]
3sudo ufw allow in 19532/tcp
4sudo ufw allow in 80/tcp
在客户端上,您只需要使用此命令打开端口 `80:
1[label Client]
2[environment third]
3sudo ufw allow in 80/tcp
您现在已经安装了所需的组件,并在客户端和服务器上完成了基本系统配置. 在您可以配置这些组件以开始传输日志消息之前,您将使用 certbot
实用程序注册 Let's Encrypt TLS 证书用于 client 和** server** 。
第2步:安装Certbot和注册证书
Let's Encrypt is a Certification Authority,它发行免费的TLS证书. 这些证书允许计算机既加密它们之间发送的数据,也验证彼此的身份. 这些证书允许您使用 HTTPS 进行互联网浏览 。 同样的证书可以被其他任何想要同等安全水平的应用程序所使用. 证书的注册程序无论用什么方法都是一样的.
在此步骤中,您将安装certbot
实用程序,并使用它来注册证书,它也会自动更新证书,当它们到期时。在这里的注册过程在 client 和** server** 上是一样的。
首先,启用Ubuntu的宇宙
存储库,因为certbot
实用程序位于宇宙
存储库中,如果你已经启用了宇宙
存储库,运行这些命令不会对你的系统造成任何影响,并且可以安全运行:
1[label Client and Server]
2sudo apt install software-properties-common
3sudo add-apt-repository universe
4sudo apt update
接下来,在两个主机上安装certbot
:
1[label Client and Server]
2sudo apt install certbot
现在你已经安装了certbot
,运行以下命令,在 client 和** server** 上注册证书:
1[label Client and Server]
2sudo certbot certonly --standalone --agree-tos --email sammy@your_domain -d your_domain
此命令中的选项意味着如下:
- `宫外': 注册证书,系统上不作其他更改.
- " 独立 " : 使用 certbot 的内置网络服务器来验证证书请求.
- " 同意 " : 自动同意"让我们加密服务条款".
- `电子邮件: 这是Let's Encrypt将用来通知您证书过期和其它重要信息的电子邮件地址.
- `-d你的域: 证书将要注册的主机名 。 这必须与你运行的系统匹配. .
当您运行此命令时,您将被问及是否要与 Let’s Encrypt 共享电子邮件地址,以便他们可以向您发送有关其工作的新闻和其他信息的电子邮件。
当证书注册过程完成后,它将将证书和密钥文件放置在 /etc/letsencrypt/live/your_domain/
中,而 your_domain
是您注册证书的主机名。
最后,您需要下载 Let’s Encrypt 的 CA 和中间证书的副本,并将其放入相同的文件中。
以下命令将从 Let's Encrypt 网站下载两个证书,并将它们放入用户主目录中的一个名为 'letsencrypt-combined-certs.pem' 的文件中。
在 client 和** server** 上运行此命令以下载证书并创建组合文件:
1[label Client and Server]
2curl -s https://letsencrypt.org/certs/{isrgrootx1.pem.txt,letsencryptauthorityx3.pem.txt} > ~/letsencrypt-combined-certs.pem
接下来,将此文件移动到包含证书和密钥的 Let's Encrypt 目录:
1[label Client and Server]
2sudo cp ~/letsencrypt-combined-certs.pem /etc/letsencrypt/live/your_domain/
您现在已经注册了证书和密钥,在下一步,您将配置日志收集 服务器 以开始收听和存储来自** 客户端** 的日志消息。
第3步:配置服务器
在此步骤中,您将配置 服务器 使用您在最后一步中生成的证书和密钥文件,以便它可以开始接受来自** 客户端** 的日志消息。
systemd-journal-remote
是听取日志消息的组件. 使用文本编辑器在 `/etc/systemd/journal-remote.conf 打开其配置文件,开始在 服务器 上配置:
1[environment second]
2sudo nano /etc/systemd/journal-remote.conf
接下来,在[远程]
部分的所有行中删除评论,并设置路径,以指向您刚刚创建的TLS文件:
1[label /etc/systemd/journal-remote.conf]
2[Remote]
3Seal=false
4SplitMode=host
5ServerKeyFile=/etc/letsencrypt/live/server.your_domain/privkey.pem
6ServerCertificateFile=/etc/letsencrypt/live/server.your_domain/fullchain.pem
7TrustedCertificateFile=/etc/letsencrypt/live/server.your_domain/letsencrypt-combined-certs.pem
以下是你在这里使用的选项:
Sel=假': 在日记中签名日志数据 。 如果您需要最大安全性, 请启用此功能; 否则, 您可将其作为
虚假` 保存 。SplitMode=host
: 远程客户端的日志将在/var/log/journal/remote
中按主机拆分。 如果您希望将全部日志添加到一个文件设置中, 将它添加到SplitMode=false
。- `ServerKeyFile': 服务器的私钥文件.
- `公务员证书文件': 服务器的证书文件 。
信任证书 ' : 包含
让我们加密 CA ` 证书的文件 。 .
现在,您需要更改包含证书和密钥的 Let’s Encrypt 目录上的权限,以便systemd-journal-remote
可以读取和使用它们。
首先,更改 权限以便证书和私钥可读:
1[environment second]
2sudo chmod 0755 /etc/letsencrypt/{live,archive}
3sudo chmod 0640 /etc/letsencrypt/live/server.your_domain/privkey.pem
接下来,将私钥的群组所有权更改为systemd-journal-remote
的群组:
1[environment second]
2sudo chgrp systemd-journal-remote /etc/letsencrypt/live/server.your_domain/privkey.pem
您现在可以启动systemd-journal-remote
:
1[environment second]
2sudo systemctl start systemd-journal-remote.service
您的日志收集 服务器 现在正在运行,并准备开始接收来自** 客户端** 的日志消息。
步骤4:配置客户端
在此步骤中,您将配置将日志消息传递到日志收集服务器的组件,该组件被称为systemd-journal-upload
。
「systemd-journal-upload」的默认配置是,它使用的是在运行过程中只存在的临时用户,这使得允许「systemd-journal-upload」读取TLS证书和密钥变得更加复杂。
首先,在 client 上创建一个名为systemd-journal-upload
的新用户,使用以下命令adduser
:
1[environment third]
2sudo adduser --system --home /run/systemd --no-create-home --disabled-login --group systemd-journal-upload
这些命令的选项是:
- " 系统 " :创建新用户作为系统用户。 这使用户在`1000'下有一个UID(用户识别器)编号。 UID超过"1000",通常提供给用户账户,人类会使用这些账户登录.
- " 家庭/运行/系统 " : 将
/运行/系统化
设定为该用户的主目录。 - " 不创造家庭 " : 不要创建主目录集, 因为它已经存在 。
- " 残疾记录 " : 用户不能通过例如SSH登录到服务器.
- `-组':创建一个与用户同名的组。 .
接下来,设置 Let's Encrypt 证书文件的权限和所有权:
1[environment third]
2sudo chmod 0755 /etc/letsencrypt/{live,archive}
3sudo chmod 0640 /etc/letsencrypt/live/client.your_domain/privkey.pem
4sudo chgrp systemd-journal-upload /etc/letsencrypt/live/client.your_domain/privkey.pem
现在,编辑对 systemd-journal-upload
的配置,该配置在 /etc/systemd/journal-upload.conf
。
1[environment third]
2sudo nano /etc/systemd/journal-upload.conf
编辑此文件,以便它看起来如下:
1[label /etc/systemd/journal-upload.conf]
2[Upload]
3URL=https://server.your_domain:19532
4ServerKeyFile=/etc/letsencrypt/live/client.your_domain/privkey.pem
5ServerCertificateFile=/etc/letsencrypt/live/client.your_domain/fullchain.pem
6TrustedCertificateFile=/etc/letsencrypt/live/client.your_domain/letsencrypt-combined-certs.pem
最后,重新启动systemd-journal-upload
服务,以便使用新的配置:
1[environment third]
2sudo systemctl restart systemd-journal-upload.service
您的 **客户端现已设置并运行,并将其日志消息发送到日志收集服务器. 在下一步,您将检查日志是否被正确发送和记录。
第5步:测试客户端和服务器
在此步骤中,您将测试 客户端 是否正在将日志消息传送到** 服务器** ,以及** 服务器** 是否正在正确地存储它们。
日志收集服务器将客户端的日志存储在/var/log/journal/remote/
的目录中.当您在最后一步结束时重新启动 client 时,它开始发送日志消息,所以现在在/var/log/journal/remote/
中有一个日志文件。
使用ls
命令来检查客户端的日志文件是否存在于服务器上:
1[label Server]
2[environment second]
3sudo ls -la /var/log/journal/remote/
这将打印显示日志文件的目录内容:
1[secondary_label Output]
2total 16620
3drwxr-xr-x 2 systemd-journal-remote systemd-journal-remote 4096 Jun 30 16:17 .
4drwxr-sr-x+ 4 root systemd-journal 4096 Jun 30 15:55 ..
5-rw-r----- 1 systemd-journal-remote systemd-journal-remote 8388608 Jul 1 10:46 'remote-CN=client.your_domain'
接下来,在客户端上写一个日志信息,以检查服务器是否按照预期接收客户端的信息。您将使用 logger 实用程序,在客户端上创建一个自定义日志信息。如果一切工作,系统d-journal-upload 将将此信息传送到服务器。
在客户端上运行以下logger
命令:
1[label Client]
2[environment third]
3sudo logger -p syslog.debug "### TEST MESSAGE from client.your_domain ###"
此命令中的 -p syslog.debug
设置了消息的 便利性和严重性。 将此设置为 syslog.debug
将清楚地表明这是一个测试消息。 此命令将从 client.your_domain ## 记录到客户端的日志,然后将此消息systemd-journal-upload
传送到 服务器 。
接下来,在服务器上阅读客户端的日志文件,以检查日志信息是否来自客户端。 此文件是二进制日志文件,因此您将无法通过少
等工具读取它。
1[label Server]
2[environment second]
3sudo journalctl --file=/var/log/journal/remote/remote-CN=client.your_domain.journal
日志消息将如下显示:
1[secondary_label Test log message]
2. . .
3Jun 29 13:10:09 client root[3576]: ### TEST MESSAGE from client.your_domain ###
您的日志集中服务器现在正在成功地从您的客户端系统收集日志。
结论
在本文中,您设置了一个中央日志收集服务器,并配置了一个客户端将其系统日志的副本转发到服务器中。