Как ограничить повторные попытки Nginx Auth_Basic?

14

Я защитил веб-папку с помощью модуля Nginx Auth_Basic. Проблема в том, что мы можем попробовать несколько паролей, пока он не заработает (атаки методом перебора). Есть ли способ ограничить количество неудачных попыток?

THpubs
источник

Ответы:

29

Насколько я знаю, модуль Auth Basic не поддерживает эту функцию, но вы можете сделать это с помощью Fail2ban .

Тестируя несуществующего пользователя, вы увидите что-то вроде ниже в журнале ошибок:

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"

Затем создайте необходимый фильтр:

/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:

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: Поскольку Fail2ban выбирает файлы журналов для бана, убедитесь, что они logpathсоответствуют вашей конфигурации.

кванты
источник
5

Я удивлен, что никто не дал это решение / обходной путь.

Nginx basic-auth и htpasswdподдержка шифрования пароля bcrypt с необязательной переменной стоимости. Bcrypt спроектирован так, чтобы быть медленным, тем самым обеспечивая жесткое ограничение на скорость, с которой вы можете использовать разные пароли.

При создании вашего базового аутентификации используйте имя пользователя / пароль

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

При стоимости 12 ваш сервер, скорее всего, не сможет использовать пароли чаще, чем несколько раз в секунду, увеличьте это значение до 14, и вы, вероятно, будете ожидать около 1 с за попытку пароля.

При такой настройке любой разумный пароль будет защищен от атаки методом перебора, даже если злоумышленник будет пытаться использовать пароли в течение нескольких лет.

Например , при 10 попыток ввода пароля в секунду перебором на 8 - символьный буквенно - цифровой пароль будет принимать 692,351 лет: 62**8 / (10*3600*24*365).

Это гораздо проще в настройке и более надежно, чем настройка «интеллектуального» ограничения запросов.

SColvin
источник
2
Это было бы полезно, если бы вы могли использовать bcryptпароли ed с базовой аутентификацией Nginx, но, очевидно, вы не можете .
keune
Я попробовал, у меня это работает абсолютно нормально. Используя это в производстве сейчас.
SColvin
Не работает над vanilla ngix в Ubuntu, как сказал @keune
Фабиан Томмен
4
Стоит отметить, что это ограничит попытки ввода пароля, но только потому, что ваш сервер будет перегружен из-за дорогостоящих хэшей В производственной среде это, вероятно, не то, что вы хотите.
Томаш П. Шинальски
Надежный и легкий, да. Позволяет DoS-атакам против использования процессора.
Райнер Риллке
1

Я не верю, что у nginx есть какие-то внутренние возможности для этого. Страница документации не предполагает, что это возможно.

Вы можете использовать Fail2Ban для блокировки IP-адресов, которые повторяли неудачные попытки входа в систему.

В Fail2Ban Wiki есть некоторые специфичные для nginx шаблоны .

Fail2Ban должен быть доступен в виде пакета на большинстве больших дистрибутивов.

CJC
источник
0

Модуль Nginx-HTTP-Auth-Digest может заменить основной модуль аутентификации многими дополнительными функциями, такими как повторная попытка и тайм-аут. Дополнительная документация доступна здесь

Единственным недостатком является то, что это, вероятно, потребует перестройки nginx

intika
источник