На главную сайта / Fail2ban для защиты WordPress и не только на OpenLiteSpeed (CyberPanel) от хакерских сканеров

Fail2ban для защиты WordPress и не только на OpenLiteSpeed (CyberPanel) от хакерских сканеров

Сегодня, 13:41
Как настроить Fail2ban для защиты WordPress на OpenLiteSpeed (CyberPanel) от хакерских сканеров
Современные сайты на WordPress круглосуточно подвергаются автоматизированному сканированию. Боты ищут оставленные бэкдоры, файлы конфигурации, уязвимости в REST API и пытаются эксплуатировать старые плагины. Если ваш сервер работает на связке OpenLiteSpeed + CyberPanel, стандартные фильтры Fail2ban часто оказываются бесполезными из-за специфического формата ведения логов.
В этой статье мы подробно разберем, как написать кастомный фильтр web-scan, который умеет распознавать структуру логов OpenLiteSpeed, учитывает начальные кавычки, маскировку ботов и эффективно блокирует распределенные атаки на сетевом уровне брандмауэра.



Проблема: Что ищут хакеры в ваших логах?
Типичная атака начинается с быстрого перебора системных файлов и папок. Вот как выглядит реальный фрагмент лога OpenLiteSpeed при сканировании:

"62.60.130.58 - - [07/Nov/2026:10:38:48 +0700] "GET /wp-admin/css/ HTTP/1.1" 404 711 "binance.com" "Mozilla/5.0..."
"62.60.130.58 - - [07/Nov/2026:10:38:48 +0700] "GET /.well-known/ HTTP/1.1" 404 9226 "binance.com" "Mozilla/5.0..."
"62.60.130.240 - - [06/Nov/2026:23:23:26 +0700] "GET /filefuns.php HTTP/1.1" 404 8052 "://google.com" "Mozlila/5.0..."


Анатомия этой атаки:
  1. Перебор скрытых скриптов: Бот ищет файлы filefuns.php или cache.php — это типичные имена веб-шеллов (бэкдоров), которые хакеры загружают на взломанные сайты для скрытого управления.
  2. Сканирование папок: Изучается структура каталогов (/uploads/, /wp-admin/css/, /.well-known/).
  3. Подмена заголовков (Referer Spoofing): Злоумышленник подставляет легитимные домены вроде binance.com в поле источника перехода, пытаясь обмануть базовые спам-фильтры.
  4. Кривая маскировка: Заголовки User-Agent часто подделываются вручную и содержат нелепые опечатки (например, Mozlila вместо Mozilla).
Главная техническая сложность для классического Fail2ban здесь — двойная кавычка в самом начале строки лога ("62.60...). Стандартный токен спотыкается о нее и отказывается парсить строку.

Пошаговая настройка защиты web-scan

Шаг 1. Создание кастомного фильтра
Нам нужно написать регулярное выражение, которое «съедает» начальную кавычку, выдергивает IP-адрес атакующего и сопоставляет его с паттернами известных угроз.
Создайте файл фильтра в терминале сервера:

sudo nano /etc/fail2ban/filter.d/web-scan.conf

Вставьте в него следующую конфигурацию:

[Definition]
failregex = ^"?<HOST> \- \- \[.*\] "GET .*(\.zsh_history|sftp-config\.json|babel\.config\.js|webpack\.config\.js|package\.json|composer\.json) HTTP/.*" (404|403|301)
            ^"?<HOST> \- \- \[.*\] "GET .*(filefuns\.php|cache\.php) HTTP/.*" 404
            ^"?<HOST> \- \- \[.*\] "GET .* HTTP/.*" 404 .* "Mozlila/.*"
            ^"?<HOST> \- \- \[.*\] "GET .* HTTP/.*" 404 "binance\.com"
            ^"?<HOST> \- \- \[.*\] "GET \/(wp-admin\/css|\.well-known|sites\/default|admin\/controller|uploads|files|images)[^"]*" 404
            ^"?<HOST> \- \- \[.*\] "GET \/wp-json\/(wemail|wp\/v2\/users|ultimate-member|ldlms|wp-user-manager|wc\/v3)[^"]*" (404|401)
            ^"?<HOST> \- \- \[.*\] "POST \/(api\/graphql|xmlrpc\.php)[^"]*" (404|403)
ignoreregex =


Что блокирует этот фильтр:
  • Попытки скачать файлы конфигураций проекта (package.json, composer.json, .zsh_history).
  • Поиск веб-шеллов (filefuns.php, cache.php).
  • Ботов со сломанным User-Agent (Mozlila).
  • Сканеров с поддельным реферером binance.com.
  • Массовый перебор служебных папок WordPress (/wp-admin/css/, /uploads/).
  • Агрессивное сканирование REST API (/wp-json/) на предмет уязвимостей в плагинах пользователей.
  • Попытки эксплуатации шлюза xmlrpc.php и GraphQL.
Шаг 2. Активация правила (Jail)
Теперь свяжем созданный фильтр с реальными логами ваших сайтов в CyberPanel. Откройте локальный файл конфигурации Fail2ban:

sudo nano /etc/fail2ban/jail.local


Добавьте в конец файла новую секцию:

[web-scan]
enabled = true
port = http,https
filter = web-scan
# Маска путей автоматически найдет access-логи всех ваших доменов в CyberPanel
logpath = /home/*/logs/*.access_log
findtime = 600
maxretry = 2
bantime = 172800


Параметры findtime = 600 и maxretry = 2 означают, что если бот совершит хотя бы 2 подозрительных запроса в течение 10 минут, он мгновенно отправится в бан на 48 часов (bantime = 172800).


Шаг 3. Тестирование регулярных выражений
Перед запуском службы в рабочий режим обязательно протестируйте регулярное выражение с помощью встроенного отладчика Fail2ban. Это гарантирует, что синтаксис верен:

sudo fail2ban-regex /home/yourdomain.ru/logs/yourdomain.ru.access_log /etc/fail2ban/filter.d/web-scan.conf


В результате успешного теста вы увидите итоговую таблицу с ненулевым количеством попаданий (Failregex: X total total), подтверждающую, что маска ложится на логи идеально.



Шаг 4. Перезапуск и проверка статуса
Примените конфигурацию, перезапустив демон:

sudo systemctl restart fail2ban


Чтобы посмотреть список заблокированных IP-адресов, которые брандмауэр сервера отсек на сетевом уровне, выполните команду статуса:

sudo fail2ban-client status web-scan


В строке Banned IP list отобразятся адреса всех нарушителей, которые больше не смогут нагружать ваш процессор генерацией пустых страниц.

Дополнительный уровень защиты: Закрываем XML-RPC
В логах часто можно увидеть атаки методом перебора на файл xmlrpc.php. Чтобы полностью снять нагрузку с PHP-обработчиков, этот файл лучше закрыть железно на уровне сервера. Добавьте в начало вашего файла .htaccess в корне WordPress следующие строки:
<Files xmlrpc.php>
order deny,allow
deny from all
</Files>
Заключение
Настройка связки Fail2ban и OpenLiteSpeed в CyberPanel позволяет автоматизировать защиту серверной инфраструктуры. Фильтр web-scan успешно решает проблему нестандартного форматирования логов, разгружает процессор домашнего сервера и пресекает действия ботнетов на ранних стадиях разведки.
Вернуться на сайт