Блокируем xmlrpc.php wp-login.php с помощью fail2ban

WordPress по-умолчанию возвращает ответ 200 даже на неудачные попытки залогиниться/подключится к xmlrpc. Если нужно отфильтровать только неудачные попытки, то в файл functions.php требуется вставить этот код:

function my_login_failed_403() {
    status_header( 403 );
}
add_action( 'wp_login_failed', 'my_login_failed_403' );

Но я буду использовать другой подход — блокировать по коду 200, но если количество повторов будет превышать 10 в течении короткого времени.

Создайте новый фильтр в fail2ban (в директории filter.d) и назовите его wp-xmlrpc.conf. Данный фильтр будет выполнять поиск на 200 статус при доступе к файлам wp-login.php и xmlrpc.php в WordPress. Текст фильтра будет выглядеть следующим образом:

Фильтр fail2ban для WordPress

[Definition]
failregex = <HOST>.*POST.*(wp-login.php|xmlrpc.php).* 200

Данные регулярное выражение подойдет для лог-файлов Apache и nginx по умолчанию. Если вы изменили формат журнала вашего веб-сервера, вам придется изменить и регулярное выражение.

Настройка jail.local

Новый фильтр wordpress-auth.conf легко использовать в файле конфигурации jail.local. Добавьте следующий код в конец файла:

[wordpress] 
enabled = true
port = http,https
filter = wp-xmlrpc
logpath = /var/log/apache2/domains/*.log
maxretry = 10
bantime = 3600

Здесь мы указываем путь к лог-файлу нашего веб-сервера (*.log — найдет все файлы, если несколько виртуальных хостов), максимальное количество количество неудачных попыток авторизации, и время на которые IP адрес будет заблокирован (действие по умолчанию).

Ставим maxretry = 10. Если в течении определенного времени (определяется в файле jail.conf) будет 10 повторов с одного ip — он будет занесен в бан.

После внесения изменений в конфигурацию, перезапустите сервис fail2ban и смотрите его в действии в /var/log/fail2ban.log:

sudo service fail2ban restart 
sudo tail -f /var/log/fail2ban.log

Для проверки логов, которые используются для поиска регулярки, используйте команду:

fail2ban-client status wordpress