跳到主要內容
節省工具箱Jason Tools
經驗分享

Wazuh FIM 排除路徑與副檔名

Jason Cheng 發布 瀏覽 1 次
Wazuh FIM 排除路徑與副檔名
本文目錄
  1. 先搞清楚 sregex 是什麼
  2. ignore 的行為
  3. 排除特定路徑
  4. 排除副檔名
  5. 排除「中間某一層是任意名稱」的路徑
  6. 其他相關選項
  7. Linux 與 Windows 分開設定
  8. 結論
  9. 參考資料

Wazuh 的檔案完整性監控(FIM,syscheck)開下去之後,第一個問題通常是告警太多:暫存檔、記錄檔、編輯器的交換檔一直在變,真正重要的變更反而被淹沒。所以一定要設定排除。

網路上很多範例會在 <ignore type="sregex"> 裡寫一般的正規表示式,例如 \.swp$、[^\\]+,但這些寫法在 Wazuh 的 FIM 裡其實不會生效。這篇依官方文件整理正確的排除方式。

先搞清楚 sregex 是什麼

Wazuh 有三種比對語法:

名稱實際是能力
regexOS_Regex簡易正規表示式:\w、\d、\S、+、*、^、$、|
sregexOS_Match只有字串比對,特殊字元只有 ^、$、|、!
pcre2PCRE2完整的正規表示式

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> 的範圍。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀