
Estou tentando encontrar/criar uma regra Mod_Security para detectar e bloquear várias falhas de login na versão mais recente do Joomla. Encontrei uma resposta de março de 2015 aqui:https://serverfault.com/a/646608/960638mas nos meus próprios testes ele não detecta falhas de login. Mesmo com o log ativado, ele não detecta nada. Suspeito que o código esteja desatualizado.
Encontrei outra regra ModSec publicada pela IT Octopus emhttps://www.itoctopus.com/a-modsecurity-rule-to-block-brute-force-attacks-on-a-joomla-website O código está abaixo. Eu testei em um servidor, mas achei que era muito sensível e me bloqueou depois que eu entrei e saí do Joomla (comcorretocredenciais).
<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>
Em seguida, encontrei uma regra ModSecurity emhttp://artefact.io/brute-force-protection-modsecurity/e é o que uso em meus servidores há muitos meses. Tem funcionado muito bem até ontem, quando encontramos um bug. Um cliente tem 10 sites Joomla e descobriu que, ao fazer login neles (com credenciais corretas), isso resultou na restrição de seu IP. Consegui replicar isso durante meus próprios testes. Portanto, o código abaixo é o melhor código que encontramos até agora, mas as linhas com_login/login não parecem distinguir entre falhas de login e logins bem-sucedidos. Funciona para evitar força bruta geral, mas não funciona quando um cliente tem muitos sites Joomla e está acessando legitimamente várias instalações ao mesmo tempo. Este é o código:
# 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>
Por fim, li alguns posts que sugeriam "o cabeçalho P3P é retornado após um login bem-sucedido" e isso poderia ser usado em uma regra ModSecurity. Foi sugerido por @godzillante aqui:https://serverfault.com/a/646608/960638
Ele usa a fase 5 do ModSecurity (analisando os arquivos de log), então não tenho certeza se isso é uma desvantagem. E o mais importante, em meus testes não consegui fazê-lo funcionar. Mesmo com o registro ativado, ele não detectou logins com falha e não restringiu o acesso. Aqui está o código:
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>
Meu objetivo aqui é melhorar o código "Joomla Brute Force" (acima) porque ele bloqueia inundações de força bruta, mas infelizmente também bloqueia usuários quando eles estão fazendo login legitimamente no Joomla. Preciso de um código que possa diferenciar entre uma falha de login e um login bem-sucedido no Joomla. Estou trabalhando nisso há algum tempo, então estou entrando em contato com a comunidade aqui. Desde já, obrigado!