Come limitare i tentativi di Nginx Auth_Basic?


14

Ho protetto una cartella web con il modulo Auth_Basic di Nginx. Il problema è che possiamo provare diverse password finché non funziona (attacchi di forza bruta). C'è un modo per limitare il numero di tentativi falliti?

Risposte:


29

Per quanto ne so, il modulo Auth Basic non supporta questa funzione, ma è possibile farlo utilizzando Fail2ban .

Test con un utente inesistente, vedrai qualcosa come belows nel registro degli errori:

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"

Quindi creare il filtro necessario:

/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

Test delle regole 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]

PS: poiché Fail2ban recupera i file di registro da escludere, assicurati che logpathcorrispondano alla tua configurazione.


5

Sono stupito che nessun altro abbia dato questa soluzione / soluzione alternativa.

Nginx basic-auth e htpasswdsupporta la crittografia password bcrypt con una variabile di costo opzionale. Bcrypt è progettato per essere lento, fornendo in tal modo un limite massimo alla velocità con cui è possibile tentare password diverse.

Quando si crea il proprio nome utente / password di autenticazione da utilizzare

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

Con un costo di 12 il tuo server probabilmente non sarà in grado di provare le password più di alcune volte al secondo, aumentalo per dire 14 e probabilmente vedrai circa 1 secondo per tentativo di password.

Con quello configurato qualsiasi password ragionevole sarà immune all'attacco di forza bruta anche se l'attaccante ha provato le password continuamente per anni.

Ad esempio, a 10 tentativi di immissione password al secondo attacco di forza bruta su una password alfanumerica di 8 caratteri sarebbero voluti 692,351 anni: 62**8 / (10*3600*24*365).

Questo è molto più facile da configurare e più semplice rispetto all'impostazione di una limitazione "intelligente" delle richieste.


2
Ciò sarebbe utile se tu potessi usare le bcryptpassword ed con l'autent di base di Nginx, ma a quanto pare non puoi .
keune,

L'ho provato, funziona perfettamente per me. Usandolo in produzione ora.
SColvin,

Non funziona su Vanilla Ngix su Ubuntu come diceva @keune
Fabian Thommen,

3
Vale la pena ricordare che questo limiterà i tentativi di password, ma solo perché il tuo server sarà sovraccaricato dal calcolo di hash costosi. In un ambiente di produzione, questo non è probabilmente quello che vuoi.
Tomasz P. Szynalski,

1

Non credo che nginx abbia una struttura interna per farlo. La pagina della documentazione non suggerisce che sia possibile.

È possibile utilizzare Fail2Ban per bloccare gli indirizzi IP che hanno ripetuto tentativi di accesso non riusciti.

Il wiki Fail2Ban ha alcuni schemi specifici di nginx .

Fail2Ban dovrebbe essere disponibile come pacchetto sulla maggior parte delle grandi distro.


0

Il modulo Nginx-HTTP-Auth-Digest può sostituire il modulo di autenticazione di base con molte funzionalità aggiuntive come risveglio e timeout. Ulteriore documentazione è disponibile qui

L'unico aspetto negativo è che questo probabilmente richiede la ricostruzione di nginx

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.