上一篇介紹了 Wazuh 如何收集系統日誌,但收到 Log 之後,Wazuh 還需要判斷這筆紀錄是否具有安全風險。
例如:
Failed password for invalid user admin from 192.168.1.50 port 52341 ssh2
這代表一次 SSH 登入失敗,而 Rules(規則) 就是 Wazuh 用來判斷事件是否需要產生警報的機制。
基本流程可以理解成:
系統產生日誌
↓
Wazuh Agent 收集
↓
傳送至 Wazuh Manager
↓
Decoder 解析日誌內容
↓
Rules 比對事件
↓
判斷事件嚴重程度
↓
產生 Alert
其中:
Wazuh Rule 使用 XML 格式,例如:
<rule id="100010" level="5">
<match>Failed password</match>
<description>SSH login failed</description>
</rule>
主要欄位如下:
| 欄位 | 說明 |
|---|---|
id |
Rule 的唯一編號 |
level |
警報嚴重程度 |
match |
要比對的內容 |
description |
警報顯示的說明 |
上面的規則代表:當日誌符合 Failed password 時,就可能觸發這條 Rule。
Wazuh 使用 Level 0~16 表示事件的嚴重程度,通常數字越高代表事件越需要注意。
可以簡單理解為:
| Level | 大致意義 |
|---|---|
| 0 | 忽略事件 |
| 1~4 | 低重要性事件 |
| 5~7 | 一般警告或可疑事件 |
| 8~11 | 較重要的異常事件 |
| 12~15 | 高風險安全事件 |
| 16 | 最高嚴重程度 |
因此看到 Alert 時,除了內容之外,也可以透過 Rule Level 快速判斷事件的重要程度。
Rule 和 Decoder 很容易混淆,可以簡單記成:
Decoder 負責「看懂日誌」,Rule 負責「判斷日誌」。
例如:
Failed password for root from 192.168.1.50
Decoder 可能解析出:
User:root
Source IP:192.168.1.50
Event:Login Failed
接著 Rule 再判斷這是不是需要產生警報的安全事件。
Raw Log
↓
Decoder
↓
Rule
↓
Alert
Wazuh 內建規則主要位於:
/var/ossec/ruleset/rules/
如果想建立自己的規則,則可以使用:
/var/ossec/etc/rules/local_rules.xml
通常不建議直接修改內建 Rules,因為 Wazuh 更新後可能會被覆蓋。
自訂 Rule 建議使用 100000~120000 範圍的 Rule ID。
例如想偵測日誌中的:
Failed password
可以建立:
<group name="custom_authentication,">
<rule id="100001" level="5">
<match>Failed password</match>
<description>Detected a failed login attempt</description>
</rule>
</group>
這表示只要符合指定內容,就會觸發 ID 100001、Level 5 的規則。
Wazuh 提供 wazuh-logtest,可以測試一筆日誌會觸發哪條 Rule。
執行:
sudo /var/ossec/bin/wazuh-logtest
再輸入:
Failed password for root from 192.168.1.50
Wazuh 會依序進行:
Phase 1:Pre-decoding
Phase 2:Decoding
Phase 3:Rules Filtering
如果成功比對,就會看到對應的 Rule ID、Level 與 Description。
這個工具最大的好處是,不需要真的發動攻擊,也能測試 Wazuh 的偵測規則是否正常。
最後把昨天的日誌監控與今天的 Rules 串起來:
Endpoint
↓
產生日誌
↓
Wazuh Agent
↓
Wazuh Manager
↓
Decoder
↓
Rules
↓
Alert
↓
Wazuh Dashboard
因此 Wazuh 不只是單純收集 Log,而是透過 Decoder 與 Rules,把大量日誌轉換成較容易分析的安全警報。