ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Zeek SumStats 框架 MAX 插件源码与实战解析:利用 SumStats::MAX 追踪观测流最大值

Zeek SumStats 框架 MAX 插件源码与实战解析:利用 SumStats::MAX 追踪观测流最大值 网络安全网络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 网络分析框架中 SumStats 摘要统计框架的MAX计算插件位于 scripts/base/frameworks/sumstats/plugins/max.zeek。文章将以该插件的接口定义、底层实现与官方测试用例为主线说明如何通过SumStats::MAX在自定义观测流上持续追踪最大值并讲解其与 SumStats 框架核心调度、结果合并机制之间的协作方式。读完本文你将掌握MAX插件的注册原理、max结果字段的语义以及如何在真实 Zeek 脚本中组合使用它。1. 插件定位SumStats 框架中的最大值计算器SumStatssummary statistics是 Zeek 内置的统计框架用于把大规模数据流压缩为简单的摘要测量值。它本身并不内置任何具体算法而是把每种统计量都实现为可插拔的“计算插件”pluginMAX就是其中之一其功能正如文档所述“Find the maximum value.”求最大值。在插件目录 scripts/base/frameworks/sumstats/plugins/ 下与max.zeek并列的还有average.zeek、min.zeek、sum.zeek、std-dev.zeek、variance.zeek、unique.zeek、hll_unique.zeek、last.zeek、sample.zeek、topk.zeek等它们共同通过 plugins/load.zeek 中的load指令批量装载。当你在脚本中load base/frameworks/sumstats时MAX插件即随框架一起就绪。插件所属命名空间为SumStats其文档位于 doc/scripts/base/frameworks/sumstats/plugins/max.zeek.rst。从文档的:Imports:一节可以看到它依赖框架核心 scripts/base/frameworks/sumstats/main.zeek也就是说它只负责在核心框架之上“追加”一种计算能力而不重复实现框架逻辑。2. 接口定义向框架注册枚举值与结果字段MAX插件通过 Zeek 脚本的redef机制向 SumStats 框架的两个基础类型追加内容这一部分对应文档 “Summary / Redefinitions” 一节向枚举类型SumStats::Calculation追加新成员SumStats::MAX用于在 Reducer 的$apply集合中声明“本 reducer 需要计算最大值”向记录类型SumStats::ResultVal追加可选字段max: double optional用于存放计算结果——“For numeric data, this tracks the maximum value.”对数值型数据该字段记录最大值。对应的源码如下redef enum Calculation { ## Find the maximum value. MAX }; redef record ResultVal { ## For numeric data, this tracks the maximum value. max: double optional; };注意max字段被声明为optional当某个 reducer 未申请MAX计算时结果中不会出现该字段脚本侧访问前需用result?$max判断。从 main.zeek 可见ResultVal基类自身只有三个字段——begin首个观测进入时间、end最后一个观测进入时间、num观测计数其余统计字段全部由各插件通过redef record ResultVal 追加这正是框架“插件化”设计的体现。3. 实现原理观察期更新与结果合并两段逻辑MAX插件的核心实现在max.zeek中由两个 hook 组成分别对应两种数据流场景。3.1 单点观测register_observe_plugins 中的增量更新hook register_observe_plugins() { register_observe_plugin(MAX, function(r: Reducer, val: double, obs: Observation, rv: ResultVal) { if ( ! rv?$max ) rv$max val; else if ( val rv$max ) rv$max val; }); }这个 hook 在框架初始化时main.zeek 中的event zeek_init() priority100000被触发框架遍历所有插件调用各自的register_observe_plugins并把计算函数存入calc_store表。之后每次脚本调用SumStats::observe(id, key, obs)时框架 observe() 会为每个挂接在对应 stream 上的 reducer 取出其calc_funcs列表逐一执行对应的计算函数。MAX的计算逻辑非常直观若结果值尚未初始化! rv?$max直接把当前观测值赋给rv$max否则仅当新观测值更大时才更新。因此它维护的是一个“单调不减”的最大值符合求最大值语义。关于val的来源有一个值得注意的细节在 observe() 中如果观测值obs提供的是$numcount或$dbldouble则val取对应数值如果提供的是$str字符串则回退为1.0。也就是说MAX插件只对数值型观测有意义文档中的max: double字段也印证了这一点字符串观测会被当作数值 1.0 参与比较。3.2 跨结果合并compose_resultvals_hookSumStats 结果不仅会在单个 reducer 内随观测增量更新还会在 epoch 结束或集群场景中把两个ResultVal合并成一个例如单机模式 epoch 结束时、集群中节点间结果汇总时。框架的 compose_resultvals() 负责合并begin、end、num等公共字段随后通过compose_resultvals_hook让各插件补上自己的合并逻辑hook compose_resultvals_hook(result: ResultVal, rv1: ResultVal, rv2: ResultVal) { if ( rv1?$max rv2?$max ) result$max (rv1$max rv2$max) ? rv1$max : rv2$max; else if ( rv1?$max ) result$max rv1$max; else if ( rv2?$max ) result$max rv2$max; }其语义为两个结果都有max时取较大者只有一个有max时直接继承两者都没有则结果中不设置max字段。这保证了多 epoch 汇总或集群合并后的最大值仍然正确不会因合并操作被高估或低估。4. 实战用法在 Reducer 中启用 MAX 并读取结果MAX的使用方式与 SumStats 其他插件完全一致在构建SumStats::Reducer时把SumStats::MAX加入$apply集合框架即自动维护结果字段用户只需在回调中读取result[stream][$max]。官方测试 testing/btest/scripts/base/frameworks/sumstats/basic.zeek 展示了标准用法load base/frameworks/sumstats redef exit_only_after_terminateT; event zeek_init() priority5 { local r1: SumStats::Reducer [$streamtest.metric, $applyset(SumStats::SUM, SumStats::VARIANCE, SumStats::AVERAGE, SumStats::MAX, SumStats::MIN, SumStats::STD_DEV, SumStats::UNIQUE, SumStats::HLL_UNIQUE)]; SumStats::create([$nametest, $epoch3secs, $reducersset(r1), $epoch_result(ts: time, key: SumStats::Key, result: SumStats::Result) { local r result[test.metric]; print fmt(Host: %s - ... - max:%.1f - ..., key$host, ..., r$max, ...); terminate(); }]); SumStats::observe(test.metric, [$host1.2.3.4], [$num5]); SumStats::observe(test.metric, [$host1.2.3.4], [$num22]); SumStats::observe(test.metric, [$host1.2.3.4], [$num94]); SumStats::observe(test.metric, [$host1.2.3.4], [$num50]); SumStats::observe(test.metric, [$host1.2.3.4], [$num50]); ... }对该测试中的1.2.3.4主机而言依次喂入5、22、94、50、50五个观测r$max最终应为94.0。可以推断若将相同逻辑推广到网络场景一个典型应用是把连接持续时间、请求字节数、响应延迟等指标写入观测流再用MAX追踪某段时间内每个主机Key中的$host或每个逻辑分组Key中的$str的峰值。关于回调的执行时机main.zeek 中SumStats::SumStat记录给出了完整上下文$epoch决定聚合周期周期结束触发epoch_result每个 key 调用一次与epoch_finished$threshold/$threshold_series配合$threshold_val可在MAX值越过阈值时触发threshold_crossed。例如把threshold_val写成返回result[test.metric]$max即可实现“某 key 的峰值超过 N 时告警”。若将$epoch设为0 secs则进入手动 epoch 模式需通过SumStats::next_epoch()主动结束周期。5. 工程细节与注意事项结合 main.zeek 的框架实现使用MAX时还需注意以下几点结果字段可选性max是optional字段仅当 reducer 的$apply中包含SumStats::MAX时才存在。读取前建议用result?$max做存在性判断或使用result$max?的取值安全模式避免脚本因字段缺失报错。数值类型语义max: double意味着 count 类型的观测也会被自动转换为 double 后比较字符串观测会被框架回退为数值1.0因此字符串流上的MAX结果恒为1.0没有实际统计意义应避免混用。集群一致性MAX的合并逻辑取两值较大者保证在集群环境中无论结果来自哪个 worker汇总后的最大值都与“全局最大值”一致。合并公共字段begin、end、num由框架的compose_resultvals()统一完成插件只负责自身字段。依赖与装载MAX无额外计算依赖对比variance等可能需要依赖其他计算的插件且已包含在 plugins/load.zeek 的默认装载清单中正常load base/frameworks/sumstats即可使用无需单独load。阈值联动若使用MAX结果做阈值检测需把阈值设为本 epoch 内预期的峰值量级因为 epoch 结束后reset()会清空结果与阈值跟踪状态main.zeek新一轮统计从零开始。6. 小结SumStats::MAX是 Zeek SumStats 框架中最简单也最常用的计算插件之一它通过redef enum Calculation { MAX }注册计算类型、通过redef record ResultVal { max: double optional }提供结果字段并在register_observe_plugins与compose_resultvals_hook两个 hook 中分别实现观测期增量更新与结果合并语义。无论是单机脚本内的峰值追踪还是集群环境下的跨节点汇总MAX都能以框架统一的方式工作是构建基于峰值的告警、基线画像等检测逻辑的可靠基础组件。更多框架级接口create、observe、threshold_crossed、next_epoch等可进一步查阅 scripts/base/frameworks/sumstats/main.zeek配套测试可参考 testing/btest/scripts/base/frameworks/sumstats/ 目录下的basic.zeek、thresholding.zeek、manual-epoch.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 SumStats 框架 MIN 计算插件深入解析用 SumStats::MIN 追踪数值流的最小值Zeek SumStats 框架 MIN 计算插件深入解析用 SumStats::MIN 追踪数值流的最小值 SumStats::MIN 是 Zeek 汇总统网络安全网络IDSZeek SumStats 框架 AVERAGE 插件详解从源码到实战的平均值统计Zeek SumStats 框架 AVERAGE 插件详解从源码到实战的平均值统计 导读 本文聚焦 Zeek 的 Summary StatisticsSum网络安全网络IDSZeek SumStats 框架详解用观察流、Reducer 与 Epoch 构建可伸缩的网络统计与阈值检测Zeek SumStats 框架详解用观察流、Reducer 与 Epoch 构建可伸缩的网络统计与阈值检测 导读 本文以 Zeek 的 Summary St网络安全网络IDS上一篇dlssg-to-fsr3高级功能HDR支持、运动向量处理与调试工具详解下一篇pyre2源码解析_re2.cc C扩展如何桥接RE2与CPython API创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表