Настройка fail2ban для wordpress и vps

настройка fail2ban

В этой статье расскажу как можно настроить блокировку атак методом перебора паролей (bruteforce) на VPS и WordPress сайты. Настройка fail2ban дело не сложное и быстрое, а пользу от него невозможно переоценить.

Кто ломает ssh или wordpress и зачем?

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

В случае с wordpress на сайт устанавливается заражающий модуль, который используя уязвимости браузера устанавливает вредоносное по на компьютеры посещающие зараженный сайт. В случае выделенного сервера атака идет как на сайты, чтобы используя уязвимости cms или вебсервера установить вредонос на сервер, так и на сам сервер по ssh, методом перебора логинов и паролей.

Отсюда первое правило — всегда используйте нестандартный логин и сложный пароль на сервере и сайтах, по возможности не используйте (или вовсе отключите) учетную запись root. Пароль на root должен быть достаточно длинным и сложным — не менее 16 символов, лучше всего сгенерированным утилитой pwgen или ее аналогом. На сайте так же не лишним будет создание нескольких учетных записей одна административная, одна для размещения контента с меньшими правами. Для предотвращения перехвата пароля используйте ssl на сайте. Как это сделать я писал здесь и здесь.

Защита на уровне IP-адреса

Но даже эти правила не защитят от того, что эти боты с упорством будут пытаться подобрать пароль. Защитится от этого вернее всего запретив доступ к ssh и административной части сайта по ip. Если у компьютера, с которого вы подключаетесь статический адрес в интернет, то никаких проблем и лишних телодвижений не нужно! Вы просто закрываете доступ к ssh с помощью iptables ограничив разрешение только вашим ip, а на административную часть доступ можно закрыть написав аналогичные правила для вебсервера в .htaccess (apache) или в location для nginx.

Пример для apache

AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName "WordPress Admin Access Control"
AuthType Basic
<LIMIT GET>
order deny,allow
deny from all
allow from xx.xx.xx.xxx
</LIMIT>

Пример для nginx

 location ^~ /admin/ {
            allow xx.xx.xx.xx;
            deny all;
            auth_basic "Hello, Admin, please login";
            auth_basic_user_file /usr/nginx/adminpassword;
            access_log   /usr/nginx/logs/admin.log  main;
        }

xx.xx.xx.xx — ваш постоянный ip-адрес.

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

Хочу обратить внимание, что правила для вебсервера, которые не ограничивают по ip, а только добавляют еще один логин и пароль не решают проблему полностью, но только усложняют жизнь администратору, которому придется вводить аж 2 пароля для доступа в админку. А если на сайт кроме вебмастера должны ходить еще и авторы или другие специалисты, то это вызовет только волну негодования. При этом перебор паролей не прекратится, нагрузка на веб сервер не снизится (или совсем незначительно снизится). Это мое личное мнение если вам есть что возразить — прошу в комментарии.

Установка fail2ban

Fail2ban — это набор скриптов, которые позволяют по логам сервера отслеживать неудачные попытки входа, атаки методом перебора и блокировать атакующие ip после нескольких неудачных попыток.

Как правило он присутствует в репозиториях всех популярных дистрибутивов. В debian\ubuntu он ставится командой:

sudo apt-get install fail2ban

Сразу после установки в debian он готов к работе. Все что вам может потребоваться сделать это включить jail для ssh. Для этого идем в /etc/fail2ban/jail.d и редактируем файл default-debina.conf. В вашем дистрибутиве эти параметры могут быть в другом конфигурационном файле например в jail.conf, который лежит уровнем выше в папке /etc/fail2ban.

[sshd]
enabled = true #включение джейла 
bantime = 3600 #время на которое будет бан

Тут надо сделать пояснение, для тех кто впервые сталкивается с этой программой. В fail2ban вся настройка распределена по 3-м связанным конфигурациям:

  1. filter — фильтр это обычно регулярное выражение или несколько регулярных выражений для поиска строк в лог файлах. Фильтр ищет совпадения в указанных лог файлах и таким образом сигнализирует об атаке;
  2. action — действие которое можно применить при обнаружении атаки. Например занести адрес в черный список (заблокировать его в iptables), отправить сообщение по электронной почте… я думаю, что можно даже написать действие по ответной атаке, но это уже для вашей фантазии 😉
  3. jail — «тюрьма», собственно связывает фильтр и действие определенными параметрами. Здесь прописывается на сколько забанить, через сколько неудачных попыток и т.п.

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

WordPress и fail2ban

Для того чтобы неудачные попытки входа в админку wordpress пресекались скриптами fail2ban необходимо установить один единственный плагин WP fail2ban. Плагин не имеет настроек и делает всего-лишь одну единственную вещь — он выводит в лог auth.log каждую попытку авторизации на сайте. Таким образом настроив фильтр и джейл можно блокировать хосты пытающиеся проникнуть на ваш сайт.

К слову фильтры идут в комплекте с плагином и вам необходимо их просто скопировать в папку filter.d из папки плагина на сервере. Выглядят они следующим образом:

# Fail2Ban filter for WordPress hard failures
#

[INCLUDES]

before = common.conf

[Definition]

_daemon = (?:wordpress|wp)

failregex = ^%(__prefix_line)sAuthentication attempt for unknown user .* from <HOST>$
 ^%(__prefix_line)sBlocked user enumeration attempt from <HOST>$
 ^%(__prefix_line)sBlocked authentication attempt for .* from <HOST>$
 ^%(__prefix_line)sPingback error .* generated from <HOST>$
 ^%(__prefix_line)sSpam comment \d+ from <HOST>$
 ^%(__prefix_line)sXML-RPC authentication attempt for unknown user .* from <HOST>$
 ^%(__prefix_line)sXML-RPC multicall authentication failure from <HOST>$

ignoreregex =

# DEV Notes:
# Requires the 'WP fail2ban' plugin:
# https://wordpress.org/plugins/wp-fail2ban/
#
# Author: Charles Lecklider

Теперь создаем файл wordpress.conf в папке /etc/fail2ban/jail.d следующего содержания:

[wordpress-hard]
enabled = true
filter = wordpress-hard
logpath = /var/log/auth.log
maxretry = 3
port = http,https
bantime = 3600

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

tail -f /var/log/fail2ban.log
2017-03-01 08:52:52,825 fail2ban.filter [25648]: INFO [wordpress-hard] Found 78.110.10.2
2017-03-01 08:53:32,786 fail2ban.filter [25648]: INFO [sshd] Found 52.14.24.93
2017-03-01 08:53:35,519 fail2ban.filter [25648]: INFO [sshd] Found 52.14.24.93
2017-03-01 08:56:19,436 fail2ban.filter [25648]: INFO [wordpress-hard] Found 14.141.71.26
2017-03-01 08:59:11,741 fail2ban.filter [25648]: INFO [wordpress-hard] Found 185.104.192.93
2017-03-01 09:00:13,419 fail2ban.filter [25648]: INFO [sshd] Found 52.14.24.93
2017-03-01 09:00:13,422 fail2ban.filter [25648]: INFO [sshd] Found 52.14.24.93
2017-03-01 09:00:15,872 fail2ban.filter [25648]: INFO [sshd] Found 52.14.24.93
2017-03-01 09:00:16,319 fail2ban.actions [25648]: NOTICE [sshd] Ban 52.14.24.93
2017-03-01 09:00:16,324 fail2ban.filter [25648]: INFO [fail2ban] Found 52.14.24.93

В чем преимущество данного метода, например перед плагином для wordpress с аналогичным функционалом. Во первых вы снижаете нагрузку на сервер, поскольку заблокированный адрес уже не сможет соединится с вебсервером, а будет заблокирован на уровне межсетевого экрана (фаервола) сервера. Во вторых — у вас будет записан адрес атакующего в логах fail2ban, а значит вы сможете легко устроить ему вечный бан если он продолжит безобразничать.

Как сделать вечный бан fail2ban

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

# Fail2Ban configuration file
#
#
# $Revision: 1 $
#

[Definition]

# Option: failregex
# Notes.: regex to match the password failures messages in the logfile. The
# host must be matched by a group named "host". The tag "<HOST>" can
# be used for standard IP/hostname matching and is only an alias for
# (?:::f{4,6}:)?(?P<host>[\w\-.^_]+)
# Values: TEXT
#
failregex = .*?fail2ban\.actions.*?Ban\s+<HOST>$

# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex = .*?fail2ban\.actions.*?\[fail2ban\]\sBan

Я взял готовый фильтр в интернете, но он у меня не работал и мне пришлось слегка подправить регулярные выражения. Сейчас он работает уже несколько месяцев и список вечного бана уже не один десяток хостов.

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

[fail2ban]

enabled = true
filter = fail2ban
action = iptables-allports[name=FAIL2BAN]
 sendmail-whois-lines[name=FAIL2BAN, dest=email@example.com, sender=fail2ban, logpath=/var/log/fail2ban.log]
logpath = /var/log/fail2ban.log
maxretry = 3
# Find-time: 1 day
#findtime = 86400
# Find-time: 3 day
findtime = 259200
# Ban-time: 1 week
#bantime = 604800
# Ban-time: 1 year
bantime = 31449600

Как вам должно быть понятно из конфигурационного файла хост блокируется полностью по всем портам, об этом отправляется сообщение на email@example.com. Параметр find-time — это период, за который учитываются неудачные попытки. В данном примере если в течение 3-х дней будут обнаружены 3 любые блокировки хоста (maxretry = 3), то он будет заблокирован на год (bantime = 31449600).

На этом настройка fail2ban на VPS закончена, однако описанными выше возможности этого демона не ограничиваются. При должной настройке он способен отбивать небольшие DDoS атаки, атаки на другие службы (ftp, vpn и т.д.) и многое другое, что можно автоматизировать получая информацию из лог-файлов. Но об этом, возможно, в другой раз.

Если вам есть, что дополнить к описанному прошу в комментарии. В продолжение: как настроить уведомление от fail2ban в telegram.

Оцените статью
Добавить комментарий

Внимание! Нажимая кнопку "Отправить комментарий" вы соглашаетесь с политикой конфиденциальности сайта.

  1. Анна

    «Jail для этого фильтра выглядит следующим образом:»

    Под каким именем создавать его?

    Ответить
    1. dkplayer автор

      Имена файлов любые, главное, чтобы расширение было .conf

      Ответить