Админка только по пропускам: как намертво заблокировать брутфорс WordPress через .htaccess по белому списку IP

Открываешь панель хостинга или терминал, смотришь на графики потребления ресурсов, а там процессор долбится в 100% лимита, а сервер захлебывается в пятисотых ошибках. В 9 из 10 случаев на WordPress причина банальна: ботнет нащупал стандартный адрес входа и методично перебирает связки логинов и паролей со скоростью сотни запросов в минуту.

Большинство владельцев сайтов первым делом бегут ставить плагины безопасности вроде Wordfence или Limit Login Attempts. Но здесь кроется фундаментальная архитектурная ошибка. Когда бот стучится в форму авторизации, плагин внутри CMS вынужден запустить PHP, подключиться к MySQL, подгрузить ядро WordPress со всеми хуками и только потом выдать ответ о блокировке. Если по сайту работает распределенная сеть, хостинг ляжет просто под тяжестью выполнения самого защитного скрипта.

Решать эту проблему нужно на уровень выше — веб-сервером Apache или LiteSpeed через конфигурацию файла .htaccess. Правило срубит паразитный запрос до того, как он коснется движка и создаст хоть каплю вычислительной нагрузки.

Почему под прицелом не только wp-login.php

Когда говорят о брутфорсе на WordPress, обычно имеют в виду стандартную форму входа, однако злоумышленники атакуют сразу по нескольким фронтам:

  • wp-login.php — прямая точка входа в панель управления. Именно сюда летят терабайты POST-запросов со словарями паролей.
  • xmlrpc.php — интерфейс для внешних публикаций и мобильных приложений, который часто забывают закрыть. Протокол XML-RPC позволяет передавать метод system.multicall, где в одном HTTP-пакете упакованы сразу сотни попыток авторизации. Это обходит примитивные плагины-ограничители и моментально утилизирует память сервера.
  • Папка /wp-admin/ — служебный каталог, прямой доступ к которому с незнакомых устройств должен быть запрещен по умолчанию.

Ловушка admin-ajax.php: как не сломать сайт

Типичная ошибка начинающего вебмастера — зайти в корневую папку сайта, открыть .htaccess внутри /wp-admin/ и прописать тотальный Deny from all.

Через пять минут начинают сыпаться жалобы: корзина в интернет-магазине перестала добавлять товары, фильтры зависают, а формы обратной связи крутят бесконечный прелоадер. Дело в том, что фронтенд большинства плагинов WordPress отправляет асинхронные запросы именно через файл /wp-admin/admin-ajax.php.

Если заблокировать весь каталог целиком, внешние скрипты потеряют доступ к обработчику. Поэтому ограничение настраивается точечно в корневом файле .htaccess, изолируя только исполняемые файлы входа.

Боевой конфиг: ограничение по статическому IP

Если у вас или вашей команды есть постоянный статический IP-адрес (или пул корпоративных адресов), это лучший сценарий. Мы полностью отсекаем внешнюю сеть от панели авторизации, отдавая ботам сухой код 403 Forbidden.

Для современных серверов на базе Apache 2.4 в корневой файл .htaccess добавляется следующий блок:

Apache

<FilesMatch "^(wp-login\.php)">
    Require ip 195.120.45.10
    Require ip 195.120.45.11
    Require ip 178.62.0.0/16
</FilesMatch>

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

Если хостинг работает на устаревшей версии Apache 2.2, синтаксис директив будет другим:

Apache

<Files wp-login.php>
    Order Deny,Allow
    Deny from all
    Allow from 195.120.45.10
    Allow from 195.120.45.11
</Files>

<Files xmlrpc.php>
    Order Deny,Allow
    Deny from all
</Files>

Вместо 195.120.45.10 подставляются ваши реальные белые IP. Конструкция вида 178.62.0.0/16 позволяет добавить доверенную подсеть целиком, если ваш провайдер выделяет диапазон адресов.

Решения для динамического IP

Если провайдер регулярно меняет вам IP-адрес или в админку нужно заходить из дома, коворкинга и кафе, жесткая привязка по IP быстро заблокирует вас самих. В этой ситуации есть два надежных инженерных пути:

  • Подключение через собственный VPN со статикой. Поднимите дешевый VPS за пару сотен рублей с фиксированным IP-адресом и заведите туда рабочий WireGuard или VLESS. Вы прописываете IP своего сервера в .htaccess и получаете закрытый зашифрованный туннель для доступа ко всей инфраструктуре.
  • Двойная HTTP-аутентификация (Basic Auth). Перед тем как веб-сервер вообще покажет страницу wp-login.php, браузер выбросит стандартное всплывающее окно с требованием ввести базовый логин и пароль файла .htpasswd. Автоматизированные скрипты брутфорса не умеют проходить базовую авторизацию веб-сервера и отваливаются на первой же секунде.

Контрольная проверка перед заливкой на прод

Любая опечатка или неподдерживаемая модулем директива в .htaccess моментально ломает сайт с ошибкой 500 Internal Server Error.

  • Всегда держите открытую сессию по FTP или SSH перед сохранением файла, чтобы быстро откатить правки.
  • Уточните у техподдержки хостинга точную версию Apache, чтобы не смешивать синтаксис директив Require (2.4) и Order/Allow/Deny (2.2).
  • Проверяйте доступность после настройки в режиме инкогнито и с мобильного интернета, чтобы убедиться, что сервер корректно отдает 403 ошибку посторонним, но пропускает ваши рабочие IP.
Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (Пока оценок нет)
Загрузка...
logo