Блокировка IP-адресов в HAProxy

Материал из support.qbpro.ru
  • Веб-сайт клиента в настоящее время находится под атакой, и меня вызвали, чтобы исправить это.

Огромное количество IP-адресов (легко более 5000) постоянно поражает /login по-видимому, пытаясь обмануть их.

Я изменил сайт, поэтому страница возвращает ошибку 500, но они не сдаются. Очевидно, что это не годится для реальных пользователей, которые теперь не могут войти.

Балансировка нагрузки осуществляется через HAProxy, о котором я очень мало знаю (хотя у меня намного больше, чем несколько часов назад). Я перепробовал много полезных вещей, которые нашел в Интернете, но ни одна из них не помогла, возможно, потому, что такой большой блок IP-адресов выполняет атаку.

Тогда на вопрос: как я могу отклонить IP, если он попадет /login более X раз за Y секунд?

И, подпункт - как я могу увидеть журнал отклонений, чтобы я знал, что это на самом деле работает?

Вот пример haproxy.log:

Jun  3 14:24:50 hap-server haproxy[11831]: 46.161.62.79:15290 [03/Jun/2017:14:24:49.505] www-https-test~ www-backend/www-03 
751/0/202/38/991 500 220 - - ---- 428/428/120/38/0 0/0 "GET /login HTTP/1.1"
Jun  3 14:24:50 hap-server haproxy[11831]: 46.161.63.132:47804 [03/Jun/2017:14:24:49.505] www-https-test~ www-backend/www-04 
751/0/202/38/991 500 220 - - ---- 428/428/119/42/0 0/0 "GET /login HTTP/1.1"
Jun  3 14:24:50 hap-server haproxy[11831]: 46.161.62.43:53176 [03/Jun/2017:14:24:49.505] www-https

1. Благодаря комментарию EEAA я смог решить эту проблему с помощью fail2ban.

Однако есть очень мало документации о том, как использовать fail2ban с HAProxy - настолько мало, что эта страница уже приближается к началу поиска Google по "haproxy fail2ban", поэтому я подробно опишу, как я это сделал.

Прежде всего, установите fail2ban. Если вы не можете сделать это, вы, вероятно, не должны продолжать без дополнительной помощи.

fail2ban работает, сканируя ваши журналы доступа, ища шаблон, который вы создали. Если он найдет этот шаблон X раз за Y секунд, он автоматически забанит этот IP на Z секунд.

Ваш журнал HAProxy должен быть на /var/log/haproxy.log, Если вы находитесь под большой нагрузкой, он может быть слишком большим, чтобы открываться с помощью Vim или Nano, поэтому просто посмотрите на последние несколько строк, используя tail: tail -n50 /var/log/haproxy.log

Пример "плохой" записи в моем журнале выглядел так:

Jun  3 16:48:03 hap-server haproxy[21751]: 178.159.100.29:48806 [03/Jun/2017:16:48:03.735] www-https-test~ www-backend/www-04 
172/0/2/3/177 200 339 - - ---- 36/36/0/0/0 0/0 "GET /login HTTP/1.1"

Важные биты, которые мы хотим получить от fail2ban - это IP-адрес атакующего и страница, на которую он попадает.

Чтобы сказать fail2ban, как это сделать, сначала мы хотим создать фильтр. Создать файл в папке /etc/fail2ban/filter.d, Я назвал мой applogin.conf но вы можете называть это, как вам нравится, если это заканчивается .conf,

Содержание было следующим:

[Definition]

failregex = ^.*haproxy\[[0-9]+\]: <HOST>:.* "(GET |POST )/login HTTP/1.1"$ ignoreregex = <HOST> точка в строке из вашего журнала, где появляется IP-адрес. Если вы хотите использовать то же регулярное выражение, что и я, замените /login с адресом, который атакуют на вашем сервере.

Теперь вы должны сказать fail2ban, что хотите, чтобы он искал этот фильтр. Сделать копию /etc/fail2ban/jail.conf (в случае, если вы запутались и нужно начать заново), затем откройте jail.conf и добавьте следующие строки внизу.

[app-login]
enabled  = true
bantime  = 1200
findtime = 120
maxretry = 6
filter   = applogin
logpath  = /var/log/haproxy.log
port     = http,https

Часть в квадратных скобках - это просто имя - используйте то, что вам нравится.bantime количество секунд, на которые пользователь забанен maxretry количество раз, когда пользователь может перейти на страницу в findtime секунд. Так что, в моем примере, если кто-то попытается попасть на www.mydomain.com/login более шести раз (или, может быть, ровно шесть раз, я не уверен) за 2 минуты, тогда они будут забанены на 20 минут.filter это имя файла, который вы создали в /etc/fail2ban/filter.d (но без .conf).logpath путь к файлу журнала, в котором вы хотите его найти.

Сохраните этот файл, затем перезапустите fail2ban: service fail2ban restartХвост файла журнала fail2ban: tail -f /var/log/fail2ban.log и, надеюсь, через минуту или две, вы начнете видеть что-то вроде

2017-06-03 17:04:32,040 fail2ban.actions: WARNING [app-login] Ban 146.185.200.122

Это оно! Вы в безопасности от злодеев (те, которые пытаются попасть на эту конкретную страницу, в любом случае).

Примечание. В журнале fail2ban вы также можете увидеть некоторые запреты SSH. Он автоматически создает некоторые правила для SSH, так что не паникуйте.


2. Вы можете сделать то же самое в вашей конфигурации HAProxy: вы можете использовать acl с src_http_req_rate() или даже src_http_err_rate(злоупотребление): я использовал их в некоторых примерах конфигов haproxy для смягчения DDOS здесь.

В долгосрочной перспективе: похоже, вы захотите внедрить двойной вход для этой страницы, если пользователи примут это, вы можете просто добавить дополнительный пароль htaccess со страницы входа в систему, чтобы им приходилось разделять входы (довольно сложно). взломать скриптом). Или вы можете использовать mod_security, чтобы сделать то же самое или какую-то медовую ловушку.