Jak ograniczyć ponowne próby Nginx Auth_Basic?

14

Chroniłem folder internetowy za pomocą modułu Auth_Basic firmy Nginx. Problem polega na tym, że możemy wypróbować kilka haseł, dopóki nie zadziała (ataki siłowe). Czy istnieje sposób na ograniczenie liczby nieudanych ponownych prób?

THpubs
źródło

Odpowiedzi:

29

O ile mi wiadomo, moduł Auth Basic nie obsługuje tej funkcji, ale możesz to zrobić za pomocą Fail2ban .

Testując z nieistniejącym użytkownikiem, zobaczysz coś takiego jak poniżej w dzienniku błędów:

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"

Następnie utwórz niezbędny filtr:

/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

Testowanie reguł 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: Ponieważ Fail2ban pobiera pliki dziennika w celu zablokowania, upewnij się, że logpathpasuje do konfiguracji.

kwanty
źródło
5

Dziwi mnie, że nikt inny nie dał tego rozwiązania / obejścia.

Nginx basic-auth i htpasswdobsługuje szyfrowanie haseł bcrypt z opcjonalną zmienną kosztów. Bcrypt został zaprojektowany tak, aby działał wolno, co zapewnia twardy limit szybkości próbowania różnych haseł.

Podczas tworzenia podstawowej nazwy użytkownika / hasła autoryzacji należy użyć

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

Przy koszcie 12 Twój serwer prawdopodobnie nie będzie w stanie wypróbować haseł więcej niż kilka razy na sekundę, zwiększ to, powiedzmy 14, i prawdopodobnie będziesz patrzył na około 1 s na próbę hasła.

Po takiej konfiguracji każde rozsądne hasło będzie odporne na atak siłowy, nawet jeśli atakujący będzie próbował hasła przez wiele lat.

Np na 10 prób wprowadzenia hasła na drugim ataku brute force na 8-znakowym hasłem alfanumerycznym zajęłoby 692,351 lat: 62**8 / (10*3600*24*365).

Jest to o wiele łatwiejsze do skonfigurowania i bardziej niezawodne niż konfigurowanie „inteligentnego” ograniczania żądań.

SColvin
źródło
2
Byłoby to przydatne, gdybyś mógł używać bcrypthaseł ed z podstawowym uwierzytelnianiem Nginx, ale najwyraźniej nie możesz .
keune
Próbowałem, działa dla mnie absolutnie w porządku. Wykorzystanie go teraz w produkcji.
SColvin,
Nie działa na waniliowym ngix na Ubuntu, jak powiedział @keune
Fabian Thommen
4
Warto wspomnieć, że ograniczy to próby hasła, ale tylko dlatego, że twój serwer będzie przeciążony obliczeniami drogimi hashami. W środowisku produkcyjnym nie jest to prawdopodobnie to, czego chcesz.
Tomasz P. Szynalski
Solidny i łatwy, tak. Pozwala na ataki DoS na użycie procesora.
Rainer Rillke
1

Nie sądzę, aby nginx miał jakieś wewnętrzne możliwości, aby to zrobić. Strona dokumentacji nie sugeruje, że jest to możliwe.

Możesz użyć Fail2Ban do zablokowania adresów IP, które powtórzyły się nieudane próby logowania.

Wiki Fail2Ban ma pewne wzorce specyficzne dla Nginx .

Fail2Ban powinien być dostępny jako pakiet na większości dużych dystrybucji.

cjc
źródło
0

Moduł Nginx-HTTP-Auth-Digest może zastąpić podstawowy moduł uwierzytelniania wieloma dodatkowymi funkcjami, takimi jak ponawianie i przekroczenie limitu czasu. Dodatkowa dokumentacja jest dostępna tutaj

Jedynym minusem jest to, że prawdopodobnie wymaga to odbudowania nginx

intika
źródło