将Zeek和Suricata转换为流式命令行工具的方法
文章介绍了如何将Zeek和Suricata转换为流式命令行工具,以实现对网络流量的实时分析。通过配置Zeek从标准输入读取pcap数据并输出JSON日志,以及调整Suricata将EVE JSON输出到标准输出,可以构建高效的数据处理管道。这种方法提升了实时性、资源利用率,并支持复杂的安全分析场景。 2025-9-3 04:18:52 Author: www.freebuf.com(查看原文) 阅读量:10 收藏

在网络安全和运维领域,对网络流量进行深度分析和监控是至关重要的。Zeek和 Suricata 是两大强大的开源网络分析引擎,分别擅长于网络元数据提取和入侵检测。然而,它们通常被设计为读取离线 pcap 文件或监听网络接口,并将结果写入磁盘上的日志文件。在现代数据处理管道中,我们更倾向于流式处理数据,这意味着将工具转换为能够从标准输入读取数据并向标准输出写入结构化数据的命令行工具。

1. 流式处理的优势

在深入技术细节之前,了解流式处理的优势是很有必要的:

  • 实时性 :能够即时处理数据,减少分析延迟。
  • 资源效率 :避免将中间结果写入磁盘,减少I/O开销和存储需求,尤其是在处理大量数据时。
  • 可组合性 :通过管道(|)轻松将多个工具串联起来,构建复杂的数据处理链。
  • 自动化 :简化脚本和自动化工作流的开发,无需管理临时文件。

2. 将 Zeek 转换为流式命令行工具

Zeek 是一个功能强大的网络分析框架,它通过脚本语言提供高度的灵活性。为了将其转换为流式命令行工具,我们需要配置它从标准输入读取 pcap 数据,并以易于解析的 JSON 格式将日志输出到标准输出。

核心思想

  1. 从标准输入读取 pcap :使用 -r - 参数。
  2. 禁用默认文件日志 :避免 Zeek 在磁盘上创建各种 conn.loghttp.log 等文件。
  3. 启用 JSON 流式输出 :利用 Zeek 的 json-streaming-logs 插件,将所有事件和日志以 JSON 格式输出到标准输出。

Zeek 配置与命令

假设您已安装 Zeek。以下是实现这一目标的 Zeek 命令:

zeek -r - \     
LogAscii::output_to_stdout=T \     
JSONStreaming::disable_default_logs=T \     
JSONStreaming::enable_log_rotation=F \     
json-streaming-logs

参数解析:

  • zeek: Zeek 可执行文件。
  • -r -:
    • -r : 指示 Zeek 从文件读取网络流量(pcap)。
    • -: 特殊的文件名,表示从标准输入(stdin)读取数据。
  • LogAscii::output_to_stdout=T: 这是一个全局设置,用于将 Zeek 的 ASCII 日志输出重定向到标准输出。虽然我们主要关注 JSON,但这个设置对于确保所有日志输出(包括 JSON)流向 stdout 是很重要的。
  • JSONStreaming::disable_default_logs=T: 这是json-streaming-logs 插件的一个选项,用于禁用 Zeek 默认的基于文件的日志生成。这确保了 Zeek 不会在您的文件系统上留下大量日志文件。
  • JSONStreaming::enable_log_rotation=F: 禁用日志轮换功能,这在流式输出到 stdout 的场景下是没有意义的。
  • json-streaming-logs: 这是一个 Zeek 脚本包,它扩展了 Zeek 的功能,使其能够以 JSON 格式将所有生成的日志和事件实时流式输出到标准输出。这是实现流式输出的关键。

示例用法

您可以将一个 pcap 文件通过管道传递给 Zeek:

cat capture.pcap | zeek -r - \                       
LogAscii::output_to_stdout=T \                       
JSONStreaming::disable_default_logs=T \                       
JSONStreaming::enable_log_rotation=F \                       
json-streaming-logs \                       
| jq .

jq . 用于美化和验证 JSON 输出。您将看到类似以下的 JSON 行(每行一个 JSON 对象):

{"ts":1678886400.123456,"uid":"CjN7gU3Vb9","id.orig_h":"192.168.1.100","id.orig_p":50000,"id.resp_h":"10.0.0.1","id.resp_p":80,"proto":"tcp","service":"http","duration":0.001234,"orig_bytes":123,"resp_bytes":456,"conn_state":"SF","local_orig":true,"local_resp":false,"missed_bytes":0,"history":"ShAdAf","orig_pkts":3,"orig_ip_bytes":180,"resp_pkts":2,"resp_ip_bytes":116,"tunnel_parents":[],"_path":"conn","_write_ts":"2023-03-15T10:00:00.123456Z"}{"ts":1678886400.789012,"uid":"DkL8hV4Wc0","id.orig_h":"192.168.1.100","id.orig_p":50001,"id.resp_h":"10.0.0.2","id.resp_p":443,"proto":"tcp","service":"ssl","duration":0.002345,"orig_bytes":200,"resp_bytes":300,"conn_state":"SF","local_orig":true,"local_resp":false,"missed_bytes":0,"history":"ShAdAf","orig_pkts":4,"orig_ip_bytes":240,"resp_pkts":3,"resp_ip_bytes":180,"tunnel_parents":[],"_path":"ssl",""_write_ts":"2023-03-15T10:00:00.789012Z"}

每一行都是一个独立的 Zeek 日志事件,以 JSON 格式表示,可以通过 jq 或其他 JSON 解析器轻松处理。

3. 将 Suricata 转换为流式命令行工具

Suricata 是一个高性能的 IDS/IPS/NSM 引擎,以其 EVE JSON 日志格式而闻名,该格式包含了丰富的安全事件和网络元数据。将其转换为流式命令行工具,意味着从标准输入读取 pcap,并将 EVE JSON 输出到标准输出。

核心思想

  1. 从标准输入读取 pcap :使用 -r /dev/stdin 参数。
  2. 将 EVE JSON 输出到标准输出 :通过 --set 参数配置 EVE 日志的输出路径为 /dev/stdout
  3. 禁用控制台日志 :避免非 EVE JSON 消息污染标准输出。

Suricata 配置与命令

假设您已安装 Suricata 并有一个基本的 suricata.yaml 配置文件。以下是实现这一目标的 Suricata命令:

suricata -r /dev/stdin \         
--set outputs.1.eve-log.filename=/dev/stdout \         
--set logging.outputs.0.console.enabled=no

参数解析:

  • suricata: Suricata 可执行文件。
  • -r /dev/stdin:
    • -r : 指示 Suricata 从文件读取网络流量(pcap)。
    • /dev/stdin: Unix-like 系统中的特殊文件,代表标准输入。Suricata 将从此读取 pcap 数据。
  • --set outputs.1.eve-log.filename=/dev/stdout: 这是 Suricata 动态配置机制。
    • outputs.1.eve-log : 指的是 suricata.yaml 配置文件中 outputs 部分的第一个 EVE JSON 日志配置块。通常,EVE 日志是配置为 eve-log 的一个子项。
    • filename=/dev/stdout: 将 EVE 日志的输出路径设置为 /dev/stdout,使其流向标准输出。
  • --set logging.outputs.0.console.enabled=no: 这禁用 Suricata 可能在控制台输出的非 EVE 日志消息(如启动信息、错误或调试信息)。这确保了标准输出只包含纯净的 EVE JSON 事件流。

注意 :这里的 outputs.1.eve-log 中的 1 假定 eve-logoutputs 列表中的第一个元素(索引从 0 开始)。如果您的 suricata.yaml 配置不同,可能需要调整这个索引。但最常见的情况是 eve-log 是第一个或唯一一个启用的输出。

示例用法

将一个 pcap 文件通过管道传递给 Suricata:

cat capture.pcap | suricata -r /dev/stdin \                          
--set outputs.1.eve-log.filename=/dev/stdout \                          
--set logging.outputs.0.console.enabled=no \                          
| jq .

您将看到类似以下的 EVE JSON 事件(每行一个 JSON 对象):

{"timestamp":"2023-03-15T10:00:00.123456+0000","event_type":"flow","src_ip":"192.168.1.100","src_port":50000,"dest_ip":"10.0.0.1","dest_port":80,"proto":"TCP","flow_id":123456789,"in_iface":"eth0","pkts_toserver":3,"bytes_toserver":180,"pkts_toclient":2,"bytes_toclient":116,"start":"2023-03-15T10:00:00.123456+0000","end":"2023-03-15T10:00:00.124690+0000"}{"timestamp":"2023-03-15T10:00:00.789012+0000","event_type":"alert","src_ip":"192.168.1.100","src_port":50001,"dest_ip":"10.0.0.2","dest_port":443,"proto":"TCP","flow_id":987654321,"in_iface":"eth0","alert":{"action":"allowed","gid":1,"signature_id":2017367,"rev":2,"signature":"ET POLICY User-Agent (Mozilla/5.0)","category":"Attempted Information Leak","severity":3},"http":{"hostname":"evil.com","url":"/malware.exe","http_user_agent":"Mozilla/5.0"},"tls":{"subject":"evil.com"}}

4. 结合使用与高级应用

将 Zeek 和 Suricata 转换为流式命令行工具后,它们可以作为强大的构建块,用于创建复杂的数据处理和分析管道。

场景示例

  1. 实时威胁情报与元数据关联 : 将 Suricata 的告警与 Zeek 的详细连接日志关联起来,以获取更全面的上下文。
# 假设有一个网络流量源,例如从网络接口捕获并转换为pcap流# tcpdump -i eth0 -w - | \# 管道1:Zeek 生成连接和应用层元数据cat live_capture.pcap | zeek -r - ...json-streaming-logs | \jq -c 'select(._path == "conn")' | \tee >(kafka-producer --topic zeek-conn) &  # 将连接日志发送到Kafka# 管道2:Suricata 进行告警检测cat live_capture.pcap | suricata -r /dev/stdin ... | \jq -c 'select(.event_type == "alert")' | \kafka-producer --topic suricata-alerts  # 将告警发送到Kafka

通过不同的管道将 Zeek 和 Suricata 的输出发送到消息队列(如 Kafka),后续的分析系统可以订阅这些主题并进行关联分析。

  1. 实时协议解析和安全分析 : 将原始 pcap 流式传输到脚本中,然后分发给不同的分析工具。
# 假设 my_pcap_source 是一个生成 pcap 字节流的程序或脚本my_pcap_source | tee >(zeek -r - ...json-streaming-logs | some_zeek_processor) \              | tee >(suricata -r /dev/stdin ... | some_suricata_processor) \              | more_pcap_processing

这里使用了 tee 命令将标准输入分发到多个管道,允许 Zeek 和 Suricata 同时处理相同的 pcap 流。

结论

通过本文介绍的方法,我们可以有效地将 Zeek 和 Suricata 这两大网络分析利器从传统的批处理模式转换为现代的流式命令行工具。这种转换不仅提高了处理效率和资源利用率,更重要的是,它极大地增强了这些工具的灵活性和可组合性,使其能够无缝集成到各种自动化工作流、数据处理管道和实时安全监控系统中。掌握这些技巧,将使您的网络安全分析能力迈上一个新的台阶。


文章来源: https://www.freebuf.com/articles/447131.html
如有侵权请联系:admin#unsafe.sh