Как ограничить попытки входа в WordPress и защититься от брутфорса?
Автор: Eureka Studio · Обновлено
Коротко
WordPress позволяет кому угодно подбирать пароли бесконечно (брутфорс). Чтобы ограничить попытки входа, используйте плагин, который считает неудачные входы с каждого IP за определённое время и блокирует этот IP на какой-то срок: например, 8 ошибок за 5 минут означают 15 минут ожидания. Убедитесь, что неудачные попытки 2FA и паролей приложений тоже учитываются, и добавьте свой IP в белый список.
Шаги
1Шаг 1
Посмотрите, как выглядит неограниченный подбор
Без лимита WordPress отвечает на каждый неверный пароль одной и той же ошибкой — сколько бы раз его ни спрашивали, — а стандартное сообщение ещё и подтверждает, что такое имя пользователя существует.

2Шаг 2
Включите «Лимиты входа» и задайте правила
В WordPress откройте Hushfort → «Лимиты и ограничения» и включите «Включить лимиты входа». По умолчанию: 8 неудачных попыток за 5 минут, затем блокировка на 15 минут; после 4 блокировок за 24 часа блокировка длится 1 440 минут. Нажмите «Сохранить изменения».

3Шаг 3
Добавьте свой IP в белый список и проверьте источник IP
Ниже укажите «Источник IP». Вариант «Автоматически (только проверенные заголовки прокси)» подходит большинству сайтов, в том числе работающим за Cloudflare. Затем добавьте IP офиса или дома в «IP в белом списке», чтобы никогда не заблокировать самого себя, и сохраните.

4Шаг 4
Получайте письмо, когда IP блокируется
Включите «Оповещение по email» и укажите один или несколько адресов через запятую. Для этого переключателя на сайте должен работать SMTP; без него Hushfort оставляет опцию выключенной и объясняет почему.

5Шаг 5
Убедитесь, что лимит работает
После допустимого числа ошибок IP блокируется вместо того, чтобы получить ещё одну попытку. В «Истории» перечислены все активные блокировки: какое имя пользователя пробовали, сколько было попыток и когда блокировка закончится, — с кнопкой «Разблокировать».
Почему это важно
Чтобы защитить WordPress от брутфорса (перебора паролей), ограничьте число попыток входа: считайте неудачные входы с каждого IP за короткое окно и блокируйте IP на время — например, 8 ошибок за 5 минут дают блокировку на 15 минут. Неверные коды 2FA и входы по паролям приложений тоже должны засчитываться.
Атака перебором — это просто терпение: попробовать пароль, ошибиться, попробовать следующий. WordPress не возражает. На тысячу неверных догадок с одного адреса он ответит так же вежливо, как на первую. Если у учётной записи слабый или повторно используемый пароль, взлом — лишь вопрос времени.
Лимит входа меняет арифметику. Если с одного IP можно сделать лишь несколько попыток, после которых нужно ждать пятнадцать минут, подбор приличного пароля занимает годы вместо часов. Заодно ваш сервер не тратит ресурсы на то, чтобы снова и снова отрисовывать страницу входа для бота.
Чего лимит сам по себе не закрывает. Злоумышленники с тысячами IP-адресов могут отправлять по несколько догадок с каждого. Поэтому лимит входа лучше всего работает вместе с двухфакторным входом, при котором угаданный пароль бесполезен без кода.
Частые ошибки
- Учитывать только форму входа. Пароли можно подбирать и через
xmlrpc.php, и через пароли приложений REST API, и на шаге ввода двухфакторного кода. Если эти попытки не засчитываются в лимит, злоумышленники просто пойдут этим путём. Закройте и вход через XML-RPC — см. как безопасно отключить XML-RPC. - Читать не тот IP за прокси. Если сайт работает за Cloudflare, а плагин читает адрес прокси,
один бот может заблокировать всех посетителей. Если же плагин слепо доверяет заголовку
X-Forwarded-For, бот может выдумывать новый IP для каждого запроса и никогда не попадёт в счётчик. Безопасное правило: доверять заголовкам прокси, только когда запрос действительно приходит от прокси. - Слишком долгие блокировки. Блокировка на 24 часа за три опечатки наказывает ваших же сотрудников. Делайте первую блокировку короткой, а повторные — длиннее.
- Нет белого списка. Добавьте свой постоянный IP, чтобы забытый пароль никогда не закрыл вам вход.
Без плагина
В WordPress есть хук wp_login_failed, который срабатывает после каждого неудачного входа.
Можно считать ошибки с помощью transient и отказывать во входе, когда их слишком много.
Минимальный вариант для must-use плагина (wp-content/mu-plugins/login-limit.php):
<?php
add_action( 'wp_login_failed', function () {
$key = 'll_' . md5( $_SERVER['REMOTE_ADDR'] );
$n = (int) get_transient( $key );
set_transient( $key, $n + 1, 15 * MINUTE_IN_SECONDS );
} );
add_filter( 'authenticate', function ( $user ) {
$key = 'll_' . md5( $_SERVER['REMOTE_ADDR'] );
if ( (int) get_transient( $key ) >= 8 ) {
return new WP_Error( 'too_many', 'Too many failed attempts. Try again later.' );
}
return $user;
}, 30 );
Это работает, но честно признайте, чего здесь нет: код читает только REMOTE_ADDR, поэтому за
прокси считает прокси; не засчитывает догадки через XML-RPC multicall как отдельные попытки;
в нём нет белого списка, оповещений по email и журнала. Каждый из этих пунктов — ещё код,
который нужно написать и поддерживать.
Некоторые хостинги также предлагают серверные инструменты, например fail2ban, который следит за журналом доступа. Это надёжно, если хостинг настраивает его за вас; на виртуальном хостинге обычно установить его самостоятельно нельзя.
Если что-то пошло не так
- Вы заблокировали самого себя. Дождитесь окончания блокировки, попробуйте войти из другой сети, например через мобильный интернет, или попросите другого администратора добавить ваш IP в белый список.
- Блокируются все сразу. Скорее всего, сайт работает за прокси, а плагин читает IP прокси. Измените настройку источника IP.
- Блокировок не бывает вообще. Проверьте, не доверяет ли источник IP заголовку, который боты могут подделать. Если у каждой попытки разный «IP», причина в этом.
Все способы вернуть доступ собраны в статье Нет доступа после смены адреса входа.
С Hushfort
«Лимиты входа» входят в Hushfort Pro — платное дополнение к Hushfort Security, бесплатному плагину безопасности для WordPress.
Уровень «Лимиты входа» в Hushfort считает неудачные входы с каждого IP (или по паре IP и имя пользователя) в пределах выбранного вами временного окна и блокирует IP на выбранный вами срок. Повторные блокировки в течение 24 часов могут включить более долгую, расширенную блокировку.
- Неверные двухфакторные коды и неудачные входы по паролям приложений тоже засчитываются, так что обходного пути для подбора нет.
- Заголовкам прокси доверяют, только когда запрос действительно приходит от Cloudflare или из частной сети.
- Оповещения по email уходят на все указанные вами адреса.
- Каждая неудачная и заблокированная попытка попадает в «Историю» с фильтрами.
- Белый список общий для всех уровней Hushfort, так что добавить себя нужно лишь один раз.
При деактивации Hushfort все существующие блокировки снимаются.
Частые вопросы
Сколько попыток входа стоит разрешить?
Ограничивает ли WordPress попытки входа по умолчанию?
Может ли лимит входа заблокировать меня на собственном сайте?
Достаточно ли ограничить попытки входа, чтобы остановить перебор паролей?
Почему за Cloudflare блокировки попадают не на тех?
Похожие инструкции
Как добавить двухфакторную аутентификацию (2FA) в WordPress?
Как включить двухфакторную аутентификацию (2FA) в WordPress с любым приложением-аутентификатором, сохранить коды восстановления и войти без телефона.
Смотреть шагиЧто такое xmlrpc.php и как отключить XML-RPC в WordPress?
xmlrpc.php — вторая дверь для входа в WordPress, которую скрытый адрес входа не закрывает. Как отключить XML-RPC, сохранить пингбэки и проверить результат.
Смотреть шагиКак изменить адрес входа в админку WordPress (wp-admin и wp-login.php)?
Как изменить адрес входа в админку WordPress и скрыть wp-admin за пять безопасных шагов: проверка нового адреса до выхода и способ вернуться, если забыли.
Смотреть шаги
