昨天介紹了 Wazuh Decoder 的基本概念,今天實際建立一個簡單的自訂 Decoder,讓 Wazuh 能夠解析我們自己設計的日誌格式。
Wazuh 本身已經內建許多 Decoder,可以辨識 Linux、Windows、SSH、Firewall 等常見日誌。
但實際環境中也可能遇到:
自行開發的網站
公司內部系統
特殊應用程式
第三方服務產生的日誌
這些日誌格式如果不在 Wazuh 預設規則中,就可能無法正確拆解其中的資訊。
因此可以建立** Custom Decoder(自訂解碼器)。**
例如某個系統產生以下紀錄:
myapp: User 'admin' logged from '192.168.1.100'
我們希望 Wazuh 能夠從中辨識出:
使用者:admin
來源 IP:192.168.1.100
原本這只是一整串文字,Decoder 的工作就是把重要欄位拆出來。
自訂 Decoder 可以加入:
/var/ossec/etc/decoders/local_decoder.xml
使用:
sudo nano /var/ossec/etc/decoders/local_decoder.xml
加入以下內容:
<decoder name="myapp"> <prematch>^myapp:</prematch> </decoder> <decoder name="myapp-login"> <parent>myapp</parent> <regex>User '(\w+)' logged from '(\d+\.\d+\.\d+\.\d+)'</regex> <order>user,srcip</order> </decoder>
第一個 Decoder:
<decoder name="myapp"> <prematch>^myapp:</prematch> </decoder>
先確認日誌是否以:
myapp:
開頭。
第二個 Decoder 再利用:
<regex>
找出我們需要的資料。
其中:
(\w+)
抓取使用者名稱。
而:
(\d+\.\d+\.\d+\.\d+)
則負責抓取 IP 位址。
最後:
<order>user,srcip</order>
代表第一組資料存成 user,第二組存成 srcip。
| 標籤 | 功能 |
|---|---|
<decoder> |
定義 Decoder 的名稱與範圍 |
<prematch> |
初步判斷日誌是否符合指定格式 |
<parent> |
指定此 Decoder 所屬的父 Decoder |
<regex> |
使用正規表示式擷取日誌中的資料 |
<order> |
指定擷取出的資料要存入哪些欄位 |
Decoder 的核心概念其實就是:
原始日誌
↓
prematch 找出符合的日誌
↓
regex 擷取資料
↓
order 指定欄位
↓
結構化資料
修改 Decoder 後,不需要直接等真實攻擊事件發生,可以先使用 Wazuh 提供的測試工具:
sudo /var/ossec/bin/wazuh-logtest
接著輸入:
myapp: User 'admin' logged from '192.168.1.100'
如果 Decoder 正常運作,在 Phase 2 的解碼結果中就可以看到類似:
name: 'myapp'
user: 'admin'
srcip: '192.168.1.100'
代表 Wazuh 已經成功把原本的文字日誌拆解成可使用的欄位。
前幾天介紹的 Rule 與 Decoder 並不是同一個東西。
可以簡單理解成:
Log
↓
Decoder
↓
解析出 user、IP、action 等欄位
↓
Rule
↓
判斷是否為可疑行為
↓
Alert
例如 Decoder 解析出:
user = admin
srcip = 192.168.1.100
之後 Rule 才能根據這些資訊判斷:
是否為登入失敗?
是否來自可疑 IP?
是否短時間出現大量登入?
因此:
Decoder 負責「看懂日誌」,Rule 負責「判斷事件」。
假設公司自己開發了一個會員系統,系統產生:
LOGIN_FAILED user=alex ip=10.0.0.25
我們就可以自行建立 Decoder,將它拆解為:
action = LOGIN_FAILED
user = alex
srcip = 10.0.0.25
之後再搭配自訂 Rule,例如:
同一個 IP 短時間登入失敗多次
就有機會進一步偵測暴力破解等異常行為。
這也是 Wazuh 能夠適應不同系統的重要原因之一:即使不是官方預先支援的日誌格式,也能透過 Decoder 與 Rule 自行擴充偵測能力。