Zeek 仅记录 TLS 主机证书:log-hostcerts-only 脚本原理与实战配置
网络安全网络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 策略脚本protocols/ssl/log-hostcerts-only讲解如何让x509.log只记录 TLS 握手中的主机证书客户端与服务器端证书同时抑制证书链上其他所有证书的日志输出。读完本文你将掌握该脚本的加载方式、X509::log_policy钩子的过滤机制、host_cert字段的填充原理以及如何在单机与集群环境中正确配置并验证效果。脚本能做什么x509.log是 Zeek 记录 X.509 证书信息的日志流。默认情况下TLS 握手中出现的每一张证书都会被记录包括 CA 根证书、各级中间证书以及服务器/客户端最终证书——也就是说一次握手可能产生多条x509.log记录。当加载scripts/policy/protocols/ssl/log-hostcerts-only.zeek后只有主机证书host_cert为真会被写入x509.log其余所有证书证书链中的 CA 与中间证书的日志输出都会被抑制。这一点由脚本源码中的注释明确说明##! When this script is loaded, only the host certificates (client and server) ##! will be logged to x509.log. Logging of all other certificates will be suppressed.该脚本在策略policy层实现过滤不修改x509.log的字段结构因此其他依赖x509.log字段的脚本不受影响。若需要保留完整的证书链记录则不要加载此脚本。脚本源码与加载方式脚本本体只有十几行完整源码位于 scripts/policy/protocols/ssl/log-hostcerts-only.zeekload base/protocols/ssl load base/files/x509 module X509; hook X509::log_policy(rec: X509::Info, id: Log::ID, filter: Log::Filter) { if ( ! rec$host_cert ) break; }加载它有两种常用方式在站点脚本中加载在 scripts/site/local.zeek 中加入一行load protocols/ssl/log-hostcerts-only该行已作为注释示例存在于此文件中取消注释即可生效所有加载local.zeek的 Zeek 实例都会应用该策略。命令行临时加载zeek -r capture.pcap protocols/ssl/log-hostcerts-only仅对本次运行生效适合快速验证。脚本内部的load base/protocols/ssl与load base/files/x509保证依赖的 SSL 分析框架和 X.509 文件分析框架以及它们定义的事件、记录类型与日志流先于本脚本就绪。过滤机制X509::log_policy 钩子该脚本的核心是挂接在日志写入前的策略钩子X509::log_policy。它的类型定义与语义在 scripts/base/frameworks/logging/main.zeek 中给出type PolicyHook: hook(rec: any, id: ID, filter: Filter);关键语义同一文件的第 358-366 行附近是策略钩子可以对日志记录做任意处理、修改字段值或者通过break从钩子体内跳出以否决该条记录的写入。钩子接收三个参数rec当前待写记录类型为对应日志流的列记录类型此处即X509::Infoid日志流 IDX509::LOGfilter控制输出行为的日志过滤器实例。log-hostcerts-only的过滤逻辑是if ( ! rec$host_cert ) break;即当一条证书记录的host_cert字段为假时!取反为真立即break向日志框架发出否决写入的信号只有当host_cert为真时才放行。这与文档说明仅记录主机证书抑制其余证书完全一致。底层原理host_cert 字段如何被填充X509::Info记录类型与host_cert字段的定义位于 scripts/base/files/x509/main.zeektype Info: record { ... ## Indicates if this certificate was a end-host certificate, or sent as part of a chain host_cert: bool log defaultF; ## Indicates if this certificate was sent from the client client_cert: bool log defaultF; ... };host_cert默认值为F它由文件分析框架在x509_certificate事件中根据文件的 MIME 类型判定并填充同文件第 191-200 行event x509_certificate(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate) priority5 { local der_cert x509_get_certificate_string(cert_ref); local fp hash_function(der_cert); f$info$x509 X509::Info($tsf$info$ts, $fingerprintfp, $certificatecert, $handlecert_ref); if ( f$info$mime_type application/x-x509-user-cert ) f$info$x509$host_cert T; if ( f$is_orig ) f$info$x509$client_cert T; }从源码结构看判定逻辑非常直观只有 MIME 类型为application/x-x509-user-cert的证书即作为会话主机证书传输的用户证书才会被标记为host_cert TCA 证书application/x-x509-ca-cert与 PKIX 证书application/pkix-cert保持host_cert F因而会被本策略过滤掉如果该文件来自连接发起方f$is_orig还会额外标记client_cert T用于区分客户端证书与服务端证书——log-hostcerts-only对两者一视同仁都会保留。证书的写入发生在file_state_remove事件中scripts/base/files/x509/main.zeek最终通过Log::write(LOG, f$info$x509)送入日志框架策略钩子正是在写入路径上执行因此能在记录落盘前完成过滤。实战验证官方 btest 测试仓库自带针对该脚本的回归测试路径为 testing/btest/scripts/policy/protocols/ssl/log-hostcerts-only.zeek# TEST-EXEC: zeek -b -r $TRACES/tls/google-duplicate.pcap %INPUT # TEST-EXEC: btest-diff x509.log load protocols/ssl/log-hostcerts-only redef X509::relog_known_certificates_after 0secs;该测试揭示了两个重要细节验证方式对$TRACES/tls/google-duplicate.pcap含重复证书的 Google TLS 流量运行 Zeek 并比对x509.log输出确保过滤结果稳定。Google 的 TLS 会话会携带完整的证书链根 CA 中间证书 服务器证书因此该流量能有效检验只留主机证书的效果。配合去重配置测试将X509::relog_known_certificates_after重定义为0secs。该选项的默认值与语义在 scripts/base/files/x509/main.zeek 中说明——默认1day即同一证书去重后 1 天内不重复记录设置为0secs表示完全禁用去重每条证书都会重新记录便于验证过滤而非去重逻辑。你可以用类似命令在本地复现该测试zeek -b -r pcap protocols/ssl/log-hostcerts-only然后检查x509.log中是否只出现host_certT的记录client_cert可能为T或F。相关配置与集群注意点log-hostcerts-only只做日志过滤但 X.509 日志的整体行为还受以下选项影响均定义于 scripts/base/files/x509/main.zeekX509::hash_function默认sha256_hash第 13-15 行生成证书指纹的函数改变它会同时改变ssl.log与x509.log中的指纹值X509::relog_known_certificates_after默认1day第 91 行证书去重后再次记录的最小间隔0secs关闭去重X509::known_log_certs_maximum_size默认1000000第 98 行去重集合的上限X509::known_log_certs_enable_publish默认T第 102 行与known_log_certs_enable_node_up_publish默认T第 108 行控制去重证书哈希在集群节点间的同步相关实现位于同文件第 236-279 行。在集群模式下证书去重状态由 Manager 汇总并分发到各 Worker见X509::log_cert_hashes_internal事件与Cluster::node_up事件且完整重启会重置去重状态——这意味着重启后短时间内可能出现同一证书被多次记录的现象。该脚本的过滤发生在各节点本地日志写入之前与集群去重机制相互独立不会互相干扰。适用场景与边界适用场景重点关注 TLS 会话对端身份即服务器/客户端最终证书的场景例如仅凭x509.log做证书指纹统计、威胁情报匹配或资产识别时过滤掉 CA 链可显著降低日志量并简化分析边界加载本脚本后x509.log将不再包含证书链信息若后续需要审计完整信任链中间证书过期、CA 变更等需另行采集同时过滤只影响x509.logssl.log中的server_cert_chain、client_cert_chain等字段不受影响。文档索引与示例可继续参考 doc/scripts/policy/protocols/ssl/log-hostcerts-only.zeek.rst 以及 doc/reference/zeekscript/autogenerated-script-index.rst 中的脚本索引页scripts/test-all-policy.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 证书日志 x509.log 深度解析TLS 1.2 与 TLS 1.3 下的证书取证差异Zeek 证书日志 x509.log 深度解析TLS 1.2 与 TLS 1.3 下的证书取证差异 导读 x509.log 是 Zeek 网络分析框架中记录网络安全网络IDSZeek 实战记录 TLS 服务器请求客户端证书时接受的 CA 列表certificate-request-info 脚本深度解析Zeek 实战记录 TLS 服务器请求客户端证书时接受的 CA 列表certificate request info 脚本深度解析 在 TLS 双向认证网络安全网络IDSZeek 检测 TLS Heartbleed 攻击heartbleed.zeek 策略脚本原理与实战指南Zeek 检测 TLS Heartbleed 攻击heartbleed.zeek 策略脚本原理与实战指南 HeartbleedCVE 2014 0160是网络安全网络IDS上一篇OWASP Nettacker漏洞扫描实战CVE检测与安全评估下一篇如何配置ClearURLs高级设置自定义规则和过滤选项终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考