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

Защита 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 начинается с блокировки попыток входа, а не с маскировки адреса.
2️⃣ Что даёт смена адреса входа и где её пределы
Если сменить адрес входа плагином безопасности, стандартный [wp-login.php] будет отвечать ошибкой 404, и автоматические атаки по стандартному адресу не доберутся до страницы входа. Новый адрес нужно отдельно сообщить всем, у кого есть аккаунт администратора.
Способ простой, но если забыть новый адрес, в админку не попасть — придётся отключать плагин, переименовав его папку через FTP или файловый менеджер. Если сайтом управляют несколько человек, адрес лучше записать в одном месте.
3️⃣ Ограничение попыток входа и двухфакторная аутентификация
Даже после смены адреса входа, если новый адрес утечёт, подбор паролей продолжится. В ядре WordPress нет ограничения неудачных входов: сколько ни вводи неверный пароль, снова открывается та же страница входа.
Плагин ограничения попыток входа блокирует 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, обычные посетители при просмотре страниц в этот лимит не упираются.
Плагин безопасности
Плагины безопасности WordPress: Best 5
Пять основных плагинов безопасности в сравнительной таблице.
Войти
Сброс забытого пароля администратора
Как сменить пароль в профиле и сбросить его, если забыли.
Инструменты
Генератор случайных паролей
Инструмент, который создаёт пароли из 6–30 символов: заглавные и строчные буквы, цифры и спецсимволы.
ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.