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