前幾天已經完成 Wazuh Active Response 的設定與測試,讓系統在偵測到 SSH 異常時,可以進一步執行封鎖動作。
不過在實際使用時,我發現還有一個問題:
如果沒有一直開著 Wazuh Dashboard,要怎麼知道系統發生了資安事件?
因此今天決定加入 Discord Webhook 通知功能,透過 Python 讀取 Wazuh 的警報資料,並將 SSH 登入異常資訊自動發送到 Discord。
這樣就不需要一直盯著 Dashboard,也能即時收到資安事件通知。
Wazuh Dashboard 雖然可以查看完整的警報資訊,但每次都需要進入介面查詢。
因此我希望建立一個更直接的通知方式。
這次選擇 Discord Webhook,主要是因為設定相對簡單,而且可以直接透過 Python 發送 HTTP 請求,不需要另外架設通知伺服器。
預期的運作流程如下:
SSH 登入失敗
↓
Wazuh 偵測異常
↓
產生 Alert
↓
Python 讀取警報
↓
Discord Webhook
↓
發送通知
透過這個方式,可以把原本只存在於 Wazuh Dashboard 的警報資訊,轉換成 Discord 訊息。
Wazuh 會將警報事件記錄在:
/var/ossec/logs/alerts/alerts.json
這份檔案採用 JSON 格式,包含事件的規則、來源 IP、主機資訊及時間等資料。
這次 Python 程式主要需要取得:
接著將這些資訊整理成 Discord 訊息。
整個處理流程如下:
讀取 alerts.json
↓
解析 JSON 資料
↓
判斷是否為 SSH 異常
↓
擷取主機與登入資訊
↓
整理警報內容
↓
發送 Discord
這樣就可以只針對需要關注的 SSH 事件發送通知,而不是把所有 Wazuh 警報都推送出去。
首先在 Discord 頻道中建立 Webhook,取得 Webhook URL。
接著使用 Python 的 requests 套件,將整理好的警報內容發送到指定頻道。
以下使用簡化程式碼示範訊息發送方式:
import os
import requests
webhook_url = os.environ["DISCORD_WEBHOOK_URL"]
message = {
"content": (
"🚨 SSH 登入失敗警報 🚨\n"
"受害主機:kuoyiting-VMware-Virtual-Platform\n"
"遭鎖定帳號:hacker\n"
"攻擊者 IP:192.168.212.1\n"
"已失敗次數:5 次"
)
}
requests.post(
webhook_url,
json=message,
timeout=10
).raise_for_status()
這段程式主要示範如何透過 Webhook 發送訊息。
實際整合時,通知內容會由 Python 解析 Wazuh 的警報資料後產生,而不是每次都傳送固定文字。
Webhook URL 也應避免直接公開在程式碼中,以免被其他人利用。
完成 Python 與 Discord Webhook 的整合後,我再次進行 SSH 登入失敗測試,確認通知功能是否正常運作。
這次從 Windows 對 Ubuntu 發起 SSH 連線,並故意輸入錯誤密碼,讓 Wazuh 產生相關警報。
當 Python 偵測到符合條件的事件後,就會將資訊整理並發送到 Discord。

從實際截圖可以看到,Discord Bot 成功顯示以下資訊:
| 欄位 | 通知內容 |
|---|---|
| 警報類型 | SSH 登入失敗警報 |
| 受害主機 | kuoyiting-VMware-Virtual-Platform |
| 遭鎖定帳號 | hacker |
| 攻擊者 IP | 192.168.212.1 |
| 已失敗次數 | 5 次 |
這次最重要的成果,就是成功將原本 Wazuh 偵測到的 SSH 異常資訊,轉換成 Discord 可以直接閱讀的通知。
不需要再進入 Dashboard 一筆一筆查看,也能快速知道是哪台主機受到登入嘗試,以及攻擊來源為何。
另外,通知中的「已失敗次數」是程式整理後顯示的結果,不一定等同於 Wazuh 自訂 Rule 的觸發門檻。
完成基本的通知測試後,還有一個問題需要處理。
如果每次都要手動執行 Python 程式,通知功能就無法持續運作。
因此我進一步嘗試透過 Docker Compose,讓 Python 通知程式以 Sidecar 的方式常駐執行。
整體架構如下:
Wazuh Manager
│
│
alerts.json
│
▼
Python Sidecar
│
│ HTTP POST
▼
Discord Webhook
│
▼
Discord 警報通知
透過共用掛載目錄,Python 容器可以讀取 Wazuh 產生的警報檔案,並持續監控新增事件。
當出現符合條件的 SSH 警報時,就會自動發送 Discord 通知。
這樣就不需要每次都手動啟動 Python 程式,也讓通知功能更適合長時間運作。
完成 Discord Webhook 後,整個系統已經不只是單純的 SSH 偵測工具。
目前可以將警報後續處理分成兩個方向:
SSH 登入異常
↓
Wazuh Alert
│
┌────────┴────────┐
│ │
▼ ▼
Active Response Python
│ │
▼ ▼
firewall-drop Discord Webhook
│ │
▼ ▼
封鎖來源 IP 發送警報通知
Active Response 負責執行自動防禦動作。
Python 與 Discord Webhook 則負責通知管理者。
兩個功能雖然用途不同,但都能利用 Wazuh 產生的警報資訊,讓系統從單純的事件偵測,進一步具備自動化處理能力。
今天成功將 Python 與 Discord Webhook 整合進 Wazuh,建立 SSH 異常事件的通知功能。
在實際測試中,Discord Bot 已經能夠顯示:
🚨 SSH 登入失敗警報 🚨
受害主機:kuoyiting-VMware-Virtual-Platform
遭鎖定帳號:hacker
攻擊者 IP:192.168.212.1
已失敗次數:5 次
這次實作讓我了解到,Wazuh 的警報資料不只能在 Dashboard 中查看,也可以透過 Python 進一步處理,整合到其他通知平台。
從前面的 SSH 異常偵測、Active Response 自動封鎖,到今天的 Discord 警報推播,整個系統已經逐漸具備資安事件偵測、回應與通知的基本流程。
最後一天將回顧這 30 天的實作成果,包括 Wazuh 環境建置、FIM 檔案監控、SSH 異常偵測、自訂 Rule、Active Response 與 Discord 警報通知。
同時也會整理過程中遇到的問題,以及未來可以繼續延伸的資安自動化方向。