Вопрос или проблема
Мы регулярно получаем волны запросов 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. Исходя из предоставленной вами информации, ваше регулярное выражение не срабатывает из-за нескольких возможных причин.
-
Проблемы с разделением строк. Первое, что стоит проверить, это формат вашей строки журнала. Когда вы запрашиваете
/var/log/apache2/access.log
, убедитесь, что совпадения в журналах действительно имеют ожидаемый формат. Судя по вашему логированию, вы используетеPOST //xmlrpc.php
, в то время как ваше регулярное выражение ожидает/wp-login.php
или/xmlrpc.php
. Обратите внимание на двойной слэш//
. -
Исправление регулярного выражения. Вам нужно изменить регулярное выражение так, чтобы оно соответствовало вашему формату запроса именно с двойным слэшем. Попробуйте следующее:
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*//(wp-login.php|xmlrpc.php).*$
ignoreregex =
- Тестирование фильтров. После внесения изменений, протестируйте ваше регулярное выражение с помощью команды:
fail2ban-regex /var/log/apache2/access.log wordpress.conf
Убедитесь, что теперь запросы к //xmlrpc.php
совпадают, и Fail2ban сможет идентифицировать и заблокировать эти IP-адреса.
-
Настройки jail.local. Убедитесь, что ваша конфигурация в
jail.local
работает. Проверьте наличие правильных параметров и, при необходимости, увеличьте количествоmaxretry
для начала. Если у вас много ложных срабатываний, возможно, стоит отладить уровеньfindtime
. -
Логи и включение сетевого экшена. Включите ведение журналов, чтобы увидеть, почему IP-адреса не блокируются. Возможно, стоит временно добавить дополнительный уровень логгирования в Fail2ban для диагностики.
Если после всех исправлений ваша конфигурация по-прежнему не срабатывает, проверьте конфигурации других фильтров или даже дублирующих jails, которые могут препятствовать блокировке.
Таким образом, обновив регулярные выражения и убедившись в правильности маршрутизации и их тестировании, вы должны наладить работу Fail2ban для блокировки IP-адресов, осуществляющих запросы к //xmlrpc.php
.