Я защитил веб-папку с помощью модуля Nginx Auth_Basic. Проблема в том, что мы можем попробовать несколько паролей, пока он не сработает (атаки методом перебора). Есть ли способ ограничить количество неудачных повторных попыток?
Насколько я знаю, 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
соответствует вашей конфигурации.
Я удивлен, что никто другой не дал это решение / обходной путь.
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)
.
Это намного проще настроить и надежнее, чем настройка «интеллектуального» ограничения запросов.
Я не верю, что у nginx есть какие-либо внутренние средства для этого. В страница документации не предполагает, что это возможно.
Вы можете использовать Fail2Ban, чтобы заблокировать IP-адреса, которые повторяли неудачные попытки входа в систему.
В вики Fail2Ban есть паттерны, специфичные для nginx.
Fail2Ban должен быть доступен в виде пакета на большинстве крупных дистрибутивов.
Nginx-HTTP-Auth-Digest Модуль может заменить базовый модуль аутентификации множеством дополнительных функций, таких как повторная попытка и тайм-аут. Доступна дополнительная документация Вот
Единственным недостатком является то, что для этого, вероятно, потребуется перестройка nginx.