Mod_Security 防止 Joomla 暴力破解

Mod_Security 防止 Joomla 暴力破解

我正在嘗試尋找/建立 Mod_Security 規則來檢測和阻止最新版本的 Joomla 上的多次登入失敗。我在這裡找到了 2015 年 3 月的答案:https://serverfault.com/a/646608/960638但在我自己的測試中它沒有偵測到登入失敗。即使啟用了日誌記錄,它也沒有偵測到任何內容。我懷疑程式碼已經過時了。

我發現 IT Octopus 發布的另一條 ModSec 規則位於https://www.itoctopus.com/a-modsecurity-rule-to-block-brute-force-attacks-on-a-joomla-website 代碼如下。我在伺服器上測試了它,但我發現它太敏感了,在我登入+退出 Joomla 後它阻止了我(使用正確的證書)。

<Location /administrator>
    SecDefaultAction phase:2,deny,status:403,log,auditlog
    SecRule IP:bf_counter "@eq 5" "id:1000002,phase:2,log,block,expirevar:IP.bf_counter=3600,msg:'IP address blocked because of a suspected brute force attack on the Joomla website'"
    SecRule ARGS:option "@streq com_login" "id:1000000,phase:2,chain,t:none,log,pass,msg:'Multiple Joomla authentication failures from IP address', setvar:IP.bf_counter=+1"
</Location>

接下來,我發現了一條 ModSecurity 規則http://artefact.io/brute-force-protection-modsecurity/這是我在我的伺服器上使用了好幾個月的那個。它一直工作得很好,直到昨天我們發現了一個錯誤。客戶有 10 個 Joomla 網站,他們發現當他們(使用正確的憑證)登入這些網站時,導致他們的 IP 受到限制。我在自己的測試中能夠複製這一點。因此,下面的程式碼是我們迄今為止找到的最好的程式碼,但 com_login / login 行似乎沒有區分登入失敗和成功登入。它可以防止一般的暴力破解,但當客戶端擁有多個 Joomla 網站並且同時合法存取多個安裝時,它就不起作用。這是代碼:

# Joomla Brute Force
SecAction "phase:1,pass,setvar:TX.max_requests=6,setvar:TX.requests_ttl=180,setvar:TX.block_ttl=900,initcol:ip=%{REMOTE_ADDR},nolog,id:5001000"
<LocationMatch "/administrator/index.php">
SecAction "phase:2,chain,nolog,id:5001022"
SecRule REQUEST_METHOD "^POST$" "chain"
SecRule ARGS_POST_NAMES "^username$" "chain"
SecRule ARGS_POST_NAMES "^passwd$" "chain"
SecRule ARGS_POST:option "^com_login$" "chain"
SecRule ARGS_POST:task "^login$" "chain"
SecAction "setvar:ip.request_count=+1,expirevar:ip.request_count=%{TX.requests_ttl}"

SecRule IP:request_count "@ge %{TX.max_requests}" "phase:2,drop,setvar:ip.blocked=1,expirevar:ip.blocked=%{TX.block_ttl},log,msg:'Joomla brute force. Blocking for %{TX.block_ttl} seconds',id:5001023"

</LocationMatch>

最後,我讀到了一些建議「成功登入後返回 P3P 標頭」的帖子,這可以在 ModSecurity 規則中使用。 @godzillante 在這裡建議:https://serverfault.com/a/646608/960638

它使用 ModSecurity 第 5 階段(分析日誌檔案),所以我不確定這是否是一個缺點。更重要的是,在我的測試中我無法讓它工作。即使啟用了日誌記錄,它也不會偵測失敗的登錄,也不會限制存取。這是代碼:

SecAction phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR},id:5000144
<Locationmatch "/administrator/index.php">
    SecRule ip:bf_block "@gt 0" "deny,status:401,log,id:5000145,msg:'ip address blocked for 5 minutes, more than 5 login attempts in 3 minutes.'"
    SecRule RESPONSE_HEADERS:P3P "streq 0" "phase:5,t:none,nolog,pass,setvar:ip.bf_counter=0,id:5000146"
    SecRule RESPONSE_HEADERS:P3P "!streq 0" "phase:5,chain,t:none,nolog,pass,setvar:ip.bf_counter=+1,deprecatevar:ip.bf_counter=1/180,id:5000147"
    SecRule ip:bf_counter "@gt 5" "t:none,setvar:ip.bf_block=1,expirevar:ip.bf_block=300,setvar:ip.bf_counter=0"
</locationmatch>

我的目標是改進程式碼「Joomla Brute Force」(上圖),因為它確實可以阻止暴力洪氾,但不幸的是,當用戶合法登入 Joomla 時,它也會阻止用戶大量登入。我需要能夠區分登入失敗和成功登入 Joomla 的程式碼。我已經為此工作了一段時間,所以我正在向這裡的社區伸出援手。先致謝!

相關內容