Безопасность WP: защита wp-admin | смена адреса входа, ограничение входа, XML-RPC

Уведомление о партнёрских ссылках v3.1
Уведомление о партнёрских ссылках v3.2 (мобильная версия)

Защита wp-admin — это настройки, которые блокируют перебор паролей через админку и страницу входа WordPress. По журналам доступа сервера Nginx + Apache с несколькими сайтами на WordPress автоматические запросы к xmlrpc.php продолжались и после смены адреса входа, поэтому добавили ещё и ограничение частоты на уровне сервера.

1️⃣ Почему атакуют wp-admin и wp-login.php

То, что адрес админки WordPress всем известен, — слабое место, но его можно компенсировать усиленной защитой. Все сайты на WordPress используют одни и те же /wp-admin/ и [wp-login.php], а если открыть /wp-admin/ без входа, откроется страница входа [wp-login.php].

Атака — это перебор: имя пользователя и пароль раз за разом вводятся на этой странице входа. Поэтому защита wp-admin начинается с блокировки попыток входа, а не с маскировки адреса.

Два входа в WordPress
Вход через браузер
/wp-admin/
Без входа — переход на страницу входа (302)
wp-login.php
Страница входа · имя пользователя и пароль
Приложения · автоматические запросы
xmlrpc.php
Имя пользователя и пароль передаются POST-запросом без страницы входа
Минуя страницу входа
system.multicall перебирает несколько паролей за один запрос · адрес не меняется при смене адреса входа
Одна и та же проверка логина и пароля
Оба входа проверяют аккаунт одной и той же функцией аутентификации WordPress
Перебор идёт через тот из двух входов, который открыт. Смена адреса входа действует только на верхний, поэтому xmlrpc.php нужно закрыть отдельно или ограничить число запросов.

2️⃣ Что даёт смена адреса входа и где её пределы

Если сменить адрес входа плагином безопасности, стандартный [wp-login.php] будет отвечать ошибкой 404, и автоматические атаки по стандартному адресу не доберутся до страницы входа. Новый адрес нужно отдельно сообщить всем, у кого есть аккаунт администратора.

🧭 Входы в WordPress
Поясняющая схема
⬜ Без плагина
🛡️ Hide My WP
🚪 Вход
/wp-login.php · /wp-admin/Один адрес на всех WordPress
Экран входа404
/newloginНовый адрес · знают только админы
Экран входа
POST /xmlrpc.phpПроверка пароля без страницы входа
Отвечает на проверку пароляОтключено 405
Замер на тестовом сайте · запросы без входа
→
🤖 Автоматические атаки
Входы, где можно пробовать пароли по известному адресу
2
1
Нет
Без плагина пароли можно перебирать в двух местах: на одинаковом для всех сайтов WordPress [wp-login.php] и на [xmlrpc.php], который проверяет пароль без страницы входа.
После смены адреса входа [wp-login.php] и /wp-admin/ отвечают 404, но [xmlrpc.php] по-прежнему сообщает, верны ли логин и пароль.
Если отключить и XML-RPC, запросы входа к [xmlrpc.php] заканчиваются ответом, что служба XML-RPC отключена, и перебирать пароли по известному адресу уже нельзя.

Способ простой, но если забыть новый адрес, в админку не попасть — придётся отключать плагин, переименовав его папку через FTP или файловый менеджер. Если сайтом управляют несколько человек, адрес лучше записать в одном месте.

3️⃣ Ограничение попыток входа и двухфакторная аутентификация

Даже после смены адреса входа, если новый адрес утечёт, подбор паролей продолжится. В ядре WordPress нет ограничения неудачных входов: сколько ни вводи неверный пароль, снова открывается та же страница входа.

🧭 Ограничение попыток входа и двухфакторная аутентификация
Поясняющая схема
⬜ Без плагина
🛡️ Плагин безопасности
🔑 Входы с одного IP
1-яНеверный пароль
Снова страница входаОсталось 3
2-яНеверный пароль
Снова страница входаОсталось 2
3-яНеверный пароль
Снова страница входаОсталась 1
4-яНеверный пароль
Снова страница входаБлок на 20 минут
5-яЗаблокированНеверный парольЗапросы входа · XML-RPC
Снова страница входаxmlrpc.php тоже 403
Ввод пароляВерный пароль
Экран ввода кода
Authentication Code6 цифр из приложения-аутентификатора · меняются каждые 30 с
Админка
Злоумышленник знает только парольНе знает кода
Останавливается на экране кода
Замер на тестовом сайте · подряд с одного IP
→
🤖 Автоматические атаки
Можно ли перебирать пароли дальше?
Без ограничений
Блок на 4-й
Стоп на коде
Без плагина, даже если шесть раз ввести неверный пароль с одного IP, каждый раз открывается та же страница входа.
С ограничением попыток входа после каждой ошибки показывается, сколько попыток осталось, а после четвёртой ошибки этот IP не может войти 20 минут. Пока действует блок, запросы к xmlrpc.php тоже заканчиваются ответом 403.
С двухфакторной аутентификацией даже при верном пароле админка откроется только после ввода 6-значного [Authentication Code], который приложение-аутентификатор создаёт каждые 30 секунд.

Плагин ограничения попыток входа блокирует IP, превысивший лимит, на заданное время, а двухфакторная аутентификация даже при верном пароле требует ещё и код из приложения-аутентификатора на телефоне. Включая её, сохраните резервные коды на случай потери телефона.

4️⃣ Закрываем xmlrpc.php

[xmlrpc.php] — второй вход, который принимает логин и пароль без страницы входа, а методом [system.multicall] за один запрос можно проверить несколько паролей.

В журналах доступа сервера Nginx + Apache с несколькими сайтами на WordPress 13 октября с 0:00 до 9:50 было 2250 POST-запросов к [xmlrpc.php]. Они шли с 22 IP, а User-Agent выдавал себя за Jetpack и WordPress.com.

Если вы не пользуетесь мобильным приложением WordPress или Jetpack, закройте запросы к [xmlrpc.php] в конфигурации Nginx или включите отключение XML-RPC в плагине безопасности.

# внутри блока server — отклонять запросы к xmlrpc.php
location = /xmlrpc.php {
    deny all;
}

С этой настройкой все GET- и POST-запросы к [xmlrpc.php] заканчиваются ответом 403, не доходя до PHP. Отключение XML-RPC в плагине безопасности отклоняет только запросы, требующие входа, а файл продолжает отвечать, поэтому, чтобы сократить и запуски PHP, лучше закрыть его в Nginx.

5️⃣ Блокировка на сервере: доступ к админке по IP и ограничение частоты

Если вы управляете сайтом только с постоянного IP, надёжнее всего разрешить [wp-login.php] и /wp-admin/ в Nginx только для него. Для дома или офиса с часто меняющимся IP это не подходит.

Кажется, что можно закрыть весь /wp-admin/, но поиск, корзина и другие функции для посетителей часто шлют запросы в [admin-ajax.php], поэтому этот файл нужно оставить открытым.

# внутри блока server — выше location с обработкой PHP
location = /wp-login.php {
    allow 203.0.113.10;   # постоянный IP для администрирования
    deny all;
    # ниже скопируйте настройки location с обработкой PHP
}

С неразрешённого IP [wp-login.php] отвечает 403, а с разрешённого открывается страница входа. Внутрь location нужно скопировать как есть настройки обработки PHP сайта (fastcgi_pass и т. д.), иначе страница входа не заработает.

Если IP закрепить нельзя, можно ограничить частоту PHP-запросов от неавторизованных посетителей; как мы ограничили их до 30 в минуту, чтобы автоматические запросы не съедали ресурсы сервера, описано в статье Предупреждение php-fpm max_children — там это разобрано подробно.

# блок http — считать по IP только запросы без cookie входа
map $http_cookie $php_anon_key {
    default                 $binary_remote_addr;
    "~*wordpress_logged_in" "";
}
limit_req_zone $php_anon_key zone=php_anon:10m rate=30r/m;

# внутри location с обработкой PHP
limit_req zone=php_anon burst=60 nodelay;
limit_req_status 429;

Если один незалогиненный IP шлёт PHP-запросы подряд, обрабатываются первые 61, а дальше возвращается 429; запросы с cookie входа не считаются. Если кеш страниц отвечает без PHP, обычные посетители при просмотре страниц в этот лимит не упираются.

ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Докажите, что вы человек: 2   +   7   =