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?
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 logpath
pasuje do konfiguracji.
Dziwi mnie, że nikt inny nie dał tego rozwiązania / obejścia.
Nginx basic-auth i htpasswd
obsł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ń.
bcrypt
haseł ed z podstawowym uwierzytelnianiem Nginx, ale najwyraźniej nie możesz .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.
źródło
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
źródło