Wazuh 的檔案完整性監控(FIM,syscheck)開下去之後,第一個問題通常是告警太多:暫存檔、記錄檔、編輯器的交換檔一直在變,真正重要的變更反而被淹沒。所以一定要設定排除。
網路上很多範例會在 <ignore type="sregex"> 裡寫一般的正規表示式,例如 \.swp$、[^\\]+,但這些寫法在 Wazuh 的 FIM 裡其實不會生效。這篇依官方文件整理正確的排除方式。
先搞清楚 sregex 是什麼
Wazuh 有三種比對語法:
| 名稱 | 實際是 | 能力 |
|---|---|---|
regex | OS_Regex | 簡易正規表示式:\w、\d、\S、+、*、^、$、| |
sregex | OS_Match | 只有字串比對,特殊字元只有 ^、$、|、! |
pcre2 | PCRE2 | 完整的正規表示式 |
FIM 的 <ignore> 只支援 sregex,也就是 OS_Match。它不是正規表示式:
- 沒有字元集合
[...]、沒有群組( )、沒有\d、\w這類寫法 .就是一個普通的點,不是「任意字元」- 反斜線不是跳脫字元,
\.swp會被當成「反斜線+點+swp」來比對 - 沒有
^、$時,只要路徑包含這段字串就算符合
官方文件的範例也是這樣寫的:
<ignore type="sregex">.log$|.swp$</ignore>
ignore 的行為
官方文件說明:被 ignore 的檔案與目錄仍然會被掃描,只是結果不會回報。所以 <ignore> 能減少告警,但不會減少掃描的負擔。真的不想掃描的目錄,應該從 <directories> 的範圍裡拿掉,或用 recursion_level 限制深度。
排除特定路徑
不加 type 就是精確的路徑,該目錄底下的所有內容都會被排除:
<syscheck>
<ignore>/etc/ssl/private</ignore>
<ignore>/var/log</ignore>
</syscheck>
Windows:
<syscheck>
<ignore>C:\Windows\Temp</ignore>
<ignore>C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\desktop.ini</ignore>
</syscheck>
精確路徑不能使用 * 這類萬用字元。
排除副檔名
用 sregex 的 $(結尾):
<syscheck>
<ignore type="sregex">.swp$</ignore>
<ignore type="sregex">.tmp$</ignore>
<ignore type="sregex">.log$</ignore>
<ignore type="sregex">.bak$</ignore>
</syscheck>
也可以用 | 寫在同一行:
<ignore type="sregex">.swp$|.tmp$|.log$|.bak$</ignore>
我比較建議一行寫一個,要增減時比較不容易改錯,也比較好看出哪一條沒生效。
排除「中間某一層是任意名稱」的路徑
最常見的需求是排除每位使用者的暫存目錄:C:\Users\<使用者>\AppData\Local\Temp。OS_Match 沒有萬用字元,沒辦法寫「中間任意一層」,但可以利用沒有 ^ 時只要包含這段字串就符合的特性:
<ignore type="sregex">\AppData\Local\Temp\</ignore>
這樣不論是哪位使用者,路徑裡只要包含 \AppData\Local\Temp\,就會被排除。前後都加上 \,可以避免誤中名稱剛好包含這段文字的其他目錄。
如果一定要限定在 C:\Users 底下、而且使用者不多,也可以把使用者列出來:
<ignore>C:\Users\user1\AppData\Local\Temp</ignore>
<ignore>C:\Users\user2\AppData\Local\Temp</ignore>
注意:設定完一定要實際測試。在要排除的目錄裡建立一個檔案,確認沒有產生 FIM 告警;再在不排除的目錄建一個,確認告警正常。Windows 的路徑大小寫、斜線方向,都可能讓比對不如預期。
其他相關選項
| 選項 | 作用 |
|---|---|
<nodiff> | 開啟 report_changes 時,指定的檔案不顯示內容差異,只回報有變更。適合含有密碼、金鑰的設定檔 |
restrict 屬性 | 寫在 <directories> 上,只監控檔名包含指定字串的檔案,和 ignore 相反 |
recursion_level 屬性 | 限制目錄往下掃描的層數 |
<skip_nfs> | 不掃描 NFS 等網路檔案系統(預設 yes) |
<max_files_per_second> | 限制每秒掃描的檔案數,避免掃描時拖慢主機 |
restrict 的例子,只監控 /etc 底下名稱含 .conf 的檔案:
<directories restrict=".conf$">/etc</directories>
Linux 與 Windows 分開設定
用集中設定檔 /var/ossec/etc/shared/<群組>/agent.conf,依作業系統分開,不要把 Linux 和 Windows 的路徑混在同一段:
<agent_config os="Linux">
<syscheck>
<directories>/etc,/usr/bin,/usr/sbin</directories>
<ignore>/etc/ssl/private</ignore>
<ignore type="sregex">.swp$</ignore>
<ignore type="sregex">.tmp$</ignore>
</syscheck>
</agent_config>
<agent_config os="Windows">
<syscheck>
<ignore>C:\Windows\Temp</ignore>
<ignore type="sregex">\AppData\Local\Temp\</ignore>
<ignore type="sregex">.tmp$</ignore>
</syscheck>
</agent_config>
改完之後,agent 會自動取得新的集中設定,不用逐台修改;可以用 /var/ossec/bin/verify-agent-conf 先檢查語法。
結論
Wazuh FIM 的 sregex 不是正規表示式,只能做字串比對:用 $ 排除副檔名、用不加 ^ 的片段比對中間任意一層。另外記得 ignore 只是不回報、不是不掃描,真的要省資源就縮小 <directories> 的範圍。
參考資料
- Wazuh 文件:syscheck(ignore、nodiff、restrict)
https://documentation.wazuh.com/current/user-manual/reference/ossec-conf/syscheck.html - Wazuh 文件:Regular expression syntax(OS_Regex、OS_Match、PCRE2)
https://documentation.wazuh.com/current/user-manual/ruleset/ruleset-xml-syntax/regex.html - Wazuh 文件:File integrity monitoring
https://documentation.wazuh.com/current/user-manual/capabilities/file-integrity/index.html



