Protección fuerza bruta con ModSecurity

Existe un alto volumen de ataques de fuerza bruta ante los accesos de WordPress y de Joomla. Estos ataques se producen de 10 a 20 veces por segundo, lo que puede provocar una lentitud en el resto de páginas web que se encuentran alojadas en el servidor.

Para impedir estos ataques de fuerza bruta se pueden utilizar las siguientes reglas de ModSecurity

# artefact.io WordPress & Joomla brute force protection rules for ModSecurity 2
# -----------------------------------------------------------------------------
# TX.max_requests - maximum number of requests allowed over time period
# TX.requests_ttl - time period (sec)
# TX.block_ttl - IP block duration (sec)
# -----------------------------------------------------------------------------
 SecRequestBodyAccess On
 SecDataDir /tmp
 SecAction "phase:1,pass,setvar:TX.max_requests=11,setvar:TX.requests_ttl=180,setvar:TX.block_ttl=900,initcol:ip=%{REMOTE_ADDR},nolog,id:5001000"
# Drop and log connections from blocked IP's
 SecRule IP:blocked "@eq 1" "phase:1,drop,log,id:5001001"
# WordPress
 <LocationMatch "/wp-login.php">
 SecAction "phase:2,chain,nolog,id:5001002"
 SecRule REQUEST_METHOD "^POST$" "chain"
 SecRule ARGS_POST_NAMES "^log$" "chain"
 SecRule ARGS_POST_NAMES "^pwd$" "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:'Blocked for %{TX.block_ttl} sec',id:5001003"
 </LocationMatch>
# Joomla
 <LocationMatch "/administrator/index.php">
 SecAction "phase:2,chain,nolog,id:5001012"
 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:'Blocked for %{TX.block_ttl} sec',id:5001013"
 </LocationMatch>
# Old Joomla
 <LocationMatch "/administrator/index.php">
 SecAction "phase:2,chain,nolog,id:5001022"
 SecRule REQUEST_METHOD "^POST$" "chain"
 SecRule ARGS_POST_NAMES "^usrname$" "chain"
 SecRule ARGS_POST_NAMES "^pass$" "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:'Blocked for %{TX.block_ttl} sec',id:5001023"
 </LocationMatch>

En las reglas se indica que si hay al menos 10 accesos al login de un panel de WordPress o Joomla en 3 minutos, la IP será bloqueada durante 15 minutos y todas las conexiones desde esta IP se rechazaran.

Estas reglas pueden ser modificadas, de hecho en las primeras líneas de código se puede ver una explicación de los campos que podrían ser fácilmente modificados.

Una vez se han añadido estas reglas en nuestros archivos de configuración de ModSecurity veremos el resultado en el acces_log de un sitio de WordPress o Joomla. Ejemplo de un ataque de fuerza bruta detenido por estas reglas:

Antes:

Protección fuerza bruta con ModSecurity

Después:

Protección fuerza bruta con ModSecurity

¿Donde se implementan estas reglas?

En servidores de cPanel donde módulo ModSecurity se encuentra instalado con EasyApache se tiene que poner el archivo bruteforce.conf con las reglas anteriormente indicadas en la ruta /usr/local/apache/modsecurity.d y editar el archivo /usr/local/apache/conf/modsec2.user.conf para añadir la siguiente línea:

Include /usr/local/apache/modsecurity.d/bruteforce.conf

Si no es un servidor con cPanel el archivo bruteforce.conf en la carpeta de modsecurity.d normalmente se encuentra en la ruta /etc/httpd/modsecurity.d

Una vez hecho estos cambios se deberá de reiniciar el servicio de Apache.

Esperamos que nuestro artículo Protección fuerza bruta con ModSecurity os haya servido de ayuda, en caso de tener cualquier problema o pregunta no dudéis en comentar al final de esta página.

Comparte este tutorial:

No hay comentarios en este tutorial

Sé el primero en enviar un comentario: