
网络安全网络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 中KerberosKRB协议分析并不止于生成kerberos.log它还会借助文件分析框架File Analysis Framework从 KRB pre-authentication 数据中提取出 PKINIT 携带的 X.509 客户端/服务端证书并把证书主体subject、文件唯一 IDFUID等关联回连接记录。本文以base/protocols/krb/files.zeek为核心完整讲解KRB::Info记录的六个扩展字段、KRB::get_file_handle与KRB::describe_file两个回调函数的类型签名与实现原理并结合 C 分析器源码揭示证书文件从生成、注册到回填的全过程。读完本文你将掌握如何配置 Zeek 分析 Kerberos PKINIT 流量中的证书、理解文件框架中协议注册与回调机制以及如何在脚本中消费这些证书字段。一、文件在 KRB 分析流程中的定位Kerberos 分析由两部分组成协议解析核心base/protocols/krb/main.zeek负责生成kerberos.log注册ANALYZER_KRBUDP 88与ANALYZER_KRB_TCPTCP 88端口并定义KRB::Info记录见 main.zeek文件分析扩展base/protocols/krb/files.zeek在连接记录上追加与证书文件相关的字段并把 KRB 协议接入 Zeek 的文件分析框架。原文档files.zeek.rst中明确了该脚本的依赖关系它load了 x509 分析、文件框架、KRB 主脚本 以及 连接标识工具。脚本顶部四个load与之一一对应load ./main load base/utils/conn-ids load base/frameworks/files load base/files/x509在files.zeek文件开头也有相同引用可从源码确认files.zeek。这一依赖链决定了其功能边界只做文件与证书信息的关联与回填而协议解析、日志流创建均在main.zeek中完成。二、KRB::Info 记录的证书相关字段原文档的 Redefinitions 部分列出了files.zeek对KRB::Info记录新增的六个字段全部定义在 files.zeek 的export块内。完整字段语义如下表字段类型属性含义client_certFiles::Infooptional客户端证书PKINIT PA-PK-AS-REQ 中携带client_cert_subjectstringlog optional客户端证书的 Subject若存在client_cert_fuidstringlog optional客户端证书文件的唯一 IDFUIDserver_certFiles::Infooptional服务端证书PA-PK-AS-REP 中携带server_cert_subjectstringlog optional服务端证书的 Subject若存在server_cert_fuidstringlog optional服务端证书文件的唯一 IDFUID字段类型语义要点携带log属性的四个字段两个 subject 与两个 fuid会直接写入kerberos.log而client_cert/server_cert本身是Files::Info记录含optional不参与日志输出仅作为脚本内联的证书对象供进一步分析client_cert_fuid/server_cert_fuid是可链接到文件日志如files.log、x509.log的关键键值借助 FUID 可把kerberos.log中的连接记录与证书文件分析结果一一对应。需要说明的是optional意味着这些字段仅在相应方向出现证书时才被填充例如 UDP AS-REQ 中无证书时client_cert字段不会被创建可用c$krb?$client_cert判断。三、两个默认回调get_file_handle 与 describe_file原文档 Functions 部分声明了两个全局函数其类型签名与用途如下函数类型签名用途KRB::get_file_handlefunction(c: connection, is_orig: bool): stringKRB 默认的文件句柄提供者KRB::describe_filefunction(f: fa_file): stringKRB 默认的文件描述器3.1 get_file_handle句柄由分析器生成脚本端留空源码实现位于 files.zeekfunction get_file_handle(c: connection, is_orig: bool): string { # Unused. File handles are generated in the analyzer. return ; }注释明确说明该函数未被使用——KRB 的文件句柄在 C 分析器端生成详见下文第五节脚本端只需按文件框架的注册要求提供一个占位实现返回空字符串即可。因此从脚本视角看get_file_handle是一个必须存在但不会真正被调用出有效值的注册钩子。3.2 describe_file尽力而为的证书描述器KRB::describe_file是文档中标注为Default file describer for KRB的核心函数实现于 files.zeek。其逻辑分三步来源过滤只有f$source为KRB_TCP或KRB的文件才处理否则返回空字符串结构校验若文件没有f$info、f$info$x509或f$info$x509$certificate即 x509 分析尚未填充证书数据返回空字符串构造描述优先遍历f$conns若连接带有krb记录则返回cat(c$id$resp_h, :, c$id$resp_p)响应端 IP:端口否则回退为cat(Serial: , ..., Subject: , ..., Issuer: , ...)输出证书的序列号、主体与签发者。function describe_file(f: fa_file): string { if ( f$source ! KRB_TCP f$source ! KRB ) return ; if ( ! f?$info || ! f$info?$x509 || ! f$info$x509?$certificate ) return ; for ( _, c in f$conns ) { if ( c?$krb ) { return cat(c$id$resp_h, :, c$id$resp_p); } } return cat(Serial: , f$info$x509$certificate$serial, Subject: , f$info$x509$certificate$subject, Issuer: , f$info$x509$certificate$issuer); }代码注释解释了这样设计的缘由由于该函数被调用时无法确定 x509 数据结构是否已填充完毕可靠地描述一张证书并不容易因此优先返回连接信息对关联 KRB 会话更稳定证书详情作为兜底。四、注册机制将 KRB 协议接入文件框架files.zeek在zeek_init事件中把两个分析器标签注册进文件框架files.zeekevent zeek_init() priority5 { Files::register_protocol(Analyzer::ANALYZER_KRB_TCP, Files::ProtoRegistration($get_file_handle KRB::get_file_handle, $describe KRB::describe_file)); Files::register_protocol(Analyzer::ANALYZER_KRB, Files::ProtoRegistration($get_file_handle KRB::get_file_handle, $describe KRB::describe_file)); }对应的框架定义在 scripts/base/frameworks/files/main.zeekglobal describe: function(f: fa_file): string; type ProtoRegistration: record { get_file_handle: function(c: connection, is_orig: bool): string; describe: function(f: fa_file): string }; global register_protocol: function(tag: Analyzer::Tag, reg: ProtoRegistration): bool;框架侧的消费逻辑同样位于 main.zeekget_file_handle事件在优先级 5 处查询registered_protocols表若没有注册对应 tag 的处理函数会发出一次get_file_handle() handler missing警告随后调用注册的句柄函数并set_file_handle(...)。这说明files.zeek中的两行register_protocol是证书文件能被框架正确分配句柄、走完文件生命周期的前提。五、C 分析器侧证书文件如何被生成脚本注释File handles are generated in the analyzer所指的实现位于 binpac 分析器 src/analyzer/protocol/krb/krb-padata.pac。处理 PKINIT pre-authentication 数据时针对PA_PW_AS_REQ请求方向与PA_PW_AS_REP响应方向两类 PA 类型case PA_PW_AS_REQ: { const bytestring cert element-pa_data_element()-pa_pk_as_req()-cert(); zeek::ODesc common; common.AddRaw(Analyzer::ANALYZER_KRB); common.Add(zeek_analyzer-Conn()-StartTime()); common.AddRaw(T, 1); // Request means is_origT zeek_analyzer-Conn()-IDString(common); zeek::ODesc file_handle; file_handle.Add(common.Description()); file_handle.Add(0); string file_id zeek::file_mgr-HashHandle(file_handle.Description()); zeek::file_mgr-DataIn(reinterpret_castconst u_char*(cert.data()), cert.length(), zeek_analyzer-GetAnalyzerTag(), zeek_analyzer-Conn(), true, file_id, application/x-x509-user-cert); zeek::file_mgr-EndOfFile(file_id); break; }关键点句柄生成文件句柄由连接起始时间 is_orig 标志 连接四元组拼成描述串后经zeek::file_mgr-HashHandle()哈希得到file_id即 FUID请求方向追加0、响应方向追加1以区分双向证书数据注入file_mgr-DataIn()携带application/x-x509-user-certMIME 类型上报证书字节流is_orig在请求方向为true、响应方向为false随后立即EndOfFile结束文件x509 联动MIME 类型application/x-x509-user-cert正是 x509 主脚本 中Files::register_for_mime_type(Files::ANALYZER_X509, application/x-x509-user-cert)所注册的类型因此证书字节流会被 X.509 文件分析器解析并触发x509_certificate事件填充f$info$x509。六、连接记录回填file_over_new_connection 与 fill_in_subjects6.1 file_over_new_connection按方向挂接证书files.zeek订阅文件框架的file_over_new_connection事件files.zeekevent file_over_new_connection(f: fa_file, c: connection, is_orig: bool) priority5 { if ( f$source ! KRB_TCP f$source ! KRB ) return; set_session(c); if ( is_orig ) { c$krb$client_cert f$info; c$krb$client_cert_fuid f$id; } else { c$krb$server_cert f$info; c$krb$server_cert_fuid f$id; } }逻辑说明先做与describe_file相同的来源过滤仅接受KRB/KRB_TCP来源set_session(c)来自main.zeek负责创建c$krb记录并注册连接移除钩子finalize_krb依据is_orig把文件分析结果f$info和 FUIDf$id分别存入客户端或服务端方向。6.2 fill_in_subjects从证书对象提取 Subjectfill_in_subjectsfiles.zeek在证书记录存在且 x509 信息可用时把证书的 subject 拷贝到对应的*_cert_subject字段function fill_in_subjects(c: connection) { if ( ! c?$krb ) return; if ( c$krb?$client_cert c$krb$client_cert?$x509 c$krb$client_cert$x509?$certificate ) c$krb$client_cert_subject c$krb$client_cert$x509$certificate$subject; if ( c$krb?$server_cert c$krb$server_cert?$x509 c$krb$server_cert$x509?$certificate ) c$krb$server_cert_subject c$krb$server_cert$x509$certificate$subject; }6.3 回填触发时机fill_in_subjects在四处被调用覆盖了 KRB 会话的完整生命周期files.zeekevent krb_error(c: connection, msg: Error_Msg) { fill_in_subjects(c); } event krb_as_response(c: connection, msg: KDC_Response) { fill_in_subjects(c); } event krb_tgs_response(c: connection, msg: KDC_Response) { fill_in_subjects(c); } hook finalize_krb(c: connection) priority5 { fill_in_subjects(c); }krb_errorKDC 返回 KRB-ERROR 时失败路径如 preauth 被拒也会回填 subjectkrb_as_response/krb_tgs_responseAS 与 TGS 响应成功路径finalize_krb钩子优先级设为5确保先于main.zeek中默认优先级0的finalize_krb执行日志写入do_log从而保证 subject 在kerberos.log落盘前完成填充。从源码结构看finalize_krb是Conn::RemovalHook定义于 main.zeek由set_session通过Conn::register_removal_hook注册连接移除时必然执行——这保证了即使 KRB 交互没有完整结束已提取的证书 subject 仍有机会写入日志。七、实战消费证书字段与关联分析7.1 在 kerberos.log 中看到证书信息main.zeek通过Log::create_stream(KRB::LOG, Log::Stream($columnsInfo, $evlog_krb, $pathkerberos, ...))定义日志流列即KRB::Info。因此启用files.zeek后kerberos.log中成功提取证书的 AS 交换记录会额外出现client_cert_subject/client_cert_fuid/server_cert_subject/server_cert_fuid等列。7.2 用 subject 识别 PKINIT 用户可基于client_cert_subject识别使用 PKINIT 智能卡/证书认证的客户端示例event krb_as_response(c: connection, msg: KRB::KDC_Response) { if ( c?$krb c$krb?$client_cert_subject ) print fmt(PKINIT AS response: client cert subject %s, c$krb$client_cert_subject); }注意该事件在files.zeek与用户脚本中可能同时存在多个处理器Zeek 对同一事件的多个event处理器会全部执行若需要保证 subject 已回填可自行调整优先级如priority10或直接依赖finalize_krb钩子做收尾读取。7.3 通过 FUID 关联文件与 x509 日志client_cert_fuid/server_cert_fuid即为文件框架生成的 FUID可与其他日志做关联查询例如在x509.log中按 FUID 检索证书指纹、在files.log中查看文件来源与 MIME 类型。7.4 覆盖范围与限制证书提取仅针对 PKINIT pre-authentication 数据中的PA-PK-AS-REQ/PA-PK-AS-REP对应PA_PW_AS_REQ/PA_PW_AS_REPTGS 阶段的 PADATA 证书不会被作为独立文件上报见 krb-padata.pac 中PA_TGS_REQ仅生成事件、不走文件路径协议注册端口默认是88/tcp与88/udp可用KRB::tcp_ports/KRB::udp_ports重定义扩展见 main.zeekdescribe_file的描述结果依赖调用时刻 x509 数据是否已填充因此其输出在不同调用点可能不同这是源码注释明确承认的设计取舍。八、小结base/protocols/krb/files.zeek是 Zeek Kerberos 分析中连接记录与文件分析之间的粘合层它扩展了KRB::Info的六个证书字段注册了get_file_handle与describe_file两个框架回调通过file_over_new_connection按方向回填证书与 FUID并借助fill_in_subjects在错误、AS 响应、TGS 响应和连接移除等多个时机补全证书 Subject。底层上C 分析器krb-padata.pac负责生成句柄、注入application/x-x509-user-cert文件并驱动 x509 分析脚本端与框架端scripts/base/frameworks/files/main.zeek共同完成注册与消费。理解了这条链路你就可以放心地在 Zeek 中依赖kerberos.log的证书列做 PKINIT 审计或基于*_cert字段编写自己的证书威胁检测逻辑。赞分享网络安全网络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 中 FTP 文件分析集成files.zeek 的文件句柄、描述与 fa_file 扩展机制解析Zeek 中 FTP 文件分析集成files.zeek 的文件句柄、描述与 fa_file 扩展机制解析 导读 本文围绕 Zeek 基础脚本 scripts/网络安全网络IDSZeek HTTP 文件追踪机制base/protocols/http/files.zeek 的文件句柄生成与描述器源码解析Zeek HTTP 文件追踪机制base/protocols/http/files.zeek 的文件句柄生成与描述器源码解析 本篇技术指南以 Zeek 仓库中网络安全网络IDSBackstage Kubernetes 插件认证指南KubernetesAuthProviders 服务端与客户端认证机制详解Backstage Kubernetes 插件认证指南KubernetesAuthProviders 服务端与客户端认证机制详解 本指南围绕 Backstag开发者门户后端前端上一篇如何修复损坏的AppImage文件AppImageKit完整急救指南下一篇CANN/opbase算子日志框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考