
网络安全网络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点击查看免费下载导读dns.log是 Zeek 网络分析框架中最常用的日志之一默认会为每条 DNS 事务记录 opcode 与 opcode_name 两个字段。但在多数安全监控与合规场景中这两个字段信息量有限却会占用存储空间、影响表格可读性。本文以 Zeek 仓库中自带的 policy 脚本policy/protocols/dns/disable-opcode-log-fields.zeek为线索讲解如何通过 Zeek 脚本的 record redefinition记录重定义机制从 dns.log 中彻底移除 opcode / opcode_name 两列并深入到DNS::Info记录定义与 DNS 事件处理代码弄清这两个字段的取值来源最后给出多种加载方式与验证手段帮助你按需裁剪 DNS 日志 schema。一、这个脚本解决什么问题DNS 日志默认字段数量众多其中opcodeDNS 操作码的数值如 0 表示查询与opcode_name操作码的可读字符串如query是两条紧密关联的列。官方生成的文档 doc/scripts/policy/protocols/dns/disable-opcode-log-fields.zeek.rst 对该脚本的定位只有一句话This script filters the opcode and opcode_name fields from dns.log.即加载该脚本后dns.log 中将不再输出 opcode 与 opcode_name 两个字段其余字段全部保留。该脚本归属于 policy 层非 base 层意味着它不是默认启用的而是由用户按需加载的策略脚本遵循 Zeek 默认安全、按需增强 的脚本分层设计base 层保证核心日志完整policy 层允许你做各种自定义裁剪。二、脚本源码逐行解读脚本本体只有 6 行位于 scripts/policy/protocols/dns/disable-opcode-log-fields.zeek##! This script filters the opcode and opcode_name fields from dns.log. load base/protocols/dns redef record DNS::Info$opcode - { log }; redef record DNS::Info$opcode_name - { log };逐行拆解load base/protocols/dns显式加载 DNS 协议分析的基础脚本确保DNS::Info记录类型已被定义与文档中:Imports: base/protocols/dns的声明一一对应。这一行也保证了脚本的加载顺序与依赖关系正确。redef record DNS::Info$opcode - { log };对DNS::Info记录的opcode字段执行属性移除。-是 Zeek 的 record redefinition 语法表示从该字段的既有属性集合中剔除log属性。log属性是字段是否作为日志列输出的开关去掉后该字段不再出现在 dns.log 中但字段本身仍存在于内存中的记录结构里。redef record DNS::Info$opcode_name - { log };对opcode_name字段执行同样的操作。值得注意的是这里用的是-移除属性而不是redef式的整体重定义也不影响字段的类型count与string、optional等其它属性因此副作用被控制在仅不输出到日志这一最小范围内。三、被裁剪字段在源码中的定义与赋值链路3.1 字段定义位置DNS::Info记录定义在 scripts/base/protocols/dns/main.zeek其中与本文相关的两个字段为## The opcode value of the DNS request/response. opcode: count log optional; ## A descriptive string for the opcode. opcode_name: string log optional;可以看到默认定义中两者都带有log optional属性。log让它们成为 dns.log 的列optional表示部分 DNS 消息如格式异常时可能取不到该值。disable-opcode-log-fields 脚本正是从默认属性集合中把log摘除。3.2 opcode_name 的取值来源opcode_name并非协议原始数据而是 Zeek 将数值映射为可读字符串的结果。映射表定义在 scripts/base/protocols/dns/consts.zeekconst DNS_OP_QUERY 0; const DNS_OP_IQUERY 1; const DNS_OP_SERVER_STATUS 2; const DNS_OP_NOTIFY 4; const DNS_OP_DYNAMIC_UPDATE 5; const DNS_OP_DSO 6; ## Mapping of DNS operation type codes to human readable string representation. const opcodes { [0] query, [1] iquery, [2] server-status, [4] notify, [5] dynamic-update, [6] dso, } default function(n: count): string { return fmt(opcode-%d, n); };即 opcode 数值 0/1/2/4/5/6 分别对应query、iquery、server-status、notify、dynamic-update、dso未列出的数值由default兜底函数格式化为opcode-N。此外 consts.zeek 还单独维护了 NetBIOS 名称服务NBNS的映射表netbios_opcodes将 0/5/6/7/8 映射为netbios-query、netbios-registration、netbios-release、netbios-wack、netbios-refresh。赋值发生在 scripts/base/protocols/dns/main.zeek 的 DNS 消息处理代码中c$dns$opcode msg$opcode; ... c$dns$opcode_name netbios_opcodes[msg$opcode]; ... c$dns$opcode_name opcodes[msg$opcode];Zeek 先取出报文头部中的 opcode 数值存入DNS::Info$opcode再根据是否 NetBIOS 查询从对应映射表中查出字符串存入opcode_name。可以推断即便加载 disable-opcode-log-fields 后这两个字段在内存中依然会被正常填充代码路径不变只是日志写入阶段不再把它们输出为列因此对其它依赖DNS::Info的脚本逻辑没有任何影响。四、如何加载与启用该脚本属于 policy 层不会随默认配置自动加载需要显式引入。常见方式有三种方式一写入 local.zeek推荐适用于长期部署在站点配置脚本 scripts/site/local.zeek 中追加一行load policy/protocols/dns/disable-opcode-log-fields.zeek之后每次以默认配置启动 Zeekzeek -i eth0或zeek -r capture.pcap都会自动生效。Zeek 加载脚本时路径中的scripts/前缀可以省略直接使用policy/protocols/dns/disable-opcode-log-fields.zeek或去掉.zeek后缀的policy/protocols/dns/disable-opcode-log-fields均可。方式二命令行一次性指定适用于临时实验zeek -r traffic.pcap policy/protocols/dns/disable-opcode-log-fields方式三在自有脚本中 load在你自己的分析脚本里通过load引入load policy/protocols/dns/disable-opcode-log-fields.zeek仓库内的加载佐证scripts/zeekygen/load.zeek 中第 18 行存在load policy/protocols/dns/disable-opcode-log-fields.zeek用于 zeekygen 文档生成环境下的脚本加载。scripts/test-all-policy.zeek 第 106 行以注释形式保留了#load protocols/dns/disable-opcode-log-fields.zeek说明该脚本被刻意排除在全量 policy 冒烟测试之外因为启用它会改变 dns.log 的列结构会影响其它测试的基线输出同时也从侧面印证它属于按需加载的可选策略。五、效果验证字段裁剪前后对比5.1 未加载时从 testing/btest/Baseline/coverage.record-fields/out.default 可以看到 Zeek 自身的字段覆盖率输出中DNS::Info记录呈现为* opcode: count, logT, optionalT * opcode_name: string, logT, optionalT其中logT表示这两个字段当前参与日志输出。运行后 dns.log 中会包含类似0/query的列。5.2 加载之后执行zeek -r traffic.pcap policy/protocols/dns/disable-opcode-log-fields后dns.log 的列头中不再出现opcode与opcode_name其余字段ts、uid、id、proto、trans_id、rtt、query、qclass、qclass_name、qtype、qtype_name、rcode、rcode_name、AA、TC、RD、RA、Z、answers、TTLs、rejected 等保持不变。测试基线 testing/btest/Baseline/scripts.policy.protocols.dns.dynamic-update/dns.log 展示了包含这两个字段的默认日志形态可作为裁剪前后的对照参考。六、扩展其它裁剪 DNS 日志列的思路disable-opcode-log-fields 展示的是用 record redefinition 移除单条字段属性的通用手法。同一模式下你还可以用同样的- { log }语法裁剪其它不关心的列如Z、AA、TC等只需仿照脚本模式对DNS::Info的对应字段操作若需要在更细粒度上控制输出内容Zeek 的 DNS 模块在 scripts/base/protocols/dns/main.zeek 定义了log_policy: Log::PolicyHook可以通过redef DNS::log_policy挂接策略钩子在日志写入前逐条决定保留、修改或丢弃记录若只想在查询阶段过滤不写日志可借助dns_*系列事件或Log::remove_field类日志框架接口实现运行时裁剪。结语policy/protocols/dns/disable-opcode-log-fields.zeek是理解 Zeek record 属性系统的一个极简范本6 行脚本两条redef ... - { log }即可精确地从 dns.log 中剔除 opcode 与 opcode_name 两个字段而完全不触碰内存中的数据结构和其它分析逻辑。配合本文对DNS::Info定义、opcode 映射表consts.zeek与赋值代码main.zeek的溯源你可以照葫芦画瓢按需定制属于自己的 DNS 日志列集在信息完整性与存储/可读性之间取得平衡。赞分享网络安全网络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 dns.log 深度解析DNS 日志字段、查询流程与实战分析方法Zeek dns.log 深度解析DNS 日志字段、查询流程与实战分析方法 导读 dns.log 是 Zeek 生成的最重要数据源之一它记录了网络内每一笔应网络安全网络IDS基于 Zeek 检测 DNS 数据外渗dns.log 字段解析、熵分析与多工具联动实战基于 Zeek 检测 DNS 数据外渗dns.log 字段解析、熵分析与多工具联动实战 本文基于 Anthropic Cybersecurity Skills网络安全AI 技能/插件渗透测试红蓝对抗Zeek OCSP 响应日志记录深入解析base/files/x509/log-ocsp.zeek 的日志流、字段语义与底层实现Zeek OCSP 响应日志记录深入解析base/files/x509/log ocsp.zeek 的日志流、字段语义与底层实现 base/files/x50网络安全网络IDS上一篇IronJS与Dynamic Language Runtime.NET动态编程的完美搭档下一篇UniVRM完整使用指南从安装到VRM模型导入导出的终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考