iT邦幫忙

2026 iThome 鐵人賽

DAY 20
0
AI 自動化

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

Day 20 | 防患於未然 —實作 SOAR 日常資安巡檢與報表自動化

  • 分享至 

  • xImage
  •  

大家好!歡迎來到鐵人賽第二十天。

前幾天,我們建立了一套非常強大的「突發事件」處理機制,當駭客攻擊或漏洞出現時,系統能自動攔截、分析並聯防。然而,在真實的資安維運(SecOps)日常中,並不是每天都有驚心動魄的駭客攻防;工程師更多時候是在做繁瑣的「例行巡檢」—— 確認所有伺服器的防護軟體有沒有正常運作、統計昨天發生了多少次低風險告警、確認合規性狀態等。

如果這些例行公事每天都要人工登入 Wazuh 後台截圖、寫報告,不僅耗時,還容易因為怠惰而疏漏。因此,今天我們要運用 n8n 實作「日常資安巡檢與報表自動化」,讓 SOAR 系統每天早上 8 點自動幫你把巡檢報告整理好,直接送到你的 LINE 裡。


巡檢情境設定

我們希望 n8n 每天早上固定執行以下任務:

  1. 檢查 Wazuh 中所有伺服器 Agent 的連線狀態(是否有主機斷線掉線)。
  2. 統整目前系統中尚未修補的「高風險(High)」漏洞數量。
  3. 透過 Gemini AI 將這些生硬的數據轉換成「日常資安巡檢早報」。
  4. 發送到 IT 團隊的 LINE 群組。

第一步:設定排程觸發器 (Schedule Trigger)

過去我們都是使用 Webhook 來被動接收 Wazuh 的告警(這屬於被動觸發)。今天我們要讓 n8n 「主動」出擊。

  1. 在空白的 n8n 畫布中,新增一個 Schedule Trigger 節點。
  2. 在 Rule 設定中,將 Trigger Interval 設為 Days(每天)。
  3. 將 Time 設為 08:00(或是你偏好的上班時間)。

設定完成後,這個節點就會像鬧鐘一樣,每天早上準時喚醒後面的工作流。


第二步:透過 API 主動向 Wazuh 索取狀態

接下來,我們要讓 n8n 主動去問 Wazuh:「現在大家的狀態還好嗎?」

  1. 在 Schedule Trigger 後方,新增一個 HTTP Request 節點。
  2. Method:GET
  3. URL:https://你的_Wazuh_IP:55000/agents?status=disconnected
    (這支 API 專門用來查詢目前與 Wazuh Server 斷線的主機清單)
  4. Authentication:設定 Basic Auth 或帶入 Wazuh 的 API Token(取決於你的 Wazuh 權限設定)。
  5. 勾選 Ignore SSL Issues(如果你的 Wazuh API 使用自簽憑證)。

透過這個節點,我們就能抓出所有「防護代理程式離線」的問題主機,這通常代表該主機當機,或是有異常狀況導致防護失效。


第三步:資料處理與格式化 (Code 節點)

Wazuh API 回傳的資料通常是巢狀的 JSON,為了讓後面的 Gemini AI 更好理解,我們可以用一個簡單的 Code 節點來萃取關鍵數據。

在 HTTP Request 後方新增一個 Code 節點,輸入以下簡單的 JavaScript 整理邏輯:

// 取得斷線的主機數量與清單
const disconnectedAgents = $input.item.json.data.affected_items || [];
const count = disconnectedAgents.length;
const agentNames = disconnectedAgents.map(agent => agent.name).join(", ");

return {
  json: {
    report_date: new Date().toLocaleDateString(),
    disconnected_count: count,
    disconnected_names: count > 0 ? agentNames : "無斷線主機,全數正常連線中"
  }
};


第四步:Gemini AI 撰寫巡檢早報

把整理好的數據交給 AI,讓它幫我們寫出一份專業的晨間報告。

新增一個 Google Gemini (Message a model) 節點:

  • System Message (系統提示詞):
    你是一位企業 IT 部門的資安助理。請根據我提供的巡檢數據,產出一份專業、簡潔的「資安巡檢早報」。語氣要像是在向 IT 主管匯報,請使用繁體中文,字數控制在 150 字以內,並附上適當的 Emoji。
  • Message (使用者輸入):
巡檢日期:{{ $json.report_date }}
防護端點斷線數量:{{ $json.disconnected_count }}
異常主機名單:{{ $json.disconnected_names }}


第五步:發送 LINE 群組通知

最後,把 Gemini 寫好的報告發送到團隊的 LINE 群組中。

新增最後一個 LINE HTTP Request 節點:

  • URL: [https://api.line.me/v2/bot/message/push](https://api.line.me/v2/bot/message/push)
  • Body (JSON):
{
  "to": "你的_LINE_群組_ID",
  "messages": [
    {
      "type": "text",
      "text": "🌞 【IT 團隊早安】系統自動巡檢報告已出爐\n\n{{ $json.text }}"
    }
  ]
}


完整流程

今天的自動化報表工作流會長這樣:

Schedule Trigger (每天早上 08:00 觸發)
 ↓
HTTP Request (呼叫 Wazuh API 檢查斷線主機)
 ↓
Code (整理 JSON 數據)
 ↓
Gemini AI (根據數據生成專業早報)
 ↓
HTTP Request (發送早報至 LINE)

你可以點擊畫布下方的 Test Workflow 來手動測試一次。如果設定正確,你的 LINE 應該會立刻收到類似這樣的訊息:

🌞 【IT 團隊早安】系統自動巡檢報告已出爐
主管早安,為您呈報今日(2026/XX/XX)的資安巡檢結果:
🟢 目前全數伺服器防護端點皆正常連線中,無發現異常斷線之主機 (0 台)。
系統防護網運作順暢,祝各位今天維運順利!☕


今天的成果

透過今天的實作,我們將 SOAR 架構的應用範圍從「被動防禦」擴展到了「主動巡檢」。

資安維運不應該只有在出事的時候才忙碌,平時的健康度檢查(Health Check)同樣重要。運用 n8n 的排程功能與 AI 的總結能力,我們成功把原本需要每天花 15 分鐘登入系統、肉眼檢查、寫報告的例行公事,變成了全自動的流程,讓工程師能把時間花在更有價值的地方。

明天(Day 21),我們將針對「資料保存」進行優化。這些每天產生的告警與報表如果一直塞在資料庫裡,遲早會面臨儲存空間不足的問題。我們將實作如何讓系統自動把過期的日誌打包並備份到雲端空間!我們明天見!


上一篇
Day 19 | 從 IP 到威脅情報 — 實作 VirusTotal 情資豐富化
下一篇
Day 21 | 備戰資安稽核 — 實作 SOAR 日誌封存與雲端自動備份
系列文
從漏洞告警到 AI 決策:Wazuh × RAG × n8n 實作自動化資安漏洞驗證與智慧通報 共 22 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言