大家好!昨天我們成功利用 Docker 部署了 n8n,為我們的資安通報中心打下了基礎。
在現代的微服務架構中,FastAPI 負責的是「核心邏輯與資料清洗」,而 n8n 負責的是「對外整合與通知分派」。今天,我們要把這兩個系統正式串接起來。具體的流程是:當 FastAPI 解析出確切的 CVE 漏洞情報後,將這筆乾淨的資料打包,再次透過 Webhook 的方式轉發給 n8n。
我們將在 n8n 畫布上建立第一個「觸發節點(Trigger Node)」,體驗視覺化資料流的強大威力!
請打開瀏覽器,進入你的 n8n 介面(http://localhost:5678):
( 實務小知識:n8n 分為 Test URL 與 Production URL。開發階段我們都會使用 Test URL,這樣才能在畫面上即時看到進來的測試資料。)
接下來,我們要讓 Python 具備「發送 HTTP 請求」的能力。請打開你運行 FastAPI 的 PowerShell 終端機(記得確認有啟動 (venv) 虛擬環境),先按 Ctrl + C 暫停伺服器,然後輸入:
pip install requests
requests 是 Python 裡最經典、最普及的 HTTP 請求套件,我們將用它來把資料往 n8n 送。
請打開 main.py,我們要在昨天寫好的 CVE 解析邏輯下方,加入發送給 n8n 的程式碼。
請在檔案最上方加入 import requests,並將路由區塊更新如下:
import requests # 記得在最上方引入
# ... (前面的 Pydantic 模型保持不變) ...
@app.post("/webhook/wazuh")
async def receive_wazuh_alert(payload: WazuhPayload):
try:
logger.info(f"[SECURITY_EVENT] Agent: {payload.agent.name} | Rule_Level: {payload.rule.level} | Desc: {payload.rule.description}")
if payload.data and "vulnerability" in payload.data:
vuln = payload.data["vulnerability"]
cve_id = vuln.get("cve", "Unknown CVE")
severity = vuln.get("severity", "Unknown")
pkg_name = vuln.get("package", {}).get("name", "Unknown Package")
logger.warning(f"[CVE_DETECTION] CVE_ID: {cve_id} | Package: {pkg_name} | Severity: {severity}")
# ==========================================
# 新增:將清洗後的乾淨資料,打包並轉發給 n8n
# ==========================================
n8n_payload = {
"agent_name": payload.agent.name,
"cve_id": cve_id,
"package": pkg_name,
"severity": severity,
"description": payload.rule.description
}
# 替換成你剛剛在 n8n 複製的 Test URL (注意 port 是 5678)
n8n_webhook_url = "http://127.0.0.1:5678/webhook-test/你的專屬ID"
# 發送 POST 請求給 n8n,設定 5 秒 timeout 避免卡死
response = requests.post(n8n_webhook_url, json=n8n_payload, timeout=5)
if response.status_code == 200:
logger.info("成功將告警轉發至 n8n 工作流")
else:
logger.error(f"轉發 n8n 失敗,狀態碼: {response.status_code}")
return {"status": "success", "message": "Alert processed"}
except Exception as e:
logger.error(f"解析或轉發失敗: {str(e)}")
raise HTTPException(status_code=500, detail="Internal Server Error")
修改完畢後,執行 python main.py 重新啟動伺服器。
現在,請回到瀏覽器的 n8n 畫面,點擊 Webhook 節點面板右下角的 "Listen for Test Event"(監聽測試事件)。這時 n8n 會進入旋轉等待的狀態。
接著,我們只需要稍微等待 Wazuh 在背景掃描時觸發告警(或者如果你很急,也可以用我們第一天提到的 PowerShell Invoke-RestMethod 技巧,自己打一筆假資料給 FastAPI)。
當 FastAPI 終端機印出 成功將告警轉發至 n8n 工作流! ,切換回 n8n 畫面——
會看到原本在等待的 Webhook 節點瞬間亮起綠燈,右側的面板會完美展開我們在 Python 裡打包好的 JSON 資料(包含 agent_name、cve_id 等)!
看到資料成功出現在 n8n 的畫面上,代表我們的第一段跨服務串接已經完成了。
原本由 Wazuh 產生的資安事件,經過 FastAPI 解析與資料清洗後,現在已經可以順利進入 n8n。換句話說,我們已經成功把「資安資料」送進了接下來的自動化流程。
這次研究我不打算使用 Discord 或 Email,而是選擇 LINE Bot 作為最終的資安通報管道,讓系統在偵測到重要漏洞時,可以直接將整理後的資訊推送到管理人員的手機。
不過在正式讓 n8n 發送訊息之前,我們還需要先建立 LINE Bot、取得 API 所需要的憑證。
因此明天,我們先從 LINE Developers 開始,建立屬於自己的資安告警 LINE Bot。
明天見!