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 时,它也会阻止用户。我需要可以区分登录失败和登录成功的代码。我已经研究这个问题一段时间了,所以我正在联系这里的社区。提前谢谢!

相关内容