Hushfort

Как ограничить попытки входа в WordPress и защититься от брутфорса?

Автор: Eureka Studio · Обновлено

Коротко

WordPress позволяет кому угодно подбирать пароли бесконечно (брутфорс). Чтобы ограничить попытки входа, используйте плагин, который считает неудачные входы с каждого IP за определённое время и блокирует этот IP на какой-то срок: например, 8 ошибок за 5 минут означают 15 минут ожидания. Убедитесь, что неудачные попытки 2FA и паролей приложений тоже учитываются, и добавьте свой IP в белый список.

Шаги

  1. 1Шаг 1

    Посмотрите, как выглядит неограниченный подбор

    Без лимита WordPress отвечает на каждый неверный пароль одной и той же ошибкой — сколько бы раз его ни спрашивали, — а стандартное сообщение ещё и подтверждает, что такое имя пользователя существует.

    В форму входа WordPress дважды введён неверный пароль; каждый раз WordPress сообщает, что пароль для demo-admin неверен, и пропускает следующую попытку
  2. 2Шаг 2

    Включите «Лимиты входа» и задайте правила

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

    Вкладка Hushfort «Лимиты и ограничения»: лимиты входа включены, допустимые неудачные попытки — 8, временное окно — 5 минут, длительность блокировки — 15 минут
  3. 3Шаг 3

    Добавьте свой IP в белый список и проверьте источник IP

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

    «Источник IP» установлен в «Автоматически (только проверенные заголовки прокси)», а 203.0.113.10 добавлен в «IP в белом списке»
  4. 4Шаг 4

    Получайте письмо, когда IP блокируется

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

    «Оповещение по email» включено, введены два адреса для оповещений, настройки сохранены
  5. 5Шаг 5

    Убедитесь, что лимит работает

    После допустимого числа ошибок IP блокируется вместо того, чтобы получить ещё одну попытку. В «Истории» перечислены все активные блокировки: какое имя пользователя пробовали, сколько было попыток и когда блокировка закончится, — с кнопкой «Разблокировать».

    Экран «История» в Hushfort: активные блокировки трёх IP-адресов с именами пользователей, которые они пробовали, по 8 попыток и 15 минут до окончания, а ниже — полная история неудачных попыток

Почему это важно

Чтобы защитить 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 все существующие блокировки снимаются.

Частые вопросы

Сколько попыток входа стоит разрешить?

Достаточно, чтобы человек мог несколько раз ошибиться, и достаточно мало, чтобы подбор потерял смысл. Спокойная золотая середина — от 5 до 10 ошибок за несколько минут с блокировкой на 15 минут.

Ограничивает ли WordPress попытки входа по умолчанию?

Нет. Ядро WordPress принимает неограниченное число неудачных входов. Некоторые хостинги добавляют лимит на уровне сервера — уточните у своего, — но полагаться на это нельзя.

Может ли лимит входа заблокировать меня на собственном сайте?

Может, если вы будете раз за разом ошибаться. Добавьте свой IP в белый список или дождитесь окончания блокировки. Другой администратор тоже может добавить ваш IP в белый список.

Достаточно ли ограничить попытки входа, чтобы остановить перебор паролей?

Это замедляет подбор до черепашьей скорости, но злоумышленники с множеством IP-адресов могут распределять попытки между ними. Сочетайте лимит с двухфакторным входом, надёжными паролями и закрытием входа через XML-RPC.

Почему за Cloudflare блокировки попадают не на тех?

За прокси каждый посетитель может выглядеть так, будто приходит с IP прокси. Настройте источник IP так, чтобы плагин доверял заголовку с реальным IP — и только тогда, когда запрос действительно приходит от этого прокси.

Сообщить об ошибке или предложить функцию

Ваше сообщение попадёт прямо к команде, которая разрабатывает Hushfort.

О чём сообщение?

Используется только для ответа вам.

Мы используем эти данные только для ответа вам. Конфиденциальность