本页内容
- 先决条件
- 添加软件仓库
- 安装 Zeek
- 配置 Zeek
- Zeek 日志指南
- 通过 Zeek-cut 分析 Zeek 日志 TSV(制表符分隔值)
- 将 Zeek 日志文件配置为 JSON
- 结论
Zeek(原名为 Bro)是一个免费的开源网络安全监控平台。它是一个强大的被动网络流量分析器,用于调查可疑或恶意活动。Zeek 可用作网络安全监视器(NSM),并支持从安全领域到性能测量与故障排除的广泛流量分析。
在本指南中,我将逐步向你展示如何在 Debian 12 服务器上安装 Zeek 网络安全监控系统。你将安装 Zeek,并以集群模式配置 Zeek,然后学习如何通过 zeek-cut 命令行解析 Zeek TSV 日志格式。此外,你还将学习如何将 Zeek 日志输出设置为 JSON,并通过 jq 命令行解析 Zeek JSON 日志。
先决条件
在开始之前,请确认你具备以下条件:
- 一台 Debian 12 服务器。
- 一个具有管理员权限的非 root 用户。
添加软件仓库
Zeek 可以通过手动编译或使用第三方仓库的方式安装在 Linux 系统上。在本指南中,你将通过 APT 使用第三方仓库来安装 Zeek。
首先,运行以下命令为 Zeek 软件包添加 GPG 密钥和仓库。
curl -fsSL https://download.opensuse.org/repositories/security:zeek/Debian_12/Release.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/security_zeek.gpg > /dev/null
echo 'deb http://download.opensuse.org/repositories/security:/zeek/Debian_12/ /' | sudo tee /etc/apt/sources.list.d/security:zeek.list
现在,通过执行以下 apt update 命令更新并刷新你的 Debian 仓库。
sudo apt update

安装 Zeek
添加 Zeek 仓库后,你现在可以在 Debian 机器上开始安装 Zeek。在接下来的步骤中,你将安装 Zeek,并将 Zeek 安装目录添加到系统 PATH。
执行以下 apt install 命令,将 Zeek 安装到你的 Debian 机器上。Zeek 有多个可用版本,例如最新发布版、LTS 和 nightly(每日构建版)。在本示例中,你将安装 zeek-lts。
sudo apt install zeek-lts
输入 y 以继续安装。

Zeek 安装完成后,默认会安装到目标目录 /opt/zeek。执行以下命令,通过 ~/.bashrc 文件将 /opt/zeek/bin 目录添加到系统 PATH。
echo "export PATH=$PATH:/opt/zeek/bin" >> ~/.bashrc
接下来,重新加载 ~/.bashrc 文件,并使用以下命令检查系统 PATH 变量。你应该能在系统 PATH 中看到 /opt/zeek/bin 目录。
source ~/.bashrc
echo $PATH

最后,通过执行以下命令来验证 Zeek。借此,你将检查 Zeek 二进制文件的位置、查看 Zeek 版本,并打印 Zeek 帮助信息。
which zeek
zeek --version
zeek --help
在以下输出中,你应该能看到 zeek 5.0 已安装在 /usr/zeek/bin/zeek。此外,你还应该能看到 Zeek 命令的选项。

配置 Zeek
现在 Zeek 已经安装完成,下一步是配置 Zeek 安装。你可以以多种模式运行 Zeek,例如命令行模式、独立(standalone)模式和集群(cluster)模式。
在下面的示例中,你将学习如何使用单台服务器以集群模式运行 Zeek。
在配置 Zeek 之前,执行以下命令检查你的网络接口和 IP 地址。
ip a
你应该能看到系统上可用的接口列表,其中包含类似以下内容的服务器 IP 地址详细信息:

使用以下 nano 编辑器命令打开 Zeek 的网络配置文件 /opt/zeek/etc/networks.cfg。
sudo nano /opt/zeek/etc/networks.cfg
按如下方式插入你的内部网络子网。你也可以向其中添加多个子网。
10.0.0.0/8 Private IP space 172.16.0.0/12 Private IP space 192.168.0.0/16 Private IP space
完成后保存文件并退出编辑器。
现在使用以下 nano 编辑器命令打开 Zeek 配置文件 /opt/zeek/etc/node.cfg。
sudo nano /opt/zeek/etc/node.cfg
默认情况下,Zeek 运行在独立(standalone)模式下。添加 # 以禁用 Zeek 的独立模式。
#[zeek] #type=standalone #host=localhost #interface=eth0
插入以下配置,以单台服务器集群模式运行 Zeek。请务必将服务器 IP 地址替换为你自己的信息。
通过以下配置,你将以集群模式运行 Zeek,其中包含多个组件,例如 zeek-logger、zeek-manager、zeek-proxy 和 zeek-worker。
# logger [zeek-logger] type=logger host=192.168.10.15 # manager [zeek-manager] type=manager host=192.168.10.15 # proxy [zeek-proxy] type=proxy host=192.168.10.15 # worker [zeek-worker] type=worker host=192.168.10.15 interface=eth0 # worker localhost [zeek-worker-lo] type=worker host=localhost interface=lo
完成后保存并关闭该文件。
接下来,运行以下命令进入 Zeek 控制 shell。
zeekctl
运行 check 命令来验证你的 Zeek 配置。
check
如果一切顺利,你应该能看到 Zeek 脚本的每个组件都正常(ok):

接下来,运行 deploy 命令以在你的机器上启动并运行 Zeek。deploy 命令等同于 Zeek 上的 install 和 start 命令。
deploy
你应该能看到 Zeek 集群的每个组件正在启动:

最后,通过执行以下 status 命令验证 Zeek 集群的每个组件。
status
如果你的安装成功,你应该能看到 Zeek 集群的每个组件都在运行。

输入 exit 退出 Zeek 控制 shell。
此时,Zeek 集群正在运行。它还会监控目标网络接口和子网,并将日志文件生成到 /opt/zeek/logs 目录。
Zeek 日志指南
配置完 Zeek 后,下一步是探索 Zeek 生成的日志文件,这些文件位于 /opt/zeek/logs/current 目录。默认情况下,Zeek 以 TSV(制表符分隔值)格式生成日志文件。
当 Zeek 运行时,它会监控系统上的目标网络接口,并将日志文件生成到 /opt/zeek/logs/current/ 目录。
将你的工作目录切换到 /opt/zeek/logs/current/ 目录,并运行以下 ls 命令。
cd /opt/zeek/logs/current/
ls -ah
你应该能看到 Zeek 生成的多个日志文件。你可能会发现系统中缺少某些日志文件,因为对应的目标服务不可用。

以下是一些你必须了解的重要日志文件:
- conn.log:TCP 和 UDP 的连接日志。该日志文件提供了最有用的信息,例如时间戳、连接持续时间、服务等等。
- dns.log:DNS(域名系统,Domain Name System)日志。
- http.log:超文本传输协议(HTTP,HyperText Transfer Protocol)日志。
- ssh.log:用于跟踪 SSH 连接的 Secure Shell(SSH)日志。
- ssl.log:安全套接层(SSL,Secure Socket Layer)日志,其中也包含 HTTPS 日志。
通过 Zeek-cut 分析 Zeek 日志 TSV(制表符分隔值)
默认情况下,Zeek 以 TSV(制表符分隔值)格式生成日志文件。在接下来的步骤中,你将通过 zeek-cut 命令行分析 TSV 格式的 Zeek 日志文件。
执行以下 cat 命令查看日志文件 dns.log。
cat dns.log
在以下输出中,你应该能看到多个字段,例如 ts、uid、id.orig_p、id.resp_h、id.resp_p、proto 等等。

接下来,执行以下命令解析 Zeek TSV 日志格式。借此,你将通过管道 "|" 将输出发送给 zeek-cut 命令。
在本示例中,你将提取日志文件中的三个字段,例如 id.orig_h、query 和 answers。
cat dns.log | zeek-cut id.orig_h query answers
cat dns.log | zeek-cut query answers id.orig_h
你应该能看到类似以下的输出:

你也可以像以下命令那样,使用重定向符号通过 zeek-cut 处理 TSV 日志文件。
zeek-cut id.orig_h query answers < dns.log
输出应该类似。

将 Zeek 日志文件配置为 JSON
在接下来的步骤中,你将配置 Zeek 以 JSON 格式生成输出日志文件。为此,你必须修改 local.zeek 文件,并将 zeek 脚本 tuning/json-logs 加载到你的 Zeek 安装中。
使用以下 nano 编辑器命令打开文件 /opt/zeek/share/zeek/site/local.zeek。
sudo nano /opt/zeek/share/zeek/site/local.zeek
将以下配置插入到文件末尾。
@load tuning/json-logs
完成后保存并关闭文件。
现在运行以下 zeekctl 命令,重新部署你的 Zeek 安装。
zeekctl deploy
你应该能看到 Zeek 正在重新安装。一旦该过程完成,Zeek 将生成 JSON 日志文件。

在分析 JSON 日志格式之前,先通过执行以下 apt 命令在你的机器上安装 jq。
sudo apt install jq -y

安装好 jq 后,切换到 /opt/zeek/logs/current/ 目录。/opt/zeek/logs/current 目录包含 JSON 格式的 Zeek 日志文件,它由 Zeek 自动生成。
cd /opt/zeek/logs/current/
运行以下 cat 命令查看日志文件 dns。
cat dns.log
JSON 输出将显示在你的终端屏幕上。

接下来,运行以下 jq 命令处理 JSON 日志 dns.log。
jq . dns.log

或者,你可以像下面这样通过 -c 选项显示紧凑格式。
jq . -c dns.log

最后,执行以下命令,从 JSON 文件 dns.log 中显示特定的键/值。
jq -c '[."id.orig_h", ."query", ."answers"]' dns.log
你应该能看到类似以下的输出。

结论
恭喜!你现在已经成功在 Debian 12 服务器上安装了 Zeek 网络监控工具。你安装了 Zeek,以集群模式运行了 Zeek,了解了部分 Zeek 日志文件,并学习了如何通过 zeek-cut 解析 TSV 格式的 Zeek 日志文件。此外,你还将 Zeek 日志改为了 JSON,并学习了如何通过 jq 命令行解析 Zeek 的 JSON 格式日志。