使用 Elastic Security 收集和分析 Zeek 数据
在本篇博文中,我将带您了解配置 Filebeat 和 Zeek(前身为 Bro)的过程,这将使您能够使用 Elastic Security 对 Zeek 数据进行分析。Filebeat 及其模块的默认配置适用于许多环境;然而,您可能需要根据自己的环境自定义设置。本篇博文详细介绍的步骤旨在帮助您更轻松地理解自定义配置的必要步骤,以便能够在 Elastic Security 中查看 Zeek 数据。
Beats 是轻量型采集器,非常适合将数据从网络边缘或附近收集并发送/传输到 Elasticsearch 集群。Beats 发送/传输的数据符合 Elastic Common Schema (ECS)。作为 Beat 家族的一员,Filebeat 内置了多种模块,可简化常见日志格式的收集、解析和可视化过程。这些模块通过结合基于您操作系统的自动默认路径来实现此目的。我们将使用 Filebeat 来解析 Zeek 数据。
我还将介绍有关 GeoIP 充实过程的详细信息,以便在 Elastic Security 地图上显示事件。此外,我将详细说明如何配置 Zeek 以输出 JSON 格式的数据,这是 Filebeat 所必需的。本博文仅涵盖配置部分。我假设您已经配置好了一个同时安装了 Filebeat 和 Zeek 的 Elasticsearch 集群。
环境详情
我的 Elastic 集群是使用 Elasticsearch Service 创建的,该服务托管在 Elastic Cloud 中。您可以轻松通过 14 天免费试用快速部署一个集群,无需信用卡。建议您试用一下,因为它能让您快速轻松地开始使用 Elastic Stack。
我正在使用 Zeek 3.0.0。您可以在 Zeek 网站上下载 Zeek。
Filebeat 概述
Filebeat 开箱即用,发送/传输数十种集成,让您在几分钟内即可实现从数据到仪表板的转换。您可以轻松地在我们的集成完整列表中找到所需内容。这些模块不仅了解如何解析源数据,还会设置摄取管道,将数据转换为 ECS 格式。
Elastic 正在努力通过 Elastic Agent 和 Ingest Manager 来改善数据载入和数据摄取体验。不过,这目前属于实验性版本,因此我们将重点使用生产就绪的 Filebeat 模块。此外,许多模块将提供一个或多个开箱即用的 Kibana 仪表板。

启用 Filebeat Zeek 模块
我们需要做的第一件事是在 Filebeat 中启用 Zeek 模块。Filebeat 提供的所有模块默认情况下均处于禁用状态。
第 1 步:在 Filebeat 中启用 Zeek 模块
在 Filebeat 中启用 Zeek 模块非常简单,只需运行以下命令:
sudo filebeat modules enable zeek此命令将通过 Filebeat 的
modules.d目录中的 zeek.yml配置文件启用 Zeek。Filebeat 应可从您的路径访问。如果无法访问,且您是使用 Elastic GitHub 存储库 安装的 Filebeat,则 Filebeat 的默认位置为/usr/bin/filebeat。
第 2 步:将 Zeek 日志路径添加到 zeek.yml
Zeek 日志路径是在 Zeek Filebeat 模块中配置的,而不是在 Filebeat 本身中。您需要编辑 Filebeat Zeek 模块配置文件 zeek.yml。对于我的 Filebeat 安装,它位于 /etc/filebeat/modules.d/zeek.yml。您应该为您感兴趣的每个 Zeek 日志添加条目。我的 Zeek 安装将日志写入的基目录为 /usr/local/zeek/logs/current
以下是 Zeek 日志路径的完整列表。您需要编辑这些路径以使其适合您的环境。
# Module: zeek
# 文档:/guide/en/Beats/Filebeat/7.6/Filebeat-模块-Zeek.html
- 模块:zeek
capture_loss:
enabled: true
var.paths: ["/usr/local/Zeek/日志/current/capture_loss.日志"]
连接:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/conn.log"]
dce_rpc:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/dce_rpc.日志"]
dhcp:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/dhcp.日志"]
dnp3:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/dnp3.日志"]
DNS:
enabled: true
var.paths: ["/usr/local/Zeek/日志/DNS.log"]
dpd:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/dpd.日志"]
文件:
enabled: true
var.paths: ["/usr/local/Zeek/日志/current/files.日志"]
ftp:
enabled: true
var.paths: ["/usr/local/Zeek/日志/current/ftp.日志"]
http:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/http.日志"]
情报:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/intel.日志"]
irc:
enabled: true
var.paths: ["/usr/local/Zeek/日志/current/irc.日志"]
kerberos:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/kerberos.日志"]
modbus:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/modbus.日志"]
MySQL:
enabled: true
var.paths: ["/usr/local/Zeek/日志/current/MySQL.日志"]
通知:
enabled: true
var.paths: ["/usr/local/Zeek/日志/current/notice.日志"]
ntlm:
enabled: true
var.paths: ["/usr/local/zeek/日志/current/ntlm.log"]
OCSP:
enabled: true
var.paths: ["/usr/local/Zeek/日志/current/ocsp.日志"]
pe:
enabled: true
var.paths: ["/usr/local/Zeek/日志/current/pe.日志"]
半径:
enabled: true
var.paths: ["/usr/local/Zeek/日志/current/radius.日志"]
rdp:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/rdp.日志"]
rfb:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/rfb.日志"]
# 签名:
# enabled: true
# var.paths: ["/usr/local/Zeek/logs/current/signatures.日志"]
吸入:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/sip.log"]
smb_cmd:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/smb_cmd.日志"]
smb_files:
enabled: true
var.paths: ["/usr/local/Zeek/日志/current/smb_files.日志"]
smb_mapping:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/smb_mapping.日志"]
smtp:
enabled: true
var.paths: ["/usr/local/Zeek/日志/current/smtp.日志"]
snmp:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/snmp.日志"]
socks:
enabled: true
var.paths: ["/usr/local/Zeek/日志/current/socks.日志"]
ssh:
enabled: true
var.paths: ["/usr/local/Zeek/日志/current/ssh.日志"]
ssl:
enabled: true
var.paths: ["/usr/local/zeek/日志/current/ssl.log"]
统计:
enabled: true
var.paths: ["/usr/local/Zeek/日志/current/stats.日志"]
Syslog:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/syslog.日志"]
traceroute:
enabled: true
var.paths: ["/usr/local/zeek/日志/current/traceroute.日志"]
隧道:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/tunnel.log"]
异常:
enabled: true
var.paths: ["/usr/local/Zeek/logs/current/weird.日志"]
x509:
enabled: true
var.paths: ["/usr/local/Zeek/日志/current/x509.日志"]
注:签名日志已被注释,因为 Filebeat 解析器(截至发布之日)尚不支持此博客撰写时的签名日志。
第 3 步:重启 Filebeat
完成 zeek.yml 配置文件的编辑和保存后,您应该重启 Filebeat。虽然您的 Linux 版本可能需要略有不同的操作,但通常可以通过以下命令完成:
sudo systemctl restart filebeat
此时,您通常会期望在 Elastic Security 和 Filebeat 索引中看到 Zeek 数据。如果您在 Discover 或任何仪表板中没有看到 Zeek 数据,请不要感到惊讶。您还需要执行几个步骤。
配置 Zeek 以输出 JSON
默认情况下,Zeek 不会以 JSON 格式输出日志。这就是导致 Filebeat 索引中缺少 Zeek 数据的原因。Filebeat Zeek 模块假定 Zeek 日志为 JSON 格式。如果您尝试解析默认的 Zeek 日志,很可能会看到日志解析错误。
- 您需要编辑
local.zeek配置文件以配置 JSON 日志输出。此配置文件的位置取决于您的 Zeek 安装方式。我的 Zeek 安装在/usr/local/zeek。我的配置文件位于/usr/local/zeek/share/zeek/site/local.zeek。 - 在配置文件末尾添加以下行:
@load policy/tuning/JSON-日志.Zeek
- 编辑完
local.zeek配置文件后,您需要使用以下命令重新启动 Zeek:sudo zeekctl 部署
这将使用更新后的配置文件设置重新启动 Zeek。 - 完成此编辑后,您应该重启 Filebeat。此时,您应该能在 Filebeat 索引中看到 Zeek 数据。
这是 Discover 的视图,显示了填充了数据后的地理字段值:

GeoIP 增强
一旦 Zeek 数据进入 Filebeat 索引,我惊讶地发现我在 Elastic Security 的“网络”选项卡中没有看到任何“pew pew”线条。我按照 SIEM 配置地图 UI 文档 中的说明创建了 geoip-info 摄取管道。我还验证了是否按照文档说明在 Filebeat 配置的输出部分引用了该管道。
下面这个例子为您演示了如何在 filebeat.yml 配置文件中定义管道:
输出.Elasticsearch: # 要连接的主机数组。 hosts: ["localhost:9200"] 管道:geoip-info
我运行 Zeek 的 Node 使用的是不可路由的 IP 地址,因此我需要使用 Filebeat add_field 处理器来根据 IP 地址地图地理信息。虽然上述链接中记录了相关信息,但字段名称存在问题。
GeoIP 管道假定 IP 信息位于 source.ip 和 destination.ip 中。对于大多数数据源而言确实如此。但是,对于 Zeek,该信息包含在 source.address 和 destination.address 中。为什么会这样?这实际上归结为数据流以及摄取管道何时启动的问题。
用于 Filebeat 的 Zeek 模块会创建一个摄取管道,将数据转换为 ECS。此管道将 source.address 的值复制到 source.ip,并将 destination.address 的值复制到 destination.ip。但是,在 Filebeat 中添加字段的 add_fields 处理器是在摄取管道处理数据之前运行的。因此,当 add_field 处理器处于活动状态时,source.ip 和 destination.ip 的值尚未填充。
我修改了 Filebeat 配置,使用了 add_field 处理器,并使用 address 代替了 ip。具体如下所示:
processors:
- add_host_metadata:
- add_cloud_metadata:
- add_fields:
when.network.source.address:10.128.0.0/24
字段:
source.geo.location:
纬度:41.619549
经度:-93.598022
source.geo.continent_name:北美
source.geo.country_iso_code:美国
source.geo.region_iso_code:US-IA
source.geo.region_name:艾奥瓦州
target: ''
- add_fields:
when.network.destination.address:10.128.0.0/24
字段:
destination.geo.location:
纬度:41.619549
经度:-93.598022
destination.geo.continent_name:北美
destination.geo.country_iso_code:美国
您需要注意,我在 when.network.source.address 行中使用的是 address 字段,而不是文档中指出的 when.network.source.ip。这同样适用于 destination 行。这解决了之前提到的数据流时序问题。在数据流的这一阶段,我所需的信息位于 source.address 字段中。
在 Elastic Security 中验证 Zeek 数据
完成 filebeat.yml 配置文件中的所有更改后,您需要使用以下命令重启 Filebeat:
sudo systemctl restart filebeat
现在打开 Elastic Security 并导航到“Network”(网络)选项卡。地图应能正确显示我们希望看到的“pew pew”线条。

除了网络地图外,您还应该能在 Elastic Security 概述选项卡上看到 Zeek 数据。在此示例中,您可以看到 Filebeat 在过去 24 小时内收集了超过 500,000 个 Zeek 事件。

您还可以在 Elastic Security 中将 Zeek 事件视为外部告警。

完成此配置所需的步骤相对较少。通常只需几分钟即可完成此配置,这再次印证了从数据到仪表板的转换是多么轻松快捷!
接下来做什么?
那么接下来的步骤是什么呢?请考虑您可能想要整合的其他数据源,例如 Suricata 和主机数据流。我建议您查看我们的博客《Elastic SIEM 入门:添加新的安全数据源》,该博客将引导您了解如何添加新的安全数据源以供 Elastic Security 使用。
准备好通过 Elastic Security 实现全面的数据保护了吗?立即在 Elastic Cloud 上的 Elasticsearch Service 中免费试用。