
Estoy intentando encontrar/crear una regla Mod_Security para detectar y bloquear múltiples errores de inicio de sesión en la última versión de Joomla. Encontré una respuesta de marzo de 2015 aquí:https://serverfault.com/a/646608/960638pero en mis propias pruebas no detecta fallos de inicio de sesión. Incluso con el registro habilitado, no detecta nada. Sospecho que el código está desactualizado.
Encontré otra regla ModSec publicada por IT Octopus enhttps://www.itoctopus.com/a-modsecurity-rule-to-block-brute-force-attacks-on-a-joomla-website El código está debajo. Lo probé en un servidor pero descubrí que era demasiado sensible y me bloqueó después de iniciar y cerrar sesión en Joomla (concorrectocartas credenciales).
<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>
A continuación, encontré una regla ModSecurity enhttp://artefact.io/brute-force-protection-modsecurity/y es el que uso en mis servidores desde hace muchos meses. Ha estado funcionando muy bien hasta ayer cuando encontramos un error. Un cliente tiene 10 sitios web Joomla y descubrió que cuando inició sesión en ellos (con las credenciales correctas) su IP estaba restringida. Pude replicar esto durante mis propias pruebas. Por lo tanto, el siguiente código es el mejor que hemos encontrado hasta ahora, pero las líneas com_login/login no parecen distinguir entre errores de inicio de sesión e inicios de sesión exitosos. Funciona para evitar la fuerza bruta general, pero no funciona cuando un cliente tiene muchos sitios Joomla y accede legítimamente a varias instalaciones a la vez. Este es el 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>
Finalmente, leí algunas publicaciones que sugerían "el encabezado P3P se devuelve después de un inicio de sesión exitoso" y esto podría usarse en una regla ModSecurity. Fue sugerido por @godzillante aquí:https://serverfault.com/a/646608/960638
Utiliza ModSecurity fase 5 (analizando los archivos de registro), por lo que no estoy seguro de si esto es una desventaja. Y lo que es más importante, en mis pruebas no pude hacerlo funcionar. Incluso con el registro habilitado, no detectó inicios de sesión fallidos y no restringió el acceso. Aquí está el 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>
Mi objetivo aquí es mejorar el código "Joomla Brute Force" (arriba) porque bloquea las inundaciones de fuerza bruta pero desafortunadamente también bloquea a los usuarios cuando inician sesión legítimamente en Joomla con frecuencia. Necesito un código que pueda diferenciar entre un error de inicio de sesión y un inicio de sesión exitoso en Joomla. He estado trabajando en esto durante algún tiempo, así que me estoy comunicando con la comunidad aquí. ¡Gracias de antemano!