Asegurar un servicio web simple contra la fuerza bruta con mod-security

4

Quiero ofrecer una defensa básica contra los ataques de fuerza bruta contra un servicio web HTTPS simple. El servicio web proporciona un método login (digamos en enlace ) que pasa un nombre de usuario y una contraseña como parámetros GET HTTP o como campos de un objeto JSON dado por HTTP POST. El servicio devuelve el código de estado HTTP 403 en los intentos fallidos de inicio de sesión. Puedo pensar en dos tipos de ataques para proteger contra:

  • Demasiados intentos fallidos de inicio de sesión desde la misma IP en un lapso de tiempo dado
  • Demasiados intentos de inicio de sesión fallidos para el mismo nombre de usuario en un período de tiempo determinado

Según tengo entendido, mod-security es adecuado para detectar estos ataques y solicitudes de bloqueo, pero los tutoriales que encontré son demasiado complejos y la sintaxis mod-security me desconcierta. ¿Podría proporcionar un conjunto de reglas de muestra para protegerse contra los ataques especificados anteriormente? En pseudo código diría algo como lo siguiente, con los números apropiados de n , m y x :

<LocationMatch /login>
  IF response_status == 403 THEN
    user = fetch_user_from_request
    IF  ++fail_count_per_IP[IP] > n  
    OR  ++fail_count_per_USER[USER] > m THEN
       block IP FOR x minutes
</LocationMatch>
    
pregunta Jakob 26.02.2013 - 16:08
fuente

1 respuesta

1

Hay un conjunto de reglas de limitación de velocidad en ModSecurity CRS que no correlaciona directamente si el intento de autenticación fue exitoso o no. A continuación una de las Reglas

SecRule IP:BRUTE_FORCE_COUNTER "@gt %{tx.brute_force_counter_threshold}" 
"phase:5,id:'981042',t:none,nolog,pass,t:none,
setvar:ip.brute_force_burst_counter=+1, 
expirevar:ip.brute_force_burst_counter=%{tx.brute_force_burst_time_slice},  
setvar:!ip.brute_force_counter"

En la regla anterior, mantenemos un BRUTE_FORCE_COUNTER contra alguna IP que se mantiene cada IP, también la puedes mantener contra Session Entonces estamos manteniendo un umbral que es el número de intentos legales mantenidos en brute_force_counter_threshold. Para cada transacción estamos aumentando el contador que es ip.brute_force_burst_counter = + 1 . Después de tx.brute_force_burst_time_slice ese es el intervalo de tiempo después del cual actualizamos el contador

    
respondido por el Ali Ahmad 26.02.2013 - 17:43
fuente

Lea otras preguntas en las etiquetas