mod_security X-Forwarded-For 未被阻止
根據這個建議,我對我的配置進行了一些更改:
SecAction \ "id:901321,\ phase:1,\ pass,\ t:none,\ nolog,\ initcol:global=global,\ initcol:ip=%{x-forwarded-for}_%{tx.ua_hash},\ setvar:'tx.real_ip=%{x-forwarded-for}'"
但似乎什麼也沒有發生。我注意到我的 apache error_log 使用預設錯誤日誌格式並將所有內容記錄為 127.0.0.1。
所以我把我
ErrorLogFormat
的改為:ErrorLogFormat "[%{u}t] [%-m:%l] [pid %P:tid %T] %7F: %E: [client\ %{X-Forwarded-For}i] %M% ,\ referer\ %{Referer}i"
這讓我的日誌更好,但 ModSecurity 仍然沒有做任何阻塞。奇怪的是,apache error_log 中的大多數 ModSec 日誌中都有一個額外的客戶端 IP 部分:
[Wed May..2019] [err] [pid X:tid X] [client XXX.XX.XX.XXX] [client 127.0.0.1] ModSecurity: Warning...
我不知道額外
[client 127.0.0.1]
的來自哪裡 - 我知道它肯定只對 error_log 中的 ModSecurity 日誌執行此操作。似乎 ModSecurity 要麼不斷嘗試阻止 127.0.0.1,要麼只是不阻止任何東西..
那麼如何讓 ModSecurity 使用
X-Forwarded-For
標頭進行阻止呢?筆記
- 我確實設置
SecRuleEngine On
正確。- 版本:Apache 2.4、ModSecurity 2.9、OWASP 3
您的連結建議的第一部分有這個
SecAction "phase:1,nolog,pass,initcol:IP=%{REQUEST_HEADERS.x-forwarded-for}"
如您所見,它指定 x-forwarded-for 是 REQUEST_HEADERS 的一部分,但您的版本中缺少該內容。
請注意,僅記錄 IP 不會導致阻塞。它用於保存可在後續規則中使用的數據(例如,針對 IP 記錄一個計數器並在每個請求中對其進行迭代,然後在超出基本 DoS 保護的某個限制時阻止)。因此,請確保您已經配置了一些規則來使用該 IP 地址執行某些操作!
此外,正如評論中所討論的,ModSecurity 將集合記錄在基於磁碟的文件中。當許多 Apache 程序嘗試同時訪問它時,這會導致爭用。ModSecurity 所做的清理工作也可能會失敗,這意味著文件會不斷增長,直到耗盡所有磁碟空間或讓 Apache 慢下來。我不喜歡使用它們,尤其是在有捲的網站上。我將它們視為 ModSecurity 可以將其基於單一請求規則的引擎擴展到交叉請求引擎的概念證明,但恕我直言,它不是生產就緒的。有關這方面的更多資訊,請參見此處:https ://sourceforge.net/p/mod-security/mailman/message/34393121/
雙 client_ip 日誌記錄是 ModSecurity 過去使用非標準日誌記錄方式的殘餘。他們轉向了 Apache 原生日誌記錄(它具有更多功能 - 例如記錄 HTTP 標頭的能力,如 x-forwarded-for),但只是注意到雙 client_ip 很晚(因為 Apache 常設日誌記錄模組和 ModSecurity 現在都在記錄這個)。他們原樣離開是為了避免破壞任何依賴原始 client_ip 日誌記錄的人。有關更多詳細資訊,請參見此處:https ://github.com/SpiderLabs/ModSecurity/pull/840