尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Zeek 社区 ID(Community ID)连接日志字段:community-id-logging 脚本原理与实战指南
网络安全网络IDS【免费下载链接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.项目地址https://gitcode.com/gh_mirrors/ze/zeek点击查看免费下载社区 IDCommunity ID是一种标准化的连接标识符生成规范它把一条连接的五元组信息源/目的 IP、源/目的端口、传输层协议通过 SHA-1 哈希与固定格式编码生成一个跨工具、跨网络位置都可复用的稳定字符串。当 Zeek 需要与 Suricata、Wireshark、Elastic Stack 等外部安全工具进行事件关联、数据去重或横向取证时社区 ID 是天然的“连接主键”。本文以 Zeek 仓库中的 doc/scripts/policy/protocols/conn/community-id-logging.zeek.rst 文档为核心结合脚本源码与 btest 测试用例讲解如何在conn.log中启用并定制community_id字段读完后你将掌握该脚本的加载方式、两个运行时选项的作用、底层哈希实现原理以及如何把它延伸到 Notice 日志与自定义脚本中。一、脚本定位为 conn.log 增加社区 ID 字段policy/protocols/conn/community-id-logging.zeek是 Zeek 官方 policy 脚本库中的一个“增强型”脚本其唯一职责是在每个连接建立时计算社区 ID并将其写入conn.log的community_id字段。脚本的源码头注释与文档一致地描述了这一点##! Adds community hash IDs to conn.log.该脚本不属于base基础脚本需要显式加载load protocols/conn/community-id-logging加载后脚本通过redef向连接日志记录类型Conn::Info追加一个可选的、带log属性的字符串字段redef record Conn::Info { community_id: string optional log; };optional表示该字段允许缺失例如在计算失败、传输层未知等场景下字段不会出现在日志中或为空log表示该字段会进入conn.log的日志输出列。从 Zeek 类型系统看Conn::Info是base/protocols/conn中定义的连接记录类型脚本依赖load base/protocols/conn才能访问它这正是文档 “Imports: base/protocols/conn” 一节的含义。二、运行时选项seed 与 do_base64文档的 “Runtime Options” 一节给出了脚本暴露的全部两个可调参数二者均为redef选项可以在zeek命令行-e或-O或自定义脚本中覆写选项类型默认值含义CommunityID::seedcount无符号 16 位整数0用于哈希计算的种子值用于打散不同传感器上的 ID 空间CommunityID::do_base64boolT开启是否对 SHA-1 摘要做 Base64 编码以缩短输出源码定义位于 scripts/policy/protocols/conn/community-id-logging.zeekmodule CommunityID; export { # An unsigned 16-bit number to seed our hashing option seed: count 0; # Whether to add a base64 pass over the hash digest. # Enabled by default, since it shortens the output. option do_base64: bool T; }2.1 seed种子值的用途与限制seed是一个无符号 16 位整数count类型实际取值被限制在 0–65535超出部分在 C 实现中通过uint16_t hash_seed htons(seed)截断并转为网络字节序。默认0即社区 ID 规范中的标准种子此时生成的 ID 与 Suricata、Wireshark 等工具默认输出的社区 ID完全一致可直接跨工具比对。如果需要让某个特定传感器或抓包点生成“私有化”的 ID 空间例如多探针部署中希望本机 ID 不与外部工具默认值混淆可覆写该值zeek -e redef CommunityID::seed 42; -r traffic.pcap protocols/conn/community-id-logging注意修改种子后同一连接生成的 ID 将不再与标准社区 ID 兼容跨工具关联时需要同步修改所有参与方的种子配置。2.2 do_base64输出格式的取舍社区 ID 规范规定输出格式为版本号:哈希值。当do_base64 T默认时哈希部分输出为 Base64 编码长度更短当设为F时输出 SHA-1 的十六进制ASCII摘要可读性更强但更长zeek -e redef CommunityID::do_base64 F; -r traffic.pcap protocols/conn/community-id-logging从 src/communityid.bif 的实现可以看到两种分支Base64 模式走zeek::detail::Base64Converter编码器非 Base64 模式走zeek::detail::sha1_digest_print打印摘要。二者输出的字符串都统一以1:版本前缀开头目前实现中还没有真正的多版本/哈希配置逻辑固定前缀1:。三、底层实现community_id_v1 的哈希原理社区 ID 字段的计算并不在 Zeek 脚本层完成而是由内置函数BiFcommunity_id_v1实现其 BiF 声明在 src/communityid.biffunction community_id_v1%(cid: conn_id, seed: count default0, do_base64: bool defaultT%): string也就是说它接受一个conn_id记录含orig_h、orig_p、resp_h、resp_p、proto等字段以及上述两个选项返回社区 ID 字符串。该函数被标记为ATTR_FOLDABLE见 src/script_opt/FuncInfo.cc在 Zeek 的 ZAM/CPP 优化编译器中可被折叠求值。3.1 哈希输入构造C 实现src/communityid.bif把conn_id记录拆解为哈希输入顺序为2 字节种子htons(seed)源地址IPv4 取 4 字节IPv6 取 16 字节目的地址同样按地址族取 4/16 字节1 字节协议号TCP →IPPROTO_TCPUDP →IPPROTO_UDPICMP 按 IPv4/IPv6 分别映射为IPPROTO_ICMP/IPPROTO_ICMPV61 字节填充字节hash_padbyte 0若连接带端口源端口与目的端口各 2 字节网络字节序。对于没有端口概念的协议如未知传输层协议端口字段不参与哈希。遇到TRANSPORT_UNKNOWN且协议号为UNKNOWN_IP_PROTO时函数会发出CommunityID: unknown transport layer错误并返回空字符串该空字符串不会写入日志或写入为空值。3.2 端点规范化canonicalization社区 ID 规范要求“对称性”无论从哪一端观察连接计算出的 ID 都必须相同。实现通过zeek::addr_port_canon_lt对地址端口二元组做规范排序必要时交换源/目的if (is_one_way || zeek::addr_port_canon_lt(orig_addr, hash_src_port, resp_addr, hash_dst_port)) { // All good, no need to flip } else { // Need to flip endpoints for hashing. std::swap(hash_src_addr, hash_dst_addr); std::swap(hash_src_port, hash_dst_port); }ICMP 流量的特殊情况由zeek::packet_analysis::ICMP::ICMP4_counterpart/ICMP6_counterpart处理单向 ICMP 消息例如仅有 Echo Request会通过 ICMP 类型/代码的“对偶关系”如 Echo Request ↔ Echo Reply映射出对端端口从而保证 ID 对称。btest 中的 community-id-logging-flipped.zeek 测试正是用handshake-reorder.pcapTCP 握手乱序、两端视角互换验证“即使连接被翻转community_id依然正确记录”。3.3 摘要与输出规范排序后的输入交给zeek::detail::hash_init(Hash_SHA1)计算 SHA-1 摘要最后拼接版本前缀std::string ver(1:);最终输出形如1:wCb3OG7yAFWelaUydu0D125CLM。在 testing/btest/bifs/community_id/v1.zeek 中固化了多组“输入 → 期望输出”的黄金用例例如test_it([$orig_h1.2.3.4, $orig_p1122/tcp, $resp_h5.6.7.8, $resp_p3344/tcp, $proto6, $ctx[]], 0, 1:wCb3OG7yAFWelaUydu0D125CLM); test_it([$orig_h1.2.3.4, $orig_p1122/udp, $resp_h5.6.7.8, $resp_p3344/udp, $proto17, $ctx[]], 0, 1:0Mu9InQx6z4ZiCZM/7HXi2WMhOg); test_it([$orig_h1.2.3.4, $orig_p8/icmp, $resp_h5.6.7.8, $resp_p0/icmp, $proto1, $ctx[]], 0, 1:crodRHL2FEsHjbv3UkRrfbs4bZ0);同一组输入在seed1时得到完全不同的输出如1:HhA1B6CoLbiKPEs5nhNYN4XWfk直观验证了种子对 ID 空间的分隔作用。另有 run-pcaps.zeek 使用 testing/btest/Traces/communityid 目录下的一组真实 pcap 逐条验证输入输出。四、启用与验证实战操作步骤4.1 在 conn.log 中启用 community_id最直接的启用方式是命令行加载脚本zeek -r traffic.pcap protocols/conn/community-id-logging或在站点脚本如scripts/site/local.zeek中统一加载。之后查看conn.log可以看到新增的列#separator \x09 #path conn ... community_id 1:wCb3OG7yAFWelaUydu0D125CLM对应 btest 测试 community-id-logging.zeek 的做法# TEST-EXEC: zeek -b -r $TRACES/http/get.pcap %INPUT # TEST-EXEC: zeek-cut id.orig_h id.orig_p id.resp_h id.resp_p proto service community_id conn.log conn.log.cut即用zeek-cut工具抽取community_id列并与期望输出比对。4.2 工作原理new_connection 事件挂钩字段的计算发生在脚本底部的new_connection事件处理器中优先级为 5高于默认优先级 0保证在大多数其他处理器之前执行event new_connection(c: connection) priority5 { c$conn$community_id community_id_v1(c$id, CommunityID::seed, CommunityID::do_base64); }连接建立瞬间该事件即被触发community_id_v1读取连接 IDc$id并写入记录字段。由于字段带log属性连接关闭写日志时自动输出。这也是为什么 community-id-logging-flipped.zeek 中可以在new_connection里直接print c$conn$community_id取到值。4.3 自定义脚本中复用社区 ID由于community_id_v1是全局内置函数无需加载 policy 脚本即可在任何 Zeek 脚本中调用例如为自定义日志或告警逻辑生成 IDevent new_connection(c: connection) { local cid community_id_v1(c$id); print fmt(connection %s - community ID %s, c$uid, cid); }run-pcaps.zeek也展示了在connection_state_remove事件中打印c$id与 ID 的用法。五、扩展把社区 ID 带入 Notice 日志文档虽然只覆盖conn.log但仓库中配套的 scripts/policy/frameworks/notice/community-id.zeek 演示了同族扩展为notice.log增加community_id字段实现连接日志与告警日志的 ID 关联。该脚本自动加载community-id-loggingload base/protocols/conn load base/frameworks/notice load policy/protocols/conn/community-id-logging module CommunityID::Notice; export { # Turn notice support on/off at runtime. When disabled, # this still leaves the community_id string in the notice # log, just unset. option enabled: bool T; redef record Notice::Info { community_id: string optional log; }; } hook Notice::notice(n: Notice::Info) { if ( CommunityID::Notice::enabled n?$conn n$conn?$conn ) { local info n$conn$conn; if ( info?$community_id ) n$community_id info$community_id; } }要点额外提供CommunityID::Notice::enabled选项默认T可在运行时关闭 Notice 侧的 ID 输出通过Notice::notice钩子从连接记录中拷贝已计算好的community_id因此必须先加载community-id-logging才会产生值加载方式load policy/frameworks/notice/community-id。对应测试见 testing/btest/scripts/policy/frameworks/notice/community-id.zeek。六、常见问题与注意事项ID 为空/缺失当连接传输层协议为TRANSPORT_UNKNOWN且协议号为未知值时community_id_v1返回空字符串字段因optional而缺失或为空。这不是 bug而是无法构造合法哈希输入时的安全回退。ICMP 双向一致性社区 ID 对 ICMP 做了类型/代码对偶映射Echo Request 与 Echo Reply 会得到同一个 ID但纯单向、无对偶消息的 ICMP 连接其端点规范化逻辑取决于 ICMP 对偶映射的判定结果跨工具比对时以双方实现的规范为准。种子影响互操作性默认seed0才能与外部工具默认值互通自定义种子后需同步配置所有比对方。版本前缀固定为1:当前实现没有版本选择逻辑输出恒为 v1 格式未来规范若推出 v2字段格式会随内核更新脚本侧无需改动。不要在 base 中重复加载该脚本属于 policy 层显式加载一次即可重复加载同一脚本会被 Zeek 的加载器去重。七、小结community-id-logging是 Zeek 生态中“低成本、高价值”的互操作性脚本一条load指令即可让conn.log携带符合社区 ID 规范的稳定标识配合CommunityID::seed与CommunityID::do_base64两个redef选项可精确控制 ID 空间与输出格式。其底层由 src/communityid.bif 中的community_id_v1完成端点规范化、SHA-1 摘要与 Base64 编码并有 testing/btest/bifs/community_id 与 testing/btest/scripts/policy/protocols/conn 两套测试固化了跨版本的正确性。配合 scripts/policy/frameworks/notice/community-id.zeek可在连接日志与告警日志之间建立统一的关联键为多传感器部署与跨工具取证提供坚实基础。赞分享网络安全网络IDS【免费下载链接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.项目地址https://gitcode.com/gh_mirrors/ze/zeek点击查看免费下载相关推荐Zeek 的 community_id_v1() 完全指南Community ID v1 哈希的计算原理与实战应用Zeek 的 community_id_v1 完全指南Community ID v1 哈希的计算原理与实战应用 Community ID 是一套为网络流/连接网络安全网络IDSOpCore-Simplify 一键生成 OpenCore EFI黑苹果从零配置到避坑完整指南OpCore Simplify 一键生成 OpenCore EFI黑苹果从零配置到避坑完整指南 手搓黑苹果的 EFI 是整条链路里最容易翻车的一环confi网络安全网络IDSZeek 协议违规包段日志packet-segment-logging原理与实战指南Zeek 协议违规包段日志packet segment logging原理与实战指南 导读 本文围绕 Zeek 策略脚本 scripts/policy/fr网络安全网络IDS上一篇Symfony Translation转储器系统12种格式一键导出多语言资源下一篇革命性Linux面部认证Howdy CLI工具完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

Azure AI Travel Agents 案例研究:用 MCP 编排多 Agent 旅行规划系统的参考实现

Azure AI Travel Agents 案例研究:用 MCP 编排多 Agent 旅行规划系统的参考实现

教程文档人工智能 【免费下载链接】mcp-for-beginners This open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for deve…

📅 2026/10/10 1:29:15
Pika 分片模式 API 实战指南:Table、Slot 与 pkcluster 命令体系全解析

Pika 分片模式 API 实战指南:Table、Slot 与 pkcluster 命令体系全解析

数据库KV存储后端 【免费下载链接】pika Pikiwidb is a Redis-Compatible database developed by Qihoos infrastructure team. 项目地址: https://gitcode.com/gh_mirrors/pi/pika 点击查看 免费下载 导读 本文以 Pika(Pikiwidb,奇虎 360 …

📅 2026/10/10 1:29:15
从解压到跑通:艺诚美业管理系统Zip包完整解析与改造

从解压到跑通:艺诚美业管理系统Zip包完整解析与改造

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/10 1:29:15
MORE NEWS

更多资讯

📰

SpringBoot+Vue私人诊所管理系统:协同过滤推荐算法实战解析

这两年我陆陆续续帮几个做基层医疗系统的朋友看过代码,也做过一些私人诊所的信息化改造,发现一个挺有意思的现象:很多诊所老板以为管理系统就是“记个账、排个班”,但真正用了半年之后,最让他们离不开的反而是“推荐”…

📰

MagPie模型路由工具:Agent多模型统一管理与自动分发实践

这个项目叫 MagPie,本质上是一个 Agent 模型路由工具。它的核心思路不是再训练一个多大的模型,而是把市面上已有的各种模型能力统一管起来,根据任务类型自动选择最合适的模型去处理。对于经常在 Agent、工作流、自动化脚本里反复切换模型的人…

📰

用Shell脚本实现轻量级基础设施即代码(IaC)实践

做了这么多年运维,我一直觉得“基础设施即代码”这件事,不应该只有大厂那套玩法。很多小团队、轻量项目,根本不需要立刻上Terraform、Ansible这些重型工具,直接用Shell脚本也能把IaC做得明明白白。这次分享的这套实践,…

📰

本地AI项目部署实战:环境准备、API接口与批量任务全流程解析

高效启动本地 AI 项目:从环境准备到接口联调的一次完整实测打开这篇文章的读者,大概率不是来看概念介绍的,而是想知道三件事:这个项目怎么跑起来、跑起来之后能干什么、遇到问题怎么排查。这次我们就围绕一个本地 AI 工具类项目的…

📰

OpenHarmony真机Flutter应用错误处理与异常管理实战指南

在OpenHarmony真机上跑Flutter,最磨人的不是写页面,而是排错。原因很简单:你在模拟器里跑得好好的逻辑,一旦上了真机,摄像头权限、传感器驱动、系统省电策略、通知开关,任何一环出问题,整个App就…

📰

人类阅读与大语言模型如何应对概念中断和指称中断?

这次我们来看一个研究性项目:Distinct dynamics of conceptual and referential disruptions in human reading and large language model processing,翻译过来是“人类阅读与大语言模型处理中概念与指称中断的不同动态”。它不是一个可以一键部署的模型…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬