Назад | Перейти на главную страницу

Как заблокировать POST-запросы xmlrpc.php

Я заметил, что мой сервер Apache сегодня не работает, и, перейдя на панель управления хостингом, я вижу всплеск пропускной способности диска и IOPS. В то же время мой журнал полон таких строк:

108.162.215.47 - - [03/Feb/2019:06:25:01 +0100] "POST /xmlrpc.php HTTP/1.1" 403 426 "-" "python-requests/2.21.0"
108.162.215.47 - - [03/Feb/2019:06:25:02 +0100] "POST /xmlrpc.php HTTP/1.1" 403 426 "-" "python-requests/2.21.0"
108.162.215.47 - - [03/Feb/2019:06:25:04 +0100] "POST /xmlrpc.php HTTP/1.1" 403 426 "-" "python-requests/2.21.0"
172.69.33.204 - - [03/Feb/2019:06:25:04 +0100] "POST /xmlrpc.php HTTP/1.1" 403 2471 "-" "python-requests/2.21.0"

xmlrpc.php - это файл, используемый Wordpress для связи с удаленным сервером. Известно, что он является источником многих атак, и часто рекомендуется заблокировать доступ к нему (см. https://www.hostinger.com/tutorials/xmlrpc-wordpress например)

В WordPress xmlrpc.php это API, который может использоваться, например, мобильное приложение WordPress для связи с сайтом и выполнения определенных действий. Однако его плохой дизайн также позволяет злоумышленнику эффективно попытаться подобрать пароль администратора WordPress, и, если ваш сайт разрешает комментарии и / или пингбеки, способ добавить на ваш сайт спам с комментариями / пингбэками.

Если вы не используете мобильное приложение WordPress или функцию pingback, возможно, вы захотите полностью отключить xmlrpc.php.

Однако простого отключения его на уровне WordPress может быть недостаточно: поскольку спамер / злоумышленник обычно генерирует много запросов, передача их по стеку через Apache и интерпретатор PHP в реальный код WordPress может потребовать значительной нагрузки даже если WordPress просто отклонит запрос. В результате вы захотите выполнить отклонение как можно раньше.

Отказ от него в Apache - это простая операция сопоставления строк в скомпилированном, высоко оптимизированном C-коде, которая может быть очень эффективной. Выполнение отклонения на уровне WordPress включает интерпретатор PHP и, возможно, также базу данных WordPress, что делает операцию отклонения намного более затратной с точки зрения необходимой мощности процессора.

В конфигурации Apache 2.2 (или 2.4 с включенным унаследованным модулем синтаксиса управления доступом) вы можете сделать это, добавив такой блок в <VirtualHost> блок вашего сайта:

<files xmlrpc.php>
  order allow,deny
  deny from all
</files>

Используя новый синтаксис управления доступом Apache 2.4, это будет:

<files xmlrpc.php>
    Require all denied
</files>

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

Наблюдаемый вами всплеск пропускной способности диска может быть в основном связан с записью всех сообщений журнала для всех этих отклонений.

Однажды у меня была похожая проблема, а затем клиент сначала пожаловался на то, что Apache ограничивает трафик: из-за всех попыток спамера законный трафик отодвигался. Когда ограничения ресурсов Apache были скорректированы, база данных WordPress начала давать сбой из-за огромного количества запросов (она находилась в системе с довольно низкими характеристиками). Блокировка IP-адреса источника просто привела к тому, что источник переместился на другой IP-адрес и возобновил лавинную рассылку через несколько часов. Блокировка xmlrpc.php на уровне Apache это было легко исправить, и некоторое время спустя злоумышленник заметил, что их усилия были бесплодны, и прекратил попытки. Но всегда будут другие ...