Защита сайтов на WordPress с помощью Fail2Ban

Сейчас все западные СМИ кричат о «русских хакерах», как они всё взламывают и ни кому жить спокойно не дают, а мне жить мешают американские хакеры! 🙂  Мои сайты на WordPress пытаются ломать с американских IP адресов (очень серьёзно не воспринимайте мои слова, это больше шутка, понятно что это не хакеры, а взломанные компьютеры/сайты, но IP действительно из USA, как тут не подколоть 🙂 ).

Мой VDS находится под мониторингом Zabbix’а. Вчера (24/06/2017) я стал активно получать на почту сообщения о большой загрузке сервера. Первое время я игнорировал эти сообщения, т.к. подобное происходило и ранее, но быстро проходило. Кратковременные всплески нагрузки на сервер понятны и допустимы.

Но сейчас данная проблема не исчезала, Zabbix всё настойчивей информировал меня о проблеме.

Я не выдержал и зашел на Zabbix посмотреть графики загрузки.

CPU Utilization

CPU Utilization

CPU Load

CPU Load

То, что я увидел, меня немножко поразило. Идёт постоянная, 100% загрузка CPU пользовательскими процессами (первый график, синий цвет) и резко вырос CPU Load (второй график).

Начиная с 18:00, я поборол попытки взлома и загрузка процессора упала до нормального уровня.

Использовав команду top, я обнаружил, что нагрузку создает процесс httpd (Apache). Это было ожидаемо, больше на сервере ни чего нет, но я не предполагал, что мои скромные сайты, с малой посещаемостью так могут нагрузить сервер. Тут закрались сомнения…

Я полез в логи Apache, запустил Server-Status и увидел, что на одном из моих вириальных хостов, с различных американских IP, каждую секунду долбятся на страницу авторизации WordPress.

Тут приведен фрагмент только с одним IP адресом, на самом деле их больше.

С помощью команды whois я узнал кому принадлежит IP адрес атакующего (на тот момент, ещё предполагаемого атакующего, т.к. я ещё точно не знал, что он делает и какая его цель).

Как видим выше данный IP адрес принадлежит сети расположенной в США (поле Country), там есть и другая информация (например название компании кому принадлежит сеть, адрес и т.д.)

Я не особо боялся, что меня взломают. Со стороны WordPress стоят различные средства защиты от взлома (плагины Limit Attempts и Google Captcha (reCAPTCHA)). Они прекрасно защищают, но ни как не помогают снизить нагрузку на сервер когда происходит массированная атака. Атаку отбивает сам WordPress, при попытке подбора пароля (брутфорс) он блокирует IP атакующего добавляя его в чёрный список доступа к сайту, т.е. выполняет функцию схожую с Firewall, но при этом потребляет уйму ресурсов.

Нужно защищать на более низком, сетевом уровне. Я решил применить fail2ban в связке с iptables, который уже установлен и защищает SSH, а теперь пришло время защищать и Apache.

Приступим к настройке

Необходимо, что бы WordPress писал в лог файл информацию о неудачной попытке аутентификации. В дальнейшем, эту информацию будет использовать Fail2ban для добавления IP адреса злоумышленника в iptables (firewall).

Установка плагина для WordPress

Устанавливаем и активируем в WordPress плагин WP fail2ban. Он как раз и занимается тем, что пишет в лог файл сообщения о не удачных аутентификации.

В какой лог файл будет писаться сообщения зависит от настройки syslog. Плагин пишет в LOG_AUTH. В CentOS 7 сообщения пишутся в /var/log/messages.

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

Теперь стало видно, что атакующие пытаются подобрать имя пользователя (admin123) для доступа к сайту и подобрать пароль к существующему пользователю (UserLogin) на сайте.

Установка и настройка fail2ban

Если fail2ban у вас не установлен, то устанавливаем

и приступаем к настройке.

Благодаря плагину WP fail2ban, нам известны IP адреса атакующих, теперь необходимо корректно настроить фильтр для fail2ban.

В комплекте с плагином WP fail2ban идёт готовый фильтр, но он какой-то недоделанный. Он не анализирует строку с неверной аутентификацией существующего пользователя:

а это то, ради чего всё и затевалось! Слегка подредактиуем фильтр под наши задачи.

Копируем фильтр из подкаталога плагина в подкаталог фильтров fail2ban:

Добавляем в фильтр дополнительное регулярно выражение: 

Мой фильтр выглядит следующим образом:

Настраиваем конфигурационный файл fail2ban /etc/fail2ban/jail.conf

Добавляем секцию:

  • port — блокируем сразу для двух портов 80 и 443;
  • dest — email на который будут приходить отчёты о бане IP;
  • maxretry — после какого количества неудачных попыток аутентификации, будет забанен IP;
  • bantime  — на сколько секунд банить IP (в моём случае на 1 год).

Перезапускаем fail2ban:

Мониторинг работы fail2ban

Настройка закончена, теперь посмотрим, что происходит с атаками на нас.

Смотрим лог fail2ban /var/log/fail2ban.log:

Видим, что fail2ban подгрузил наш фильтр wordpress-hard, сразу увидел попытки взлома и при превышении количества попыток банит (блокирует) IP.

Смотрим какие IP уже забаненны:

Смотрим, что в iptables:

Вот они, все забаненные тут видны…

Теперь у меня тишины в логах и загрузка процессора опустилась до нормальных пределов.

Загрузка CPU после установки fail2ban

Загрузка CPU после установки fail2ban

Периодически на почту приходят сообщения о новых забаненных IP.

Статистика за неделю

За неделю заблокировано всего 25  IP адресов… но эти IP адреса очень активно ломали сайт. После их блокировки, сайт стал работать значительно быстрей, т.к. снизилась нагрузка на сервер.

The following two tabs change content below.
В профессиональной сфере занимаюсь всем, что связанно с IT. Основная специализация - VoIP и сети передачи данных. Стараюсь не заниматься Windows серверами (но иногда приходится) и 1С.

Добавить комментарий