控:基于 Software::interesting_version_changes 與 Software_Version_Change 的 Notice 實(shí)現(xiàn)詳解)
網(wǎng)絡(luò)安全網(wǎng)絡(luò)IDS【免費(fèi)下載鏈接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.項(xiàng)目地址https://gitcode.com/gh_mirrors/ze/zeek點(diǎn)擊查看免費(fèi)下載本文聚焦 Zeek 的policy/frameworks/software/version-changes.zeek策略腳本講解如何針對特定軟件名如 Apache、OpenSSH 等在主機(jī)的軟件版本發(fā)生變化時自動產(chǎn)生 Notice涵蓋核心配置項(xiàng)Software::interesting_version_changes、新增 Notice 類型Software_Version_Change、底層事件觸發(fā)鏈路、配置加載方式與 btest 驗(yàn)證方法。讀完本文你將能夠獨(dú)立在 Zeek 部署中啟用并定制軟件版本變更告警并理解其與基礎(chǔ)軟件框架Software::found/Software::version_change/tracked_software的協(xié)作關(guān)系。腳本定位與功能概述version-changes.zeek是 Zeek 軟件框架Software framework的一個可選策略腳本位于 scripts/policy/frameworks/software/version-changes.zeek屬于policy而非base層意味著它需要用戶顯式加載才會生效。它的核心價值在于并非所有軟件版本變化都值得告警。例如某臺主機(jī)上瀏覽器頻繁升級、或某個無關(guān)緊要的客戶端軟件版本跳動往往不構(gòu)成安全事件但如果是 Web 服務(wù)器、SSH 服務(wù)、數(shù)據(jù)庫等關(guān)鍵軟件在同一主機(jī)上出現(xiàn)版本變化則可能意味著升級、被篡改或未授權(quán)變更。該腳本正是為此提供一種白名單式的告警機(jī)制——由運(yùn)維者預(yù)先聲明哪些軟件名是敏感的之后只要這些軟件在同一主機(jī)上被觀測到版本變化就觸發(fā)一條 Notice。腳本默認(rèn)狀態(tài)是空集告警未配置任何軟件名時不產(chǎn)生任何版本變更告警只有將軟件名加入Software::interesting_version_changes集合后相關(guān)版本變化才會進(jìn)入 Notice 流程。核心配置項(xiàng)Software::interesting_version_changes腳本暴露的唯一運(yùn)行時選項(xiàng)是Software::interesting_version_changes其定義位于 scripts/policy/frameworks/software/version-changes.zeek 的 export 塊中## Some software is more interesting when the version changes and this ## is a set of all software that should raise a notice when a different ## version is seen on a host. option interesting_version_changes: set[string] {};關(guān)鍵屬性如下表屬性值所屬命名空間Software類型set[string]屬性標(biāo)志redef可重定義實(shí)際聲明為option默認(rèn)值{}空集語義集合中每個字符串是一個軟件名對應(yīng)Software::Info記錄中的name字段如 Apache、OpenSSH當(dāng)這些軟件在某一主機(jī)上的版本發(fā)生變化時產(chǎn)生 Notice配置示例——將 Apache 與 OpenSSH 加入關(guān)注名單redef Software::interesting_version_changes { Apache, OpenSSH };也可以直接在local.zeek中追加。需要特別說明的是interesting_version_changes匹配的是軟件名稱而非版本且名稱由軟件框架解析unparsed_version后規(guī)范化得到例如瀏覽器類字符串會被統(tǒng)一為 Firefox、Chrome 等參見 scripts/base/frameworks/software/main.zeek 中的parse_mozilla與alternate_names邏輯。因此配置前建議先觀察software.log中實(shí)際記錄的name字段確保名稱拼寫一致。新增 Notice 類型Software_Version_Change腳本通過redef enum Notice::Type ...向 Notice 框架注冊了一個新的告警類型redef enum Notice::Type { ## For certain software, a version changing may matter. In that ## case, this notice will be generated. Software that matters ## if the version changes can be configured with the ## :zeek:id:Software::interesting_version_changes variable. Software_Version_Change, };Software_Version_Change的語義在 scripts/policy/frameworks/software/version-changes.zeek 的注釋中明確說明對某些軟件而言版本變化可能很重要。此時會生成此 Notice哪些軟件的版本變化需要關(guān)注可通過Software::interesting_version_changes變量配置。該類型的每條 Notice 記錄包含以下字段在事件處理中構(gòu)造詳見下文Notice 字段內(nèi)容$noteSoftware::Software_Version_Change$src檢測到軟件變化的主機(jī)地址new$host$msg格式化的變化描述文本$sub新軟件信息的可讀摘要software_fmt(new)事件處理與告警生成流程Software::version_change 事件的處理邏輯腳本的核心是一個針對Software::version_change事件的事件處理器event Software::version_change(old: Software::Info, new: Software::Info) { if ( old$name !in interesting_version_changes ) return; local msg fmt(%.6f %s %s version changed from %s to %s, network_time(), old$software_type, old$name, software_fmt_version(old$version), software_fmt_version(new$version)); NOTICE(Notice::Info($noteSoftware_Version_Change, $srcnew$host, $msgmsg, $subsoftware_fmt(new))); }處理流程分三步白名單過濾檢查舊記錄的name是否位于interesting_version_changes集合中不在則直接返回不產(chǎn)生任何輸出。構(gòu)造消息用fmt生成形如1700000000.000000 SERVER Apache version changed from 2.4.41 to 2.4.54的文本。其中network_time()給出精確到微秒的網(wǎng)絡(luò)時間戳old$software_type是軟件類型枚舉如HTTP::SERVER、SSH::SERVERsoftware_fmt_version()將結(jié)構(gòu)化的Software::Version記錄格式化為a.b.c-x形式的字符串其實(shí)現(xiàn)見 scripts/base/frameworks/software/main.zeek缺失的段會省略附加串以-前綴拼接。發(fā)出 Notice調(diào)用NOTICE(...)告警源$src取新記錄的主機(jī)地址new$host$sub取software_fmt(new)格式為name a.b.c便于在 Notice 視圖中快速定位。事件從哪里來register → version_change 的觸發(fā)鏈Software::version_change事件本身由基礎(chǔ)軟件框架scripts/base/frameworks/software/main.zeek定義并在Software::register事件處理器中觸發(fā)。觸發(fā)條件是同一主機(jī)、同一軟件名已經(jīng)存在至少一條被跟蹤的版本記錄且新觀測到的版本字符串與該軟件名下已記錄的版本均不相同。對應(yīng)代碼如下if ( info$name !in ss ) ss[info$name] Set(); else event Software::version_change(ss[info$name]$last, info);其中ss來自tracked_software表——這是一個按主機(jī)地址addr索引、將軟件名映射到Set版本字符串集合 最近一次Info的表?xiàng)l目默認(rèn)一天過期create_expire1day因此同一版本每天最多記錄一次的語義由框架保證。old參數(shù)即該主機(jī)上該軟件上次記錄的Infonew即本次新發(fā)現(xiàn)的Info。值得注意version_change的判定基于未解析版本字符串software_fmt_unparsed_version優(yōu)先取unparsed_version字段而非數(shù)值化版本比較——也就是說即使解析出的數(shù)字版本相同只要原始字符串不同如 1.0.0 與 1.0.0也會視為一次變化。若要嚴(yán)格按數(shù)值比較版本可參考框架中的Software::cmp_versions函數(shù)scripts/base/frameworks/software/main.zeek但當(dāng)前腳本并未采用。數(shù)據(jù)來源Software::found 與協(xié)議檢測腳本底層數(shù)據(jù)由各協(xié)議策略腳本通過Software::found(id: conn_id, info: Software::Info)注入該函數(shù)定義于 scripts/base/frameworks/software/main.zeek。當(dāng)前倉庫中調(diào)用Software::found的檢測腳本包括scripts/policy/protocols/http/software.zeekHTTP 服務(wù)器/客戶端軟件scripts/policy/protocols/ssh/software.zeekSSH 服務(wù)端版本scripts/policy/protocols/smtp/software.zeek、scripts/policy/protocols/ftp/software.zeek、scripts/policy/protocols/mysql/software.zeek、scripts/policy/protocols/dhcp/software.zeek 等scripts/policy/frameworks/software/windows-version-detection.zeekWindows 主機(jī)版本探測Software::found內(nèi)部還會依據(jù)Software::asset_tracking選項(xiàng)可選值LOCAL_HOSTS/REMOTE_HOSTS/ALL_HOSTS/NO_HOSTS默認(rèn)LOCAL_HOSTS決定是否跟蹤某主機(jī)地址因此版本變更監(jiān)控的實(shí)際覆蓋范圍是跟蹤范圍內(nèi)的主機(jī)與關(guān)注名單內(nèi)的軟件名兩者的交集。加載方式與配置落地version-changes.zeek屬于 policy 層需顯式加載。標(biāo)準(zhǔn)做法是在站點(diǎn)本地策略文件 scripts/site/local.zeek 中加載load frameworks/software/version-changes倉庫中的 scripts/site/local.zeek 已包含該行位于load frameworks/software/vulnerable之后并配以redef Software::interesting_version_changes ...即可啟用。完整的最小配置示例load frameworks/software/version-changes # 關(guān)注 Apache 與 OpenSSH 的版本變化 redef Software::interesting_version_changes { Apache, OpenSSH };由于腳本內(nèi)部通過load base/frameworks/notice與load base/frameworks/software自帶了 Notice 框架與軟件基礎(chǔ)框架依賴無需額外手動加載這兩個基礎(chǔ)模塊。行為驗(yàn)證倉庫內(nèi)的 btest 測試倉庫在 testing/btest/scripts/policy/frameworks/software/version-changes.zeek 提供了完整的回歸測試可直接作為理解行為與動手驗(yàn)證的參考。測試要點(diǎn)加載base/frameworks/software與policy/frameworks/software/version-changes定義假軟件名my_fake_software并執(zhí)行redef Software::asset_tracking ALL_HOSTS;與redef Software::interesting_version_changes {fake_software_name};構(gòu)造Software::Info記錄通過Software::found(cid, si)模擬循環(huán)上報版本序列1.0.0 → 1.1.0 → 1.2.0 → 1.0.0 → 1.3.0共 10 次用btest-diff對比software.log并對notice.log做去除時間戳的規(guī)范化對比第二段測試將Software::found_cache_interval重定義為0secs以模擬 worker 節(jié)點(diǎn)不抑制重復(fù)上報的歷史行為驗(yàn)證 proxy 側(cè)的版本去重仍能保證輸出一致。從中可以學(xué)到兩點(diǎn)其一驗(yàn)證版本變化告警需要同時觀察software.log記錄每次軟件發(fā)現(xiàn)與notice.log記錄版本變化告警其二框架的緩存參數(shù)如found_cache_interval默認(rèn)10mins會影響重復(fù)上報的抑制但 proxy 側(cè)的逐主機(jī)去重tracked_software與max_software_cache_size默認(rèn)上限 20 個版本會兜底保證最終輸出穩(wěn)定。集群環(huán)境下的行為提示在集群部署中Software::found會通過Cluster::publish_hrw(Cluster::proxy_pool, ...)按主機(jī)地址一致性哈希發(fā)布到 proxy 節(jié)點(diǎn)見 scripts/base/frameworks/software/main.zeek 中if ( Cluster::is_enabled() )分支tracked_software表隨之均勻分布在 proxy 節(jié)點(diǎn)上。這意味著版本變化判定與Software_Version_ChangeNotice 的生成發(fā)生在 proxy 側(cè)而 worker 只負(fù)責(zé)協(xié)議解析與Software::found上報。這一設(shè)計與測試腳本中在 worker 上關(guān)閉命中抑制、在 proxy 上仍保持去重的驗(yàn)證思路一致。小結(jié)version-changes.zeek以極小的腳本體量不足 40 行提供了一個可落地的關(guān)注軟件版本漂移告警方案通過Software::interesting_version_changes白名單精確控制告警范圍借助Software_Version_ChangeNotice 類型與Software::version_change事件完成從軟件框架到告警框架的銜接。其上游數(shù)據(jù)鏈為協(xié)議檢測腳本 →Software::found→Software::register觸發(fā)version_change下游消費(fèi)為標(biāo)準(zhǔn)的 Notice 框架notice.log。將其與Software::asset_tracking、found_cache_interval、max_software_cache_size等基礎(chǔ)框架參數(shù)配合使用即可在單機(jī)與集群兩種形態(tài)下獲得行為一致的版本變更監(jiān)控能力。贊分享網(wǎng)絡(luò)安全網(wǎng)絡(luò)IDS【免費(fèi)下載鏈接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.項(xiàng)目地址https://gitcode.com/gh_mirrors/ze/zeek點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Zeek 基于 DHCP vendor_class 的軟件識別與提取policy/protocols/dhcp/software 腳本深度解析Zeek 基于 DHCP vendor_class 的軟件識別與提取policy/protocols/dhcp/software 腳本深度解析 導(dǎo)讀 本文圍繞網(wǎng)絡(luò)安全網(wǎng)絡(luò)IDSDiceBear Adventurer Neutral 預(yù)設(shè)Presets完整指南從現(xiàn)成配色到深度定制DiceBear Adventurer Neutral 預(yù)設(shè)Presets完整指南從現(xiàn)成配色到深度定制 Adventurer Neutral 是 Dice網(wǎng)絡(luò)安全網(wǎng)絡(luò)IDSZeek Software 框架深度解析軟件版本檢測、解析與日志追蹤實(shí)戰(zhàn)指南Zeek Software 框架深度解析軟件版本檢測、解析與日志追蹤實(shí)戰(zhàn)指南 本文以 base/frameworks/software/main.zeek h網(wǎng)絡(luò)安全網(wǎng)絡(luò)IDS上一篇Mozc日語輸入法從零開始打造你的日文輸入環(huán)境下一篇解析 ClearGPT 提示詞工程以《掌控習(xí)慣》作者為原型的習(xí)慣教練 GPT 設(shè)計與防泄漏機(jī)制創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考