我可以在 ModSecurity 中使用什麼規則來記錄特定站點的 POST 有效負載?
我需要檢查特定網站的 POST 有效負載(伺服器相當繁忙,我不會為整個伺服器打開 POST 日誌記錄)。
伺服器是 LiteSpeed 5.0.7。SecRequestBodyAccess 設置為“開”。
首先,我嘗試了一系列規則:第一個在階段:1 僅匹配對我所需主機的請求,但後有效負載處於階段:2,我認為我不能在 2 個不同階段創建一個鏈。
然後我嘗試使用這個:
<VirtualHost xxxxx> SecRule REQUEST_METHOD "POST" "phase:2,log,id:22222223 </VirtualHost>
但它沒有記錄任何內容
modsec_audit.log
。我做錯了什麼還是與 LiteSpeed 與 ModSec 的兼容性有關?
最後,我還嘗試了這條規則來記錄所有請求的 POST:
SecRule REQUEST_METHOD "POST" "id:22222224,phase:2,ctl:auditEngine=On,log,pass".
它記錄請求,但不記錄請求正文 (
-C-- group si missing in modsec audit
)。
類似於這個問題:How to get mod_security to log all POST data?
你是對的,你不能在兩個不同的階段連結兩個規則,但是階段 2 可以訪問所有階段 1 的資訊,所以如果你想以這種方式執行此操作,只需將其移至階段 2。
您給出的這條規則:
SecRule REQUEST_METHOD "POST" "phase:2,log,id:22222223
有點無意義。這將記錄(在主日誌中)收到 POST 請求但沒有 POST 正文。
它還將根據您的SecAuditEngine值設置為記錄到 AuditEngine:
- 如果您將 SecAuditEngine 設置為 On,則所有內容都會記錄到審核日誌中,並且不需要上述規則。這會很快填滿日誌文件,因此不推薦。
- 如果您將 SecAuditEngine 設置為 RelevantOnly,那麼它也會在此處記錄。
- 如果 SecAuditEngine 設置為 Off,則永遠不會將其記錄到審核日誌中。
通常最好將 SecAuditEngine 設置為 RelevantOnly (我懷疑這是你已經擁有的),但如果沒有設置,那麼正文可能不會記錄到 AuditLog
也許更好的方法是使用您使用ctl操作提供的其他規則:
SecRule REQUEST_METHOD "POST" "id:22222224,phase:2,ctl:auditEngine=On,log,pass"
這會強制 AuditEngine 為發布請求打開 - 即使 AuditLog 設置為 Off。這還將記錄您已觸發此規則以將其轉換為並非真正必要或無用的規則,因此我將“log”更改為“nolog”。該請求仍將記錄(因為 auditEngine 已設置為 yes),但進行該更改的此規則不會。順便說一句,當您使用 ctl 時,這只影響此請求,因此 AuditEngine 將為下一個請求重置。
正如您所說,這似乎可行,除非您沒有 C 部分。這是使用SecAuditLogParts設置的。預設情況下,這包括 C 部分,所以猜測這意味著您必須更改預設值?這有什麼原因嗎?
無論如何,您可以將其設置為包含 C 部分:
SecAuditLogParts ABCFHZ SecRule REQUEST_METHOD "POST" "id:22222224,phase:2,ctl:auditEngine=On,nolog,pass"
或者,如果您只想在觸發此規則時記錄 C 部分,則可以將其作為規則的一部分執行:
SecRule REQUEST_METHOD "POST" "id:22222224,phase:2,ctl:auditEngine=On,ctl:auditLogParts=ABCFHZ,nolog,pass"
要注意的另一件事是 POST 請求可以記錄敏感數據(密碼、信用卡號、社會保險號……等)。不建議記錄這些內容,也可能違反公司政策和/或您遵循的任何標準(例如 PCI 合規性)。因此,建議設置清理規則來屏蔽此數據。有關更多資訊,請參見此處:https ://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#sanitiseArg