Logging

對 mod_security 日誌的細粒度控制

  • October 6, 2014

我在幾十台伺服器上安裝了mod_security2(每台伺服器都有幾十個 VHost),沒有時間為每個 VHost 配置它。在預設配置中,它會在日誌文件中產生大量誤報,所以我選擇讓它在DetectionOnly-mode 下執行(它不會阻止任何東西,但我仍然可以獲得大多數黑客嘗試的詳細日誌),但只有一個選擇幾個虛擬主機。

我對這個設置很滿意,直到我發現一些伺服器上的日誌文件在不到 3 週的時間內增長到了幾個 GB。我決定關閉生成大部分日誌條目的少數 VHost 的日誌記錄。有幾種不同的方法可以做到這一點,我最終決定使用非常具體的觸發器製定新規則,這些觸發器都有"nolog,phase:1,t:none,ctl:secAuditEngine=Off"作為動作。只要審計日誌中的條目數量減少到可管理的水平,就可以成功。

但我仍然得到千兆字節的日誌,因為我似乎無法阻止 mod_security2 寫入錯誤日誌。我嘗試過SecDebugLogLevel 0,因為它是唯一與錯誤日誌有關的配置指令(無論如何我都能找到),但無濟於事。唯一似乎有幫助的是SecRuleEngine Off,它首先破壞了安裝 mod_security2 的目的。

**我錯過了什麼嗎?**無論我嘗試什麼,似乎我只能控制記錄到審計日誌的數量,而無法控制記錄到錯誤日誌的數量。

經過大量的試驗和錯誤後,我仍然沒有一個完全令人滿意的解決方案,但至少有一個解決方法。添加SecRemoveRuleById內部<Directory>-Blocks 可防止錯誤日誌中的條目 - 但它似乎不適用於所有規則,僅適用於其中一些規則(例如,停用規則 id 960010 有效,但 960243 和 960257 無效)。當然,這只有在 Apache 能夠確定目錄路徑時才有效——對於許多格式錯誤的請求和缺少關鍵資訊的請求,Apache 不知道路徑。

通過定義表單的新規則來停用規則SecRule SERVER_NAME "^domain.tld$" "nolog,phase:1,t:none,id:100,ctl:ruleRemoveById=960010"也可以,但是必須在所有其他規則之前定義它們(因此在包含 CRS 規則之前)才能可靠地停用現有規則。據我所知 mod_security 按定義的順序應用規則,因此在觸發後停用 phase:1-rule 顯然不會阻止已經發生的日誌條目(在階段 1 中停用 phase:2-rule 似乎總是工作,這是意料之中的)。在不改變定義順序的情況下,我無法影響應用程序的順序,這有點不方便。

當然,我真正在尋找的解決方案是停用錯誤日誌條目。為每個 VHost 找到頻繁觸發的規則 ID 並單獨停用它們需要花費太多精力。10000 個 VHosts á 10 分鐘的配置 -> 幾乎一年的時間讓它在每個 VHost 上工作。

引用自:https://serverfault.com/questions/632162