昨天我們見識到了 Wazuh 4.8.0 抓漏洞的威力,儀表板上滿滿的圖表看起來非常專業。但現實的資安維運中,我們不可能 24 小時盯著網頁看。要實現真正的自動化,第一步就是要把這些告警從 Wazuh 系統裡「抓」出來。
說到系統間的資料傳遞,最常見的方式有兩種:一種是 API Polling(輪詢),就像我們不斷去問 Wazuh「有新漏洞了嗎?」,這不僅沒效率也非常浪費資源。
另一種則是 Webhook,它就像是我們給 Wazuh 留了一支電話:「如果有掃到中高風險的漏洞,不用等我問,直接打這支電話通知我,並把資料傳過來。」
我們接下來的架構,就是要實作 Webhook 的接收端。
在處理資安日誌這種高頻率的資料時,接收速度非常重要。FastAPI 顧名思義就是「快」,加上它的程式碼寫起來極度簡潔,用來當作 Webhook 的接收站真的再適合不過了。對於資工系的學生來說,這種 Python 框架的學習曲線相對友善,能讓我們把心力專注在資料流的邏輯上,而不是被複雜的底層架構卡死。
準備開發環境 (PowerShell 提速小技巧)
為了加快開發節奏,我們可以直接打開 PowerShell,用幾行指令快速搞定今天的檔案建置,這比用滑鼠慢慢點擊右鍵新增快上不少:
# 進入我們之前建好的專案目錄
cd secops-project
# 進入 backend 資料夾並建立 Python 檔案
cd backend
New-Item main.py
今天我們不寫太複雜的邏輯,只要確保程式能順利啟動、並且能接收 POST 請求就好。如果你是用 VS Code,可以直接在終端機輸入 code . 打開專案,然後在 main.py 裡貼上這短短十幾行程式碼:
from fastapi import FastAPI, Request
import uvicorn
app = FastAPI(title="SecOps Backend API")
# 建立一個 POST 路由,準備用來接收 Wazuh 送來的資料
@app.post("/webhook/wazuh")
async def receive_wazuh_alert(request: Request):
# 先單純把收到的請求轉成 JSON 格式
payload = await request.json()
# 簡單印出提示,證明我們真的有收到東西!
print("!收到一筆來自 Webhook 的資料!")
# 回傳成功狀態給發送方 (Wazuh)
return {"status": "success", "message": "Alert received"}
if __name__ == "__main__":
# 啟動伺服器,監聽 8000 port
uvicorn.run(app, host="0.0.0.0", port=8000)
寫好之後,在終端機輸入這行指令安裝必備套件:
pip install fastapi uvicorn
接著執行程式:
python main.py
只要看到終端機印出 Application startup complete.,就代表我們的接收站已經架設完畢,隨時準備接聽 Wazuh 打來的電話了。
成功的畫面像是這樣
今天我們用比較輕鬆的節奏,把後端 API 的地基打好了。把大任務切成小碎塊來解,實作起來會踏實很多。現在接收站已經開張,明天我們就要回到 Wazuh 去設定轉發規則,讓它真正把漏洞告警打到這支 API 裡!