在 Day17,我們建立了 Alert Logger,讓 BehaviorGuard 可以把警告資訊儲存成 JSONL 格式。
不過,昨天使用的是手動建立的測試 Alert,還沒有真正連接到 Detection Engine。
因此,Day18 的目標很簡單:
當 BehaviorGuard 偵測到可疑程序時,除了在 Terminal 顯示警告,也要自動把 Alert 儲存到日誌檔案中。
這樣即使關閉監控程式,之前產生的警告紀錄也不會因為 Terminal 結束而消失。
在真實的資安環境中,端點偵測系統(EDR)不只是偵測可疑行為,還需要保留事件紀錄。
例如,某台 Linux 主機在凌晨執行了一段可疑的 Python 指令:
python3 -c 'import time; print("Day18 Test"); time.sleep(5)'
BehaviorGuard 可以透過之前建立的 BG-CMD-002 規則,識別 Python 直接從命令列執行程式碼的行為。
但如果只把 Alert 顯示在 Terminal,監控結束後,就不方便查詢之前的事件。
因此,我們希望建立以下流程:
Linux Process
↓
Process Monitor
↓
Detection Engine
↓
產生 Alert
↓
Alert Normalization
↓
┌───────────────┬───────────────┐
↓ ↓
Correlation Engine Alert Logger
事件關聯分析 儲存 JSONL
這樣未來不只能夠進行即時偵測,也能透過保存的事件資料進行歷史分析。
今天不需要重新設計整個系統,只要修改原本的 agent/process_monitor.py,把 Day17 的 Alert Logger 接進來。
首先,在原本的 Import 區域加入:
from agent.alert_logger import save_alert
這裡的 save_alert() 就是昨天建立的函式,負責把 Alert 寫入 JSONL 檔案。
Day16 已經建立了 normalized_alert,會把偵測結果整理成統一格式。
其中包含:
因此,我們不需要另外建立一份 Alert,只需要在原本呼叫 Correlation Engine 的地方加入:
# 將 Alert 送進 Correlation Engine
add_alert(normalized_alert)
# Day18:將 Alert 儲存到 JSONL
save_alert(normalized_alert)
這兩行的工作不同。
add_alert() 負責將事件送入關聯分析引擎,而 save_alert() 則負責把事件儲存成日誌。
這也是今天學到的一個重要觀念:不同模組負責不同工作,讓系統更容易維護與擴充。
完成程式修改後,我們在 Kali Linux 中進行測試。
首先進入專案:
cd ~/behaviorguard
啟動監控:
PYTHONPATH=. python3 agent/process_monitor.py
Terminal 顯示:
========== BehaviorGuard ==========
[INFO] Continuous monitoring started.
[INFO] Press Ctrl+C to stop.
代表連續監控已經開始。
接著打開第二個 Terminal,執行:
python3 -c 'import time; print("Day18 Test"); time.sleep(5)'
這是一個無害的測試指令,主要目的是觸發之前建立的 BG-CMD-002 規則。
python3 -c 代表直接從命令列執行 Python 程式碼,而 time.sleep(5) 則讓程序維持五秒,增加被監控程式觀察到的機會。
回到第一個 Terminal,可以看到:
========== BehaviorGuard Detection ==========
[INFO] Alert saved to logs/alerts.jsonl
[ALERT] BG-CMD-002
Rule : Python Inline Code Execution
Severity : MEDIUM
PID : 2515396
PPID : 2515322
Process : python3
Parent : zsh
Ancestors : [2515322, 2515306, 2515300, 1]
Command : python3 -c import time; print("Day18 Test"); time.sleep(5)
Reason : Python executed code directly from the command line.
Total alerts: 1
這次除了成功觸發 BG-CMD-002,也出現了:
[INFO] Alert saved to logs/alerts.jsonl
代表 Alert Logger 已經執行儲存動作。
值得注意的是,python3 -c 本身不一定是惡意行為,許多正常的系統管理與開發工作也會使用。
因此我們將它標記為 MEDIUM,作為值得進一步觀察的事件,而不是直接認定主機遭到入侵。
完成偵測後,我們使用:
tail -n 2 logs/alerts.jsonl
第一次執行時,卻出現:
tail: cannot open 'logs/alerts.jsonl' for reading:
No such file or directory
原本以為是日誌寫入失敗,後來才發現是因為 Terminal 所在的位置不同。
當時第二個 Terminal 位於:
/home/kun
但 BehaviorGuard 的專案目錄是:
/home/kun/behaviorguard
由於 Logger 使用相對路徑 logs/alerts.jsonl,所以需要進入正確的專案目錄才能找到檔案。
修正方式:
cd ~/behaviorguard
tail -n 2 logs/alerts.jsonl
這次成功讀取到兩筆 BG-CMD-002 紀錄。
第一次偵測:
Timestamp : 2026-10-13T08:19:05.346746+00:00
Rule : BG-CMD-002
Severity : MEDIUM
PID : 2515396
Parent : zsh
第二次偵測:
Timestamp : 2026-10-13T08:20:47.086133+00:00
Rule : BG-CMD-002
Severity : MEDIUM
PID : 2516296
Parent : zsh
兩筆紀錄具有不同的 PID 與時間,證明 BehaviorGuard 能夠記錄不同時間執行的程序,而不只是保存同一筆測試資料。
這次也學到了 Linux 相對路徑與工作目錄的關係。
Detection(偵測)主要負責判斷某個行為是否符合可疑規則。
Logging(日誌紀錄)則負責將事件資訊保存下來。
兩者雖然相關,但工作不同。
例如:
python3 -c
不同偵測規則產生的資料可能不一樣。
例如,Process Alert 可能包含 PID,而 Network Alert 可能包含 IP 和 Port。
透過 Alert Normalization,可以將共同欄位整理成一致的格式,方便後續關聯分析與日誌處理。
這次儲存的 Alert 也包含:
Process : python3
Parent : zsh
Ancestors : [2515322, 2515306, 2515300, 1]
透過這些資訊,可以知道程序是由哪個父程序啟動,以及更上層的程序關係。
未來如果發生可疑行為,資安人員就能利用這些資料協助調查事件來源。
Day18 的程式修改其實只有兩行,但我認為這次實作很重要。
之前我們一直在建立不同的 Detection Rule,例如可疑指令、異常網路連線與檔案異動等。
但隨著系統功能逐漸增加,我發現不能只注意能不能成功偵測,也需要思考偵測到的資料要如何保存與使用。
今天將 Alert Logger 接入真實的 Detection 流程後,BehaviorGuard 已經可以在發現可疑程序時,自動將事件資訊保存到 JSONL 檔案。
另外,今天也遇到一個小問題,就是因為 Terminal 工作目錄不同,導致找不到日誌檔案。這讓我更了解 Linux 相對路徑的運作方式。
目前系統還沒有完整的日誌管理功能,例如檔案輪替、儲存空間限制以及集中式日誌管理,但基本的自動儲存流程已經完成。
下一篇 Day19,我們預計利用保存的 Alert 資料進行基本的風險等級統計,讓 BehaviorGuard 不只會產生警告,也能逐步整理與分析安全事件。