Фильтр Fail2ban для “//xmlrpc.php” не срабатывает на блокировки.

Вопрос или проблема

Мы регулярно получаем волны запросов Apache (Ubuntu 24.04) следующего вида:

www.server.com:80 104.197.225.110 - - [27/Sep/2024:22:13:06 +0000] "POST //xmlrpc.php HTTP/1.1" 200 818 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"

И у нас есть набор правил fail2ban для этого:

[INCLUDES]

before = apache-common.conf

[Definition]
failregex = ^<HOST> -.*"(GET|POST).*(/wp-login.php|/xmlrpc.php).*$
ignoreregex =

с jail.local:

[wordpress]
enabled = true
banaction = iptables-allports
port = all
logpath = /var/log/apache2/access.log
datepattern = %%d/%%b/%%Y:%%H:%%M:%%S %%z
maxretry = 5
findtime = 300
bantime = 3600
backend = auto

Однако, если я запущу:

fail2ban-regex /var/log/apache2/access.log wordpress.conf

Я получаю:

Запуск тестов
=============

Используйте файл фильтра failregex: wordpress, базовая директория: /etc/fail2ban
Используйте шаблон даты: {^LN-BEG}: Стандартные детекторы
Используйте файл журнала: /var/log/apache2/access.log
Используйте кодировку: UTF-8

Результаты
=======

Failregex: всего 0

Ignoreregex: всего 0

Попадания по шаблону даты:

Строки: 1590015 строк, 0 проигнорировано, 0 совпало, 1590015 пропущено
[обработано за 13.46 сек]

Пропущенные строки: слишком много для отображения. Используйте --print-all-missed, чтобы напечатать все 159015 строк

Я отмечаю, что запросы типа "GET /wp-login.php HTTP/1.1" 404 действительно соответствуют.

Я пробовал различные варианты регулярного выражения, но не смог заблокировать нарушающие IP-адреса (пришлось добавлять в iptables с помощью скрипта оболочки, но это вызывает проблемы с некоторыми хостами). Какой правильный фильтр следует применить для этого?

Ответ или решение

Для того чтобы Fail2ban смог корректно обрабатывать запросы к //xmlrpc.php, вам необходимо убедиться, что регулярное выражение в фильтре настроено правильно, и что оно соответствует формату записей в вашем файле access.log Apache. Исходя из предоставленной вами информации, ваше регулярное выражение не срабатывает из-за нескольких возможных причин.

  1. Проблемы с разделением строк. Первое, что стоит проверить, это формат вашей строки журнала. Когда вы запрашиваете /var/log/apache2/access.log, убедитесь, что совпадения в журналах действительно имеют ожидаемый формат. Судя по вашему логированию, вы используете POST //xmlrpc.php, в то время как ваше регулярное выражение ожидает /wp-login.php или /xmlrpc.php. Обратите внимание на двойной слэш //.

  2. Исправление регулярного выражения. Вам нужно изменить регулярное выражение так, чтобы оно соответствовало вашему формату запроса именно с двойным слэшем. Попробуйте следующее:

[Definition]
failregex = ^<HOST> -.*"(GET|POST).*//(wp-login.php|xmlrpc.php).*$
ignoreregex =
  1. Тестирование фильтров. После внесения изменений, протестируйте ваше регулярное выражение с помощью команды:
fail2ban-regex /var/log/apache2/access.log wordpress.conf

Убедитесь, что теперь запросы к //xmlrpc.php совпадают, и Fail2ban сможет идентифицировать и заблокировать эти IP-адреса.

  1. Настройки jail.local. Убедитесь, что ваша конфигурация в jail.local работает. Проверьте наличие правильных параметров и, при необходимости, увеличьте количество maxretry для начала. Если у вас много ложных срабатываний, возможно, стоит отладить уровень findtime.

  2. Логи и включение сетевого экшена. Включите ведение журналов, чтобы увидеть, почему IP-адреса не блокируются. Возможно, стоит временно добавить дополнительный уровень логгирования в Fail2ban для диагностики.

Если после всех исправлений ваша конфигурация по-прежнему не срабатывает, проверьте конфигурации других фильтров или даже дублирующих jails, которые могут препятствовать блокировке.

Таким образом, обновив регулярные выражения и убедившись в правильности маршрутизации и их тестировании, вы должны наладить работу Fail2ban для блокировки IP-адресов, осуществляющих запросы к //xmlrpc.php.

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

Капча загружается...