Мы уже рассматривали плагин Limit Login Attempts, который защищает WordPress от перебора паролей. В этой статье мы рассмотрим альтернативный подход на системном уровне с помощью популярной программы fail2ban.
Обратите внимание, что данная статья нацелена на пользователей VPS хостинга и владельцев выделенных серверов. Для установки и настройки fail2ban вам потребуется root-доступ к вашему хостинг-аккаунту и базовые навыки системного администрирования.
Fail2ban
Fail2ban — это системная утилита, которая сканирует логи на определенные записи, и имеет возможность выполнять ряд действий при их обнаружении. Самый простой пример это сканирования журнала доступа по SSH к вашему серверу, и при обнаружении 5 неудачных попыток, заблокировать доступ по IP адресу.
Установить fail2ban на большинстве Linux-систем можно с помощью менеджера пакетов aptitude, apt-get, yum и т.д. На нашем тестовом сервере Ubuntu мы сделали это следующим образом:
$ sudo apt-get install fail2ban
После установки утилиты, вы найдете все ее конфигурационные файлы в директории /etc/fail2ban
, включая директорию action.d
для действий, и директорию filter.d
для фильтров.
Фильтр в fail2ban это набор правил, по которым утилита будет искать определенные вхождения в лог-файлах. Примеры фильтров: попытка входа по SSH, попытка авторизации в Apache, попытка входа через FTP.
Действия в fail2ban запускаются тогда, когда фильтр сработал определенное количество раз. Действия тоже могут быть разными, например: блокировка IP адреса с помощью iptables, отправка оповещения на электронную почту администратору.
Основной файл который собирает все правила вместе в fail2ban называется jail.conf (тюрьма). Там прописываются фильтры и действия, максимальное количество попыток, время блокировки и многое другое. К этому файлу мы скоро вернемся.
WordPress и Fail2ban
Для того, чтобы fail2ban мог понять, что произошла неудачная попытка авторизации в WordPress, нам необходимо об этом явно сообщить со стороны самого WordPress. Сделать мы это можем с помощью простого плагина:
/** * Plugin Name: Return 403 on Failed Login */ function my_login_failed_403() { status_header( 403 ); } add_action( 'wp_login_failed', 'my_login_failed_403' );
По умолчанию WordPress использует HTTP код 200, даже при неудачных попытках авторизации, поэтому глядя на журнал доступа веб-сервера Apache или nginx, сложно сказать была ли попытка успешной. С помощью нашего простого плагина, мы используем код 403 для указания неуспешных попыток входа в WordPress.
После активации плагина убедитесь в том, что он действительно работает. Сделать это можно посмотрев на логи доступа вашего веб-сервера, например в /var/log/nginx/access.log
для nginx, или /var/log/apache2/access.log
для веб-сервера Apache.
Фильтр fail2ban для WordPress
Создайте новый фильтр в fail2ban (в директории filter.d) и назовите его wordpress-auth.conf. Данный фильтр будет выполнять поиск на 403 статус при доступе к файлам wp-login.php и xmlrpc.php в WordPress. Текст фильтра будет выглядеть следующим образом:
[Definition] failregex = <HOST>.*POST.*(wp-login\.php|xmlrpc\.php).* 403
Данные регулярное выражение подойдет для лог-файлов Apache и nginx по умолчанию. Если вы изменили формат журнала вашего веб-сервера, вам придется изменить и регулярное выражение.
Настройка jail.conf
Новый фильтр wordpress-auth.conf легко использовать в файле конфигурации jail.conf. Добавьте следующий код в конец файла:
[wordpress] enabled = true port = http,https filter = wordpress-auth logpath = /var/log/nginx/access.log maxretry = 3 bantime = 3600
Здесь мы указываем путь к лог-файлу нашего веб-сервера, максимальное количество количество неудачных попыток авторизации, и время на которые IP адрес будет заблокирован (действие по умолчанию).
После внесения изменений в конфигурацию, перезапустите сервис fail2ban и смотрите его в действии в /var/log/fail2ban.log:
$ sudo service fail2ban restart $ sudo tail -f /var/log/fail2ban.log 2014-01-22 16:10:44,818 fail2ban.actions: WARNING [wordpress] Ban 115.230.126.74 2014-01-22 17:29:16,103 fail2ban.actions: WARNING [wordpress] Ban 185.24.218.83 2014-01-22 18:53:02,819 fail2ban.actions: WARNING [wordpress] Ban 222.186.62.71 ...
Если вы решили протестировать fail2ban на себе, не забудьте установить низкое значение параметра bantime
, например 60 для блокировки доступа на одну минуту.
Учтите, что поскольку утилита fail2ban осуществляет поиск и блокировку по IP адресу, она не поможет в случае направленной атаки с большого количества разных IP-адресов. В таком случае вам необходимы другие меры защиты, например двойная аутентификация с помощью Google Authenticator. Подробности в нашей статье.
Наконец, стоит отметить, что после установки fail2ban вам уже доступны разные фильтры для отслеживания доступа по SSH, FTP и т.д. Их легко включить и настроить в файле jail.conf.