Веб-сайт клиента в настоящее время подвергается атаке, и меня вызвали, чтобы это исправить.
Огромное количество IP-адресов (легко более 5000) постоянно попадает в /login
, предположительно пытаясь ворваться внутрь.
Я изменил сайт, поэтому страница возвращает ошибку 500, но они не сдаются. Очевидно, это плохо для настоящий пользователи, которые сейчас не могут авторизоваться.
Балансировка нагрузки осуществляется через HAProxy, о котором я очень мало знаю (хотя у меня гораздо больше, чем несколько часов назад). Я пробовал много разумных вещей, которые нашел в Интернете, но, похоже, ни один из них не помог, вероятно, потому, что существует такой большой блок IP-адресов, выполняющих атаку.
Тогда к вопросу: Как я могу отклонить IP, если он попадает /login
больше, чем Икс раз в 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-test~ www-backend/www-02 751/0/202/38/991 500 220 - - ---- 428/428/118/38/0 0/0 "GET /login HTTP/1.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 при установке, так что не паникуйте.
Я рад, что вы, кажется, решили непосредственную проблему с fail2ban, и имеет смысл блокировать на уровне iptables, но вы можете сделать то же самое в своей конфигурации HAProxy: вы можете использовать acl с src_http_req_rate () или даже src_http_err_rate (Abuse): я использовал их в некоторых примерах Конфиги haproxy для защиты от DDOS здесь.
В долгосрочной перспективе: похоже, что вы можете реализовать двойной вход для этой страницы, если пользователи примут его, вы можете просто ввести дополнительный пароль htaccess со страницы входа, чтобы им нужно было разделить входы (довольно сложно взломать скриптом). Или вы можете использовать mod_security, чтобы сделать то же самое, или ловушка для меда.