iT邦幫忙

2026 iThome 鐵人賽

DAY 28
0
Security

從情資收集到資安鑑識:30 天建構自動化威脅情資與鑑識平台系列 第 39 篇

[Day 28] Malcolm Zeek 的不只存切割封包

  • 分享至 

  • xImage
  •  

Zeek <---> Filebeat 到儀錶板

在 Malcolm 中,Zeek 負責分析網路流量並產生日誌,但日誌產生後,還需要經過收集、解析、欄位處理及索引,才能成為分析人員可以搜尋的資料。

這中間有一個重要元件:Filebeat。

從 Malcolm 的原始碼來看,Filebeat 並不是只有一份設定檔,也不是把所有資料送往同一個地方。它會依照資料來源與用途設定不同的輸入、處理器及輸出方式。其中,一般 Zeek 日誌主要送往 Logstash,交由後續管線處理;與 Zeek 擷取檔案有關的部分資料,則有另外的處理路徑。

如果想了解 Malcolm 的資料是如何流動的,filebeat 目錄會是一個很好的切入點。本文從 Zeek 的日誌開始,逐步檢視 Filebeat 的設定、資料路由與維護重點。

一、先理解資料來源:Zeek 產生的日誌有什麼不同?

Zeek 是 Malcolm 用來分析網路流量的核心元件之一。當感測器接收到網路封包後,Zeek 會依據連線與協定活動產生結構化日誌,例如:

日誌 主要用途
conn.log 記錄連線端點、協定、持續時間及流量資訊
dns.log 記錄 DNS 查詢與相關回應
http.log 記錄可解析的 HTTP 請求及回應資訊
ssl.log 記錄 TLS 連線相關資訊
files.log 記錄 Zeek 辨識到的檔案活動

這些日誌提供不同角度的網路資訊,但產生資料並不等於完成分析。Malcolm 還需要將它們送往後續處理元件,才能進行搜尋、關聯與視覺化。

以 conn.log 為例,假設某台工作站與外部伺服器建立 TCP 連線,Zeek 可以記錄這段通訊的基本資訊。若調查人員還想知道該主機查詢了什麼網域、進行了哪些 HTTP 請求,就需要進一步查詢相關日誌。

這些資料進入 Malcolm 後,Filebeat 負責收集並轉送;Logstash 則負責解析、轉換及補充資料,最後將處理結果送往 OpenSearch。

這裡的關鍵在於:Zeek 負責產生網路分析資料,Filebeat 負責資料收集與傳遞,Logstash 負責後續處理。 三者的工作不同,不能把 Filebeat 當成完成整個資料分析流程的元件。

官方參考:Malcolm Components、Malcolm Live Analysis。

二、Filebeat 如何收集資料?從設定檔看輸入與標籤

1. 為什麼 Malcolm 需要多組 Filebeat 設定?

檢視 Malcolm 的 filebeat 目錄,可以看到它依照資料來源與處理需求,使用不同的設定檔。

其中,filebeat-logs.yml 是一般日誌收集的重要設定檔之一。它涵蓋 Zeek、Suricata,以及檔案掃描結果等不同來源;filebeat-zeek-files-logs.yml 則專門處理與 Zeek 擷取檔案有關的資料。

先看一般 Zeek 日誌的設定:

filebeat.inputs:
- type: filestream
  id: zeek-upload
  paths:
    - ${FILEBEAT_ZEEK_LOG_PATH:/zeek/current}/*.log
  fields_under_root: true
  tags: ["_filebeat_zeek_malcolm_upload"]

這段是簡化後的示意,省略了正式設定中的檔案掃描、輪替及清理參數。

幾個欄位值得注意:

設定 用途
type: filestream 使用 Filebeat 的檔案讀取功能
id 識別這個輸入設定
paths 指定需要讀取的日誌路徑
fields_under_root 控制自訂欄位放置的位置
tags 為事件加上標籤,供下游識別與路由

FILEBEAT_ZEEK_LOG_PATH 是環境變數。若沒有另外設定,這段設定預設使用 /zeek/current。

對實際部署而言,除了確認檔案是否存在,也需要檢查 Filebeat 容器是否能夠透過 Docker Volume 存取相同的路徑。若 Zeek 已經正常產生日誌,但 Filebeat 看不到檔案,資料就無法進入後續處理。

2. Tags 為什麼重要?

在上述設定中,出現了:

tags: ["_filebeat_zeek_malcolm_upload"]

這個標籤不是單純的裝飾,而是資料路由的重要依據。

Malcolm 會透過標籤識別不同來源的資料,並讓 Logstash 將事件交給相應的解析管線。一般 Zeek 日誌、Suricata 日誌及其他來源,可以使用不同的標籤區分。

在 filebeat-logs.yml 中,可以看到一般 Zeek 日誌分別使用:

  • _filebeat_zeek_malcolm_upload
  • _filebeat_zeek_malcolm_live

前者用於上傳資料的處理路徑,後者則用於即時產生的日誌。

兩者即使都來自 Zeek,也不代表必須使用完全相同的輸入設定。即時資料持續寫入,檔案上傳則涉及檔案完成、讀取狀態及檔案輪替等不同情境,因此需要考慮各自的處理方式。

此外,標籤本身不會自動執行資料解析。真正的路由規則還需要搭配 Logstash 的管線設定,才能決定資料要送往哪個解析流程。

三、資料進入 Logstash 之後,才開始後續解析與正規化

1. Logstash 在 Malcolm 中負責什麼?

Filebeat 收集日誌後,主要透過 Logstash 輸出將一般網路分析紀錄送往下游。Malcolm 的官方設定與文件指出,Logstash 會負責解析 Zeek 等來源的日誌、補充相關資訊,並將結果索引至 OpenSearch。

以一般 Zeek 日誌為例,Logstash 的工作可分成兩個概念層次。

第一個層次是解析來源資料。不同日誌有不同欄位及格式,因此需要依照來源選擇適當的解析管線。

第二個層次是共通的資料處理。欄位完成必要的正規化後,系統可以進一步執行相關查詢與資料豐富化,例如補充網路資產資訊或其他中繼資料,再送往 OpenSearch。

這也是 Malcolm 能夠將不同網路資料整合到同一個分析環境的原因之一。

2. 什麼是資料正規化?

假設不同來源的日誌都記錄了一個 IP 位址,但欄位名稱與資料結構不一致,後續的搜尋與關聯就會變得困難。

資料正規化的目的,就是讓不同來源的資訊以較一致的欄位結構呈現,使搜尋與分析工作可以使用共同的方式處理資料。

不過,這不表示 Zeek 的所有原生欄位都會原封不動出現在 Malcolm 的介面中。

例如,Zeek 原生日誌中的 id.orig_h、id.orig_p、id.resp_h 與 id.resp_p,分別代表連線兩端的 IP 位址與連接埠。資料進入 Malcolm 後,實際欄位名稱可能依據解析及正規化設定而有所不同。

因此,若需要撰寫自訂搜尋、修改資料解析或新增儀表板,應以實際匯入的事件欄位及目前版本的設定為準,而不是直接假設原生欄位名稱一定存在。

3. 如果要新增一種日誌,需要修改哪些地方?

Malcolm 官方的 Logstash 擴充文件,提供了新增資料來源的設計方向。

假設企業想將某個內部系統的日誌送入 Malcolm,除了讓 Filebeat 能夠讀取新日誌,通常還需要處理下列項目:

項目 工作內容
Filebeat 輸入設定 指定新日誌的路徑及讀取方式
資料標籤 為新來源設定可供辨識的標籤
Logstash 解析管線 建立適合該來源的解析邏輯
管線路由 將新標籤對應到正確的解析管線
欄位及索引處理 確認資料欄位、識別值與索引方式符合預期
實際測試 驗證資料能被讀取、解析、索引及搜尋

以官方文件中的擴充範例來看,新資料來源需要有適當的 Filebeat 輸入與標籤,再由 Logstash 的解析管線接手處理。若使用自訂解析管線,還需要在管線路由設定中加入對應關係。

這說明 Malcolm 的資料整合不只是新增一個 Filebeat 路徑。從來源、解析、欄位處理到索引,都需要確認資料能夠正確通過整條管線。

官方參考:Malcolm Contributor Guide:Logstash。

四、另一條資料路徑:Zeek 擷取的檔案如何進入掃描流程?

前面介紹的是一般 Zeek 網路日誌的處理方式。但 Malcolm 中還有一類用途不同的資料:與 Zeek 從網路流量中辨識及擷取出的檔案有關的紀錄。

這部分不能直接套用一般網路日誌的處理邏輯。

1. filebeat-zeek-files-logs.yml 的特殊用途

檢視 Malcolm 目前的 filebeat-zeek-files-logs.yml,可以看到它會讀取 json_streaming_files 相關日誌。

例如,上傳或整理後的檔案日誌使用類似以下路徑:

paths:
  - ${FILEBEAT_ZEEK_LOG_PATH:/zeek/current}/json_streaming_files*.log

即時資料則使用另一個路徑模式:

paths:
  - ${FILEBEAT_ZEEK_LOG_LIVE_PATH:/zeek/live}/spool/logger-*/json_streaming_files*.log

上述內容取自目前設定的路徑模式,實際讀取行為還會受到其他 Filebeat 參數影響。

這份設定與一般 Zeek 日誌最大的差異,在於它不只是把日誌送往 Logstash。它會整理檔案相關事件,並將符合條件的通知送往 Valkey,供後續檔案掃描工作使用。

2. 為什麼要使用 Valkey?

在這份設定中,可以看到:

output.redis:
  hosts: ["${VALKEY_HOST:valkey}:${VALKEY_PORT:6379}"]
  password: "${VALKEY_PASSWORD}"
  db: ${VALKEY_ZEEK_FILES_DATABASE:1}
  key: "zeek_notify"
  datatype: "list"

這裡雖然使用 output.redis,但預設服務名稱是 valkey。Valkey 提供 Redis 相容介面,因此可透過對應的輸出機制傳送通知資料。

幾個設定的用途如下:

設定 意義
VALKEY_HOST 指定 Valkey 服務位址
VALKEY_PORT 指定連接埠,預設為 6379
db 選擇使用的邏輯資料庫,預設為 1
key 使用 zeek_notify 作為資料清單的名稱
datatype: list 使用 List 型態儲存通知資料

可以把這個清單理解成一個待處理項目的佇列。Filebeat 整理符合條件的檔案事件後,將通知送到 Valkey,供相關的後續處理程序使用。

Malcolm 也整合了 Strelka,用於掃描從網路流量中擷取出的檔案。因此,這條管線的目的,是讓檔案相關事件能夠進入後續的檔案掃描工作流程,而不是將所有資料都當成一般網路日誌處理。

3. Filebeat 如何整理檔案相關事件?

在這份設定中,可以看到 decode_json_fields、drop_event、copy_fields、drop_fields、rename 等處理器。

它們負責的工作不同:

  • decode_json_fields:解析指定欄位中的 JSON 資料。
  • drop_event:依照條件移除整筆事件。
  • copy_fields:複製指定欄位。
  • drop_fields:移除不需要的欄位。
  • rename:重新命名欄位或調整欄位位置。

例如,設定會解析 message 中的 JSON 資料,並將內容放入 file 相關欄位。接著,事件必須具有 file.extracted 等符合條件的資料,才會繼續進入後續處理。

程式也會根據設定的擷取檔案路徑,整理 file.extracted 欄位的路徑資訊。

這些處理不是為了重新分析封包,而是將檔案相關事件整理成後續流程能夠使用的形式。

這裡需要留意:一般 Zeek 日誌與檔案掃描通知雖然都來自 Zeek 相關資料,但用途不同,對應的 Filebeat 設定與輸出路徑也不同。

官方參考:

五、從維護角度看 Filebeat:資料為什麼會漏掉或無法搜尋?

理解資料管線後,實際維運時就能依照問題發生的位置縮小範圍,而不是看到 OpenSearch 沒有資料,就直接判定是資料庫故障。

1. 日誌存在,Malcolm 卻查不到資料

首先確認 Zeek 是否正常產生日誌,然後確認 Filebeat 容器內是否能讀取到對應檔案。

如果檔案存在但沒有被讀取,應檢查輸入路徑、檔案掃描頻率、檔案狀態及讀取相關參數。接著檢查 Filebeat 是否成功送出資料,以及 Logstash 是否收到並處理事件。

若 Logstash 已經收到資料,則應繼續檢查解析結果、管線路由及 OpenSearch 索引狀態。

這樣逐層排查,比直接重啟全部容器更容易找到真正的問題。

2. 為什麼要注意檔案輪替與 Registry?

Filebeat 需要維護檔案讀取狀態,以便判斷哪些內容已經讀取、哪些內容仍需要處理。

Malcolm 的設定包含 clean_inactive、ignore_older、clean_removed 及 close 等參數,分別涉及檔案狀態清理、舊檔案處理、檔案移除及讀取資源管理。

這些參數會影響 Filebeat 如何處理長時間未更新、已被輪替或已經移除的檔案。

因此,當修改這些參數時,不能只考慮降低資源使用量,也要確認是否可能導致尚未完成處理的資料被忽略,或使檔案重新讀取時出現重複處理。

在正式環境中,建議先理解目前的預設值及資料量,再進行小規模測試。

3. 為什麼加入新日誌後,搜尋欄位反而不完整?

這類問題通常需要同時檢查 Filebeat 和 Logstash。

Filebeat 可能已經成功讀取資料,但如果 JSON 解析方式不符合來源格式,或 Logstash 的解析管線沒有對應欄位,就可能出現資料內容沒有被正確展開的情況。

另一種情況是新日誌已經完成解析,但尚未納入預期的欄位正規化或索引處理,導致資料雖然存在,卻不容易用原本的搜尋條件找到。

因此,新增日誌時應保存一筆代表性的原始資料,依序檢查 Filebeat 讀取結果、Logstash 解析結果及 OpenSearch 中的最後文件,確認每個階段的欄位變化。

4. 實務排查表

異常現象 優先檢查項目
完全沒有日誌 輸入路徑、Volume 掛載、Filebeat 輸入設定
有檔案,卻沒有進入下游 Filebeat 讀取狀態、事件處理器、輸出連線
資料已送出但欄位不完整 JSON 解析、欄位重新命名、Logstash filter
資料沒有進入預期解析管線 Tags 與 Logstash 管線路由
重啟或輪替後發生漏讀、重複讀取 Registry、檔案輪替及清理參數
檔案掃描沒有啟動 filebeat-zeek-files-logs.yml、Valkey 通知及下游掃描流程
外部日誌無法傳入 輸入監聽設定、連接埠、防火牆及 TLS 設定

這張表是排查起點,不代表每個問題都只有一個原因。Malcolm 由多個容器與處理程序組成,應沿著資料實際經過的路徑逐層確認。

結語

從 Malcolm 的 Filebeat 設定可以看出,它不是單純的日誌轉送器,而是整個資料收集與傳遞流程中的重要環節。

一般 Zeek 日誌會經過 Filebeat 收集,再送往 Logstash 解析、補充資訊並索引至 OpenSearch。與 Zeek 擷取檔案有關的部分資料,則會經過另一條通知管線,利用 Valkey 將檔案相關事件交給後續掃描流程。

理解這兩條路徑,對安裝、客製化與維護 Malcolm 都很有幫助。日誌沒有出現在搜尋介面,不一定是 OpenSearch 的問題;檔案掃描沒有啟動,也不一定是 Strelka 本身故障。問題可能發生在前面的檔案路徑、Filebeat 處理器、資料路由,或下游服務之間。

對維護人員而言,最重要的是掌握每一個元件的責任範圍,確認資料在哪個階段產生、被轉換及送出,再根據實際紀錄縮小問題範圍。

官方延伸閱讀

  1. Malcolm Components
  2. Malcolm Live Analysis
  3. Malcolm Configuration
  4. Malcolm Contributor Guide:Logstash
  5. Filebeat 一般日誌設定原始碼
  6. Filebeat Zeek 檔案日誌設定原始碼

上一篇
[Day 27] Malcolm Filebeat 整合項目
下一篇
[Day 29] Malcolm Suricata 威脅偵測
系列文
從情資收集到資安鑑識:30 天建構自動化威脅情資與鑑識平台 共 42 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言