¿Cómo limitar los intentos de Nginx Auth_Basic?

14

He protegido una carpeta web con el módulo Auth_Basic de Nginx. El problema es que podemos probar varias contraseñas hasta que funcione (ataques de fuerza bruta). ¿Hay alguna manera de limitar el número de intentos fallidos?

THpubs
fuente

Respuestas:

29

Hasta donde yo sé, el módulo Auth Basic no es compatible con esta característica, pero puede hacerlo utilizando Fail2ban .

Al probar con un usuario inexistente, verá algo como lo siguiente en el registro de errores:

2012/08/25 10:07:01 [error] 5866#0: *1 no user/password was provided for basic authentication, client: 127.0.0.1, server: localhost, request: "GET /pma HTTP/1.1", host: "localhost:81" 2012/08/25 10:07:04 [error] 5866#0: *1 user "ajfkla" was not found in "/etc/nginx/htpasswd", client: 127.0.0.1, server: localhost, request: "GET /pma HTTP/1.1", host: "localhost:81"

Luego cree el filtro necesario:

/etc/fail2ban/filter.d/nginx-auth.conf

[Definition]
failregex = no user/password was provided for basic authentication.*client: <HOST>
              user .* was not found in.*client: <HOST>
              user .* password mismatch.*client: <HOST>
ignoreregex = </host></host></host> 

/etc/fail2ban/jail.conf

[nginx-auth]
enabled = true
filter = nginx-auth
action = iptables[name=NoAuthFailures, port=80, protocol=tcp]
logpath = /var/log/nginx*/*error*.log
bantime = 3600 # 1 hour
maxretry = 3

Prueba de las reglas de Fail2Ban:

fail2ban-regex /var/log/nginx/localhost.error_log /etc/fail2ban/filter.d/nginx-auth.conf

Failregex
|- Regular expressions:
|  [1] no user/password was provided for basic authentication.*client: <HOST>
|  [2] user .* was not found in.*client: <HOST>
|  [3] user .* password mismatch.*client: <HOST>
|
`- Number of matches:
   [1] 1 match(es)
   [2] 2 match(es)
   [3] 0 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:

Summary
=======

Addresses found:
[1]
    127.0.0.1 (Sat Aug 25 10:07:01 2012)
[2]
    127.0.0.1 (Sat Aug 25 10:07:04 2012)
    127.0.0.1 (Sat Aug 25 10:07:07 2012)
[3]

PD: Dado que Fail2ban obtiene archivos de registro para prohibirlos, asegúrese de que logpathcoincidan con su configuración.

quanta
fuente
5

Me sorprende que nadie más haya dado esta solución / solución alternativa.

Nginx basic-auth y htpasswdadmite el cifrado de contraseña bcrypt con una variable de costo opcional. Bcrypt está diseñado para ser lento, lo que proporciona un límite estricto sobre qué tan rápido puede intentar diferentes contraseñas.

Al crear su nombre de usuario / contraseña de autenticación básica, use

htpasswd -B -C 12 path/to/users.db <username>

Con un costo de 12, es probable que su servidor no pueda probar las contraseñas más de unas pocas veces por segundo, aumente eso para decir 14 y probablemente mirará alrededor de 1s por intento de contraseña.

Con eso configurado, cualquier contraseña razonable será inmune al ataque de fuerza bruta, incluso si el atacante intentó contraseñas continuamente durante años.

Por ejemplo, en 10 intentos de contraseña por segundo ataque de fuerza bruta sobre una contraseña alfanumérica de 8 caracteres tomaría 692,351 años: 62**8 / (10*3600*24*365).

Esto es mucho más fácil de configurar y más infalible que configurar la limitación de solicitudes "inteligente".

SColvin
fuente
2
Esto sería útil si pudiera usar bcryptcontraseñas ed con la autenticación básica de Nginx, pero aparentemente no puede .
keune
Lo he intentado, funciona absolutamente bien para mí. Utilizándolo en producción ahora.
SColvin
No funciona en vanilla ngix en ubuntu como dijo @keune
Fabian Thommen
3
Vale la pena mencionar que esto limitará los intentos de contraseña, pero solo porque su servidor se sobrecargará de calcular costosos hashes. En un entorno de producción, esto no es probablemente lo que quieres.
Tomasz P. Szynalski
1

No creo que nginx tenga ninguna facilidad interna para hacer esto. La página de documentación no sugiere que sea posible.

Puede usar Fail2Ban para bloquear las direcciones IP que han repetido intentos fallidos de inicio de sesión.

El wiki Fail2Ban tiene algunos patrones específicos de nginx .

Fail2Ban debería estar disponible como un paquete en la mayoría de las grandes distribuciones.

cjc
fuente
0

El módulo Nginx-HTTP-Auth-Digest puede reemplazar el módulo de autenticación básico con muchas características adicionales como reintento y tiempo de espera. Documentación adicional está disponible aquí

El único inconveniente es que esto probablemente requiera la reconstrucción de nginx

intika
fuente