介绍
在系统管理和网络安全领域,日志分析是一项关键技能。系统日志记录了从常规操作到严重错误和潜在安全漏洞的各种事件。能够有效地浏览和解读这些日志对于监控系统健康状况、排查问题和响应安全事件至关重要。
本实验将向你介绍 journalctl,这是现代 Linux 系统上用于查询和显示 journald 服务日志的标准工具。你将学习如何执行基本的日志分析任务,这些任务是监控和事件响应的基础。
在本实验中,你将:
- 查看系统启动日志。
- 过滤日志以查找特定事件,例如身份验证失败。
- 模拟并检测可疑事件。
- 导出日志以进行进一步分析。
使用 Journalctl 查看系统启动日志
在本步骤中,你将学习如何使用 journalctl 命令查看系统日志,特别是关注最近一次启动过程中生成的日志消息。这是诊断启动问题的常见第一步。
journalctl 命令允许你查询 systemd journal 的内容。如果不带任何参数,它会显示所有日志,这可能会让人不知所措。
为了使输出更易于管理,我们可以使用 -b 或 --boot 标志来仅查看当前启动会话的日志。
在你的终端中执行以下命令来查看当前启动的日志:
journalctl -b
你将看到一个分页输出,从启动过程的最早消息开始。你可以使用 向上 和 向下 方向键进行导航。按 q 键退出分页器并返回到命令提示符。
-- Journal begins at Tue 2023-10-31 08:30:00 UTC, ends at Tue 2023-10-31 09:00:00 UTC. --
Oct 31 08:30:01 labex-vm kernel: Linux version 5.15.0-87-generic ...
Oct 31 08:30:01 labex-vm kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-5.15.0-87-generic ...
Oct 31 08:30:01 labex-vm kernel: KERNEL supported cpus:
Oct 31 08:30:01 labex-vm kernel: Intel GenuineIntel
Oct 31 08:30:01 labex-vm kernel: AMD AuthenticAMD
...
(END)
此命令对于了解哪些服务成功启动以及在系统启动过程中发生的任何错误都非常有价值。
过滤认证失败日志
在本步骤中,你将过滤 journal 以查找特定事件,例如失败的身份验证尝试,这对于安全监控至关重要。攻击者常见的攻击目标是 SSH 服务,因此监控其日志是高优先级任务。
我们可以使用 journalctl 的 -u 标志按特定的 systemd unit 过滤日志。对于 SSH 服务,该 unit 通常是 ssh.service (在 Ubuntu/Debian 上) 或 sshd.service (在 Red Hat/CentOS 上)。
让我们过滤日志以仅查看与 SSH 守护进程相关的条目。请注意,你可能需要使用 sudo 来查看系统日志:
sudo journalctl -u ssh
此命令显示由 sshd 服务生成的所有日志条目。为了将搜索范围缩小到潜在的安全问题,我们可以将此输出通过管道传递给 grep 命令,以搜索诸如 "Failed" 之类的关键字。
运行以下命令以查找 SSH 服务的失败密码尝试:
sudo journalctl -u ssh | grep "Failed password"
如果没有最近的失败登录尝试,此命令可能不会产生任何输出。在一个安全的系统上,这是正常的。在下一步中,我们将自己生成此类事件,以了解它在日志中是如何显示的。
模拟可疑事件并分析日志
现在,让我们模拟一个可疑事件,然后运用我们的日志分析技能来检测它。暴力破解攻击的一个常见迹象是一系列失败的登录尝试。我们将通过尝试 SSH 连接到我们自己的机器 (localhost),并使用一个不存在的用户名来模拟一次这样的尝试。
在你的终端中执行以下命令。系统会提示你输入密码;你可以输入任何内容,因为预期会失败。
ssh non_existent_user@localhost
系统将拒绝连接,这是预期的结果。你应该会看到类似这样的消息:
non_existent_user@localhost's password:
Permission denied, please try again.
non_existent_user@localhost's password:
Permission denied (publickey,password).
既然我们已经生成了一个失败的登录事件,让我们重新运行上一步的日志分析命令,看看是否能找到它。
sudo journalctl -u ssh | grep "Failed password"
这次,该命令应该会产生输出,显示我们刚刚进行的失败尝试。
Oct 31 09:15:12 labex-vm sshd[1234]: Failed password for invalid user non_existent_user from 127.0.0.1 port 48492 ssh2
这个简单的练习演示了事件响应的核心流程:事件发生,被记录下来,然后管理员或自动化系统分析日志进行检测。
导出日志以进行集中分析模拟
在实际场景中,你通常会将来自各个机器的日志导出到集中的日志服务器(如 SIEM)进行长期存储和关联分析。在本步骤中,我们将通过将最近的 SSH 日志导出到文件来模拟此过程。
journalctl 可以以多种格式输出日志。json-pretty 格式特别有用,因为它既易于人类阅读,也易于其他工具解析。
让我们将过去 10 分钟的所有 SSH 日志导出到当前目录 (~/project) 下一个名为 ssh_logs.json 的文件中。
sudo journalctl -u ssh --since "10 minutes ago" -o json-pretty > ~/project/ssh_logs.json
现在,验证文件是否已创建:
ls -l ~/project
你应该会在文件列表中看到 ssh_logs.json。
total 4
-rw-r--r-- 1 labex labex 1234 Oct 31 09:20 ssh_logs.json
最后,让我们查看导出的日志文件的内容。
cat ~/project/ssh_logs.json
输出将是一个结构化的 JSON 数组,其中每个日志条目都是一个对象。这种格式非常适合导入到其他分析平台。
[
{
"__CURSOR" : "s=...",
"__REALTIME_TIMESTAMP" : "...",
"__MONOTONIC_TIMESTAMP" : "...",
"_BOOT_ID" : "...",
"_TRANSPORT" : "syslog",
"PRIORITY" : "6",
"SYSLOG_FACILITY" : "4",
"SYSLOG_IDENTIFIER" : "sshd",
"MESSAGE" : "Failed password for invalid user non_existent_user from 127.0.0.1 port 48492 ssh2",
"_PID" : "1234",
...
}
]
你已成功模拟了为集中分析准备日志的过程。
总结
在本实验中,你获得了使用 journalctl 的实践经验,这是一个用于分析现代 Linux 系统日志的强大工具。这些技能对任何系统管理员、DevOps 工程师或安全专业人员来说都是基础性的。
你已经学会了如何:
- 查看系统和启动日志以诊断启动问题。
- 按特定服务和消息内容过滤日志以查找相关事件。
- 从日志条目中识别可疑活动,例如登录失败。
- 以结构化格式(如 JSON)导出日志,以便集中存储和进一步分析。
掌握这些技术将使你能够更好地监控系统,更有效地排除故障,并迈出响应安全事件的第一步。



