Logging
mod_security:如何記錄特定 URI 的 POST 請求?
我正在嘗試設置 mod_security 以記錄特定 URI 的 POST 請求有效負載,因為似乎客戶網頁被用作垃圾郵件中繼,並且這些請求損壞了伺服器端記憶體。
我從關注這篇博文開始,但它似乎相當陳舊和過時。它不適用於我們的 Apache 2.4 和 mod_security 2.8 環境。所以我通過這個serverfault answer增強了該配置。
在相關的 vhost 配置裡面 mod_security 是這樣配置的:
<IfModule security2_module> SecRuleEngine On SecAuditEngine RelevantOnly SecAuditLog logs/audit.log SecRequestBodyAccess On SecAuditLogParts ABCFHJKZ SecDefaultAction "phase:2,nolog,noauditlog,pass" SecRule REQUEST_METHOD "^POST$" "id:'1234',phase:2,chain,allow,ctl:auditEngine=On" SecRule REQUEST_URI "^\/en\/us\/$" </IfModule>
結果是每個 POST 請求都記錄到審計日誌中。
https://<SITE>/en/us/
但只應記錄對首頁的 POST 請求。據我了解,這應該通過連結到第二個 SecRule 來完成,該 SecRule 將請求 URI 與給定的正則表達式匹配。我也嘗試了不同版本的正則表達式,但沒有成功。
這有點令人困惑,但第一條規則中指定的一些操作將針對鏈中匹配的每個規則執行,並且僅當所有規則都匹配時才會執行(ModSecurity 的作者事後表示最好將規則放在最後一個鍊式規則而不是第一個)。有關更多詳細資訊,請參見此處:https ://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#chain :
特殊規則控制鍊式規則中動作的使用:
- 任何影響規則流的動作(即破壞性動作、skip 和skipAfter)只能在鏈啟動器中使用。只有當整個鏈匹配時,它們才會被執行。
- 可以在任何規則中使用非破壞性規則;如果包含它們的規則匹配,它們將被執行,而不僅僅是當整個鏈匹配時。
- 元數據操作(例如,id、rev、msg)只能在鏈啟動器中使用。
所以規則應該是這樣的,所以只有在第一條和第二條規則匹配時才打開日誌記錄:
SecRule REQUEST_METHOD "^POST$" "id:'1234',phase:2,chain,allow" SecRule REQUEST_URI "^\/en\/us\/$" "ctl:auditEngine=On"
另請注意,這將允許該規則並跳過所有未來的規則。相反,您可能會更好地通過規則。這樣它肯定會被記錄,但仍會執行其他規則。但是,如果根據您顯示的配置,這是您唯一的規則,那並不重要,但仍然是很好的做法。