Wie beschränke ich Nginx Auth_Basic-Neuversuche?

14

Ich habe einen Webordner mit dem Auth_Basic-Modul von Nginx geschützt. Das Problem ist, dass wir mehrere Passwörter ausprobieren können, bis es funktioniert (Brute-Force-Angriffe). Gibt es eine Möglichkeit, die Anzahl der fehlgeschlagenen Versuche zu begrenzen?

THpubs
quelle

Antworten:

29

Soweit mir bekannt ist, unterstützt das Auth Basic- Modul diese Funktion nicht. Sie können dies jedoch mithilfe von Fail2ban tun .

Beim Testen mit einem nicht vorhandenen Benutzer wird im Fehlerprotokoll Folgendes angezeigt:

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"

Dann erstelle den nötigen Filter:

/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

Fail2Ban-Regeln testen:

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: Da Fail2ban Protokolldateien zum Sperren abruft, stellen Sie sicher, dass sie logpathmit Ihrer Konfiguration übereinstimmen.

Quanten
quelle
5

Ich bin erstaunt, dass noch niemand diese Lösung / Problemumgehung gegeben hat.

Nginx Basic-Authentifizierung und htpasswdUnterstützung der Verschlüsselung von Kennwörtern mit einer optionalen Kostenvariablen. Bcrypt ist so konzipiert, dass es langsam ist, und bietet daher eine harte Grenze dafür, wie schnell Sie verschiedene Passwörter versuchen können.

Verwenden Sie beim Erstellen Ihres Basisauthentifizierungs-Benutzernamens / Passworts

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

Bei einem Preis von 12 kann Ihr Server wahrscheinlich nur ein paar Mal pro Sekunde Passwörter testen. Erhöhen Sie diesen Wert auf 14, und Sie werden wahrscheinlich ungefähr 1 Sekunde pro Passwortversuch anzeigen.

Mit dieser Konfiguration ist jedes vernünftige Passwort immun gegen Brute-Force-Angriffe, auch wenn der Angreifer jahrelang kontinuierlich Passwörter versucht hat.

ZB bei 10 Kennwortversuchen pro Sekunde Brute - Force - Angriff auf einem 8 - stellige alphanumerisches Passwort würde 692.351 Jahre dauern: 62**8 / (10*3600*24*365).

Dies ist viel einfacher zu konfigurieren und kinderleichter als die Einrichtung einer "intelligenten" Anforderungsbegrenzung.

SColvin
quelle
2
Dies wäre nützlich, wenn Sie bcrypted-Passwörter mit der Basisauthentifizierung von Nginx verwenden könnten , aber anscheinend nicht .
Keune
Ich habe es versucht, es funktioniert absolut gut für mich. Jetzt in der Produktion einsetzen.
SColvin
Ich arbeite nicht an Vanilla Ngix auf Ubuntu, wie @keune sagte
Fabian Thommen
3
Erwähnenswert ist, dass dies die Anzahl der Kennwortversuche einschränkt, jedoch nur, weil Ihr Server durch die Verarbeitung teurer Hashes überlastet wird. In einer Produktionsumgebung ist dies wahrscheinlich nicht das, was Sie wollen.
Tomasz P. Szynalski
1

Ich glaube nicht, dass Nginx eine interne Einrichtung hat, um dies zu tun. Die Dokumentationsseite schlägt nicht vor, dass dies möglich ist.

Sie können Fail2Ban verwenden, um IP-Adressen zu blockieren, bei denen Anmeldeversuche wiederholt fehlgeschlagen sind.

Das Fail2Ban-Wiki enthält einige Nginx -spezifische Muster .

Fail2Ban sollte in den meisten großen Distributionen als Paket verfügbar sein.

cjc
quelle
0

Das Nginx-HTTP-Auth-Digest- Modul kann das grundlegende Auth-Modul durch viele zusätzliche Funktionen ersetzen. Zusätzliche Dokumentation finden Sie hier

Der einzige Nachteil ist, dass dies wahrscheinlich den Neuaufbau von Nginx erfordert

intika
quelle