在 Day16,我們完成了 Continuous Process Monitor(連續程序監控),讓 BehaviorGuard 能夠持續觀察 Linux 系統中的程序,並透過 Detection Engine 判斷是否存在可疑行為。
例如,當系統執行 python3 -c 時,BehaviorGuard 就能根據先前建立的規則 BG-CMD-002,產生 MEDIUM 等級的 Alert。
不過,目前還有一個問題:
如果我們關閉 Terminal,之前產生的 Alert 該怎麼查詢?
真正的資安監控系統不能只把警告顯示在畫面上,還需要保存事件紀錄,讓資安人員能夠追蹤與調查。
因此,Day17 我們要建立一個簡單的 Alert Logger,把警告資訊儲存成 JSONL 格式。
Security Logging(安全日誌紀錄)是指將系統發生的安全相關事件記錄下來。
例如:
在企業資安環境中,日誌紀錄非常重要。
因為資安人員不一定能在攻擊發生的當下立即發現問題,有時候需要透過歷史紀錄還原事件經過。
例如,某台電腦昨天晚上出現異常連線,資安人員就可以查看過去的 Alert,尋找可疑的程序與行為。
但要注意,Alert 並不代表一定發生了攻擊,而是系統發現了符合偵測規則的可疑行為,仍然需要進一步分析。
JSONL(JSON Lines)是一種資料儲存格式,特點是每一行都包含一個獨立的 JSON 物件。
例如:
{"rule": "BG-CMD-002", "severity": "MEDIUM", "pid": 1234}
{"rule": "BG-NET-003", "severity": "MEDIUM", "pid": 5678}
與一般 JSON 陣列不同,JSONL 不需要將全部事件包在同一個陣列中。
這樣的好處是:
因此,這次 BehaviorGuard 選擇使用 JSONL 儲存 Alert。
首先,在原本的 BehaviorGuard 專案中建立一個新檔案:
nano agent/alert_logger.py
接著加入以下程式:
import json
import os
from datetime import datetime, timezone
LOG_PATH = "logs/alerts.jsonl"
def save_alert(alert):
os.makedirs("logs", exist_ok=True)
record = {
"timestamp": datetime.now(timezone.utc).isoformat(),
**alert
}
with open(LOG_PATH, "a", encoding="utf-8") as f:
f.write(json.dumps(record, ensure_ascii=False) + "\n")
print("[INFO] Alert saved to logs/alerts.jsonl")
這段程式主要完成三件事情。
第一:建立日誌儲存位置
os.makedirs("logs", exist_ok=True)
這行程式會確認 logs 資料夾是否存在,如果不存在就自動建立。
第二:替 Alert 加入時間資訊
"timestamp": datetime.now(timezone.utc).isoformat()
這裡使用 UTC 時間,方便未來分析不同時區的安全事件。
第三:將 Alert 寫入檔案
with open(LOG_PATH, "a", encoding="utf-8") as f:
f.write(json.dumps(record, ensure_ascii=False) + "\n")
其中 "a" 代表 Append(附加模式)。
也就是說,每次產生新的 Alert,都會附加到檔案最後,而不是覆蓋原本的紀錄。
這對持續監控的系統來說非常重要。
完成 Alert Logger 後,我們先建立一筆模擬 Alert,測試資料是否能正確儲存。
執行:
PYTHONPATH=. python3 -c '
from agent.alert_logger import save_alert
save_alert({
"rule": "BG-CMD-002",
"name": "Python Inline Code Execution",
"severity": "MEDIUM",
"pid": 1234
})
'
成功執行後,Terminal 顯示:
[INFO] Alert saved to logs/alerts.jsonl
接著使用以下指令查看檔案:
cat logs/alerts.jsonl
實際取得的結果:
{"timestamp": "2026-10-13T08:09:34.069246+00:00", "rule": "BG-CMD-002", "name": "Python Inline Code Execution", "severity": "MEDIUM", "pid": 1234}
可以看到 Alert 已經成功保存,包含時間、規則編號、規則名稱、風險等級與 PID。
其中 +00:00 代表 UTC 時區,因此這筆紀錄換算成台灣時間為 2026 年 10 月 13 日下午 4 點 9 分。
這次測試成功,過程中沒有遇到錯誤。
不過,目前使用的 PID 1234 是模擬資料,並非這次實際偵測到的程序。
經過 Day17 的實作,我們新增了一個專門負責日誌儲存的模組。
目前的設計可以分成兩個部分:
原本的偵測流程:
Linux Process
↓
Process Monitor
↓
Detection Engine
↓
產生 Alert
↓
Correlation Engine
今天新增並測試的日誌功能:
模擬 Alert
↓
Alert Logger
↓
加入 Timestamp
↓
logs/alerts.jsonl
↓
保存事件紀錄
目前這兩個部分還沒有正式串接。
也就是說,BehaviorGuard 已經具備將 Alert 寫入檔案的能力,但還需要在後續實作中,讓 Detection Engine 產生的真實 Alert 自動呼叫 save_alert()。
今天的實作雖然不多,但讓我更了解資安監控系統除了 Detection(偵測)之外,為什麼還需要 Logging(日誌紀錄)。
之前我們的重點一直放在如何偵測可疑程序、網路連線以及檔案異動,但如果沒有保存事件紀錄,後續就很難調查發生過什麼事情。
這次也學到了 JSONL 的用途,以及 Python 如何利用 Append 模式持續寫入資料,而不覆蓋原有內容。
另外,我也了解到時間戳記的重要性。如果未來要把不同程序、網路與檔案事件進行關聯分析,事件時間就是很重要的參考資訊。
目前的 Alert Logger 仍然是基礎版本,還沒有處理日誌輪替、檔案大小限制與長期保存等問題。
不過,這次已經成功完成最基本的日誌儲存功能。
下一篇 Day18,我們將把 Alert Logger 接進真正的 Detection 流程,讓 BehaviorGuard 偵測到可疑行為時,能夠自動將警告保存下來。