iT邦幫忙

2026 iThome 鐵人賽

DAY 11
0
AI 自動化

從漏洞告警到 AI 決策:Wazuh × RAG × n8n 實作自動化資安漏洞驗證與智慧通報系列 第 11 篇

Day 11 : 視覺化工作流起步-在 n8n 建立 Webhook 與 FastAPI 串接

  • 分享至 

  • xImage
  •  

大家好!昨天我們成功利用 Docker 部署了 n8n,為我們的資安通報中心打下了基礎。

在現代的微服務架構中,FastAPI 負責的是「核心邏輯與資料清洗」,而 n8n 負責的是「對外整合與通知分派」。今天,我們要把這兩個系統正式串接起來。具體的流程是:當 FastAPI 解析出確切的 CVE 漏洞情報後,將這筆乾淨的資料打包,再次透過 Webhook 的方式轉發給 n8n。

我們將在 n8n 畫布上建立第一個「觸發節點(Trigger Node)」,體驗視覺化資料流的強大威力!

步驟一:在 n8n 建立 Webhook 接收節點

請打開瀏覽器,進入你的 n8n 介面(http://localhost:5678):

  1. 點擊畫面中央的 "Add first step..."(新增第一個步驟)。
  2. 在右側的搜尋框中輸入 Webhook,並點擊加入該節點。
  3. 點開這個 Webhook 節點的設定面板,進行以下調整:
    HTTP Method:改為 POST(因為我們的 FastAPI 會把資料 POST 過來)。
    Path:系統會自動生成一串隨機 ID(例如 your-random-uuid),你可以保留預設,也可以自己改成好記的名稱,例如 wazuh-alert。
  4. 最關鍵的一步:在面板上方,你會看到一個 URL 連結。請確認切換到 "Test URL"(測試網址),並點擊網址旁邊的複製按鈕。它看起來會像這樣:
    http://localhost:5678/webhook-test/wazuh-alert

( 實務小知識:n8n 分為 Test URL 與 Production URL。開發階段我們都會使用 Test URL,這樣才能在畫面上即時看到進來的測試資料。)

步驟二:為 FastAPI 安裝 requests 套件

接下來,我們要讓 Python 具備「發送 HTTP 請求」的能力。請打開你運行 FastAPI 的 PowerShell 終端機(記得確認有啟動 (venv) 虛擬環境),先按 Ctrl + C 暫停伺服器,然後輸入:

pip install requests

requests 是 Python 裡最經典、最普及的 HTTP 請求套件,我們將用它來把資料往 n8n 送。

步驟三:修改 main.py 實作資料轉發

請打開 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。

明天見!


上一篇
Day 10 : 實作系統解耦-使用 Docker 部署 n8n 開源自動化工作流
系列文
從漏洞告警到 AI 決策:Wazuh × RAG × n8n 實作自動化資安漏洞驗證與智慧通報 共 11 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言