WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Ограничиваем количество попыток авторизоваться в обход WordPress

Сначала я заметил на своих сайтах, потом в twitter прочел несколько сообщений, что сейчас на WordPress блоги идут массовые брутфорс атаки: китайские боты пароли перебирают, посылая POST запросы на файл wp-login.php.

Проблема не в том, что сайт могут взломать, ведь есть плагины для ограничения количество попыток авторизоваться: Limit Login Attempts, а в том, что WordPress движок "тяжелый" и такие запросы создают чрезмерную нагрузку на сервер. Происходит это потому что для работы плагина нужна среда WordPress, файл wp-load.php, а при её загрузке делается много вычислений, прежде чем плагин начинает работать. Добавьте сюда по 20 запросов в секунду и вы поймете как не легко приходится серверу...

Kama WP Limit Login

Мой хостинг начал ругаться на завышенные нагрузки. Мне нужна была защита и я написал небольшой PHP скрипт, предварительно назвав его "kama_wp_limit_login". Он ограничивает попытки авторизации до 3 в течении часа. Вся прелесть в том, что код работает в обход WordPress: сначала проверяется IP и последнее время "входящего", если все ОК, то WordPress работает как обычно, если нет - работа PHP прерывается не доходя до WordPress и выводится сообщение.

Установка Kama WP Limit Login

Кama Wp Limit Login ver 3.5
Скачано: 187, размер: 2.3 KB
  1. Залейте папку из архива _kama_wp_limit_login в корень вашего сайта, туда где лежит wp-config.php.

  2. Установите права 755 на папку cache, чтобы сервер мог создавать и изменять файлы в этой папке. На некоторых серверах такие права установлены по умолчанию.

  3. Откройте файл wp-config.php и в самое начало, после <?php, вставьте такую строчку:

    require __DIR__ . '/_kama_wp_limit_login/main.php';
  4. Готово!

Осталось проверить: нужно неправильно авторизоваться 3 раза. Через 3 попытки вы должны увидеть сообщение о блокировке.

меню

Немного лирики

Это не плагин WordPress и поэтому подключается скрипт необычно.

-

Если у вас несколько сайтов на одном хосте, то можно найти родительскую директорию для всех сайтов и разместите папку _kama_wp_limit_login туда. А для каждого сайта в wp-config.php указать подобный код, вместо приведенного выше:

require __DIR__ . '/../../_kama_wp_limit_login/main.php';

где ../../ означает что папка _kama_wp_limit_login лежит на 2 директории выше, файлов wp-config.php ваших сайтов.

-

Этот скрипт можно подключить к любому сайту, не только к WordPress.

Успехов!

меню

Обновления

Версия 3.4 (12.07.2017)

  • Добавил файл .htaccess в основную папку, чтобы к ней не было внешнего доступа.

Версия 3.3 (10.03.2017)

  • Мелкие правки кода, небольшое изменение логики.
  • Теперь REQUEST_URI не добавляется в название файла по умолчанию, но это можно изменить в опциях.
  • Изменил название папки скрипта с kama_limit_login на _kama_wp_limit_login. - нужен чтобы папка как-то отличалась от остальных и была вверху. Название можно поменять (работа скрипта от него не зависит), только при этом не забудьте поменять строку вызова скрипта...

Версия 3.0 (09.03.2017) - улучшил логику, защиту от атак и убрал php заметки которые выскакивали в прошлых версиях.

Версия 1.1 (23.12.2014) - добавил папку cache в которую создаются временные файлы. До этого файлы создавались вместе с основным файлом main.php.

меню

Защита с помощью .htaccess + .htpasswd

Другой вариант защиты - это установка пароля на сервере для доступа к файлу wp-login.php.

Принцип работы заключается в том, что при заходе на страницу wp-login.php пользователю будет показано дополнительное окно авторизации, в которое нужно ввести пароль для доступа к wp-login.php (как выглядит окно зависит от браузера).

login-w

Если пароль введен верно, то сервер допускает вас к файлу и далее как обычно можно авторизоваться в самом WordPress.

Порядок действий:

Шаг 1: создаем файл .htpasswd

В корне вашего сайта создаем файл, в котором указываем логи и пароль для доступа. Можно указать несколько логинов и паролей для разных пользователей:

kama:$apr1$Q9Gnetdv$pZyL9sGbN3ynC4k2oAZaQ.
andreas:$apr1$dHjB0/..$mkTTbqwpK/0h/rz4ZeN8M0
john:$apr1$IHaD0/..$N9ne/Bqnh8.MyOtvKU56j1

Пользователей можно вписать сколько угодно. Для генератора таких строк используйте специальные сервисы, например этот.

Шаг 2: Подключаем файл .htpasswd

Открываем файл .htaccess, который должен быть рядом с только что созданным .htpasswd и добавляем в него такой код (в любое место):

<Files wp-login.php>
AuthName "Access Denied"
AuthType Basic
AuthUserFile /home/www/site.ru/.htpasswd
require valid-user
</Files>

Не забудьте поменять путь до файла к /home/www/site.ru

Готово! Теперь попробуйте авторизоваться в WordPress. И вы уведите дополнительное окно для ввода логина и пароля. Такая защита защитит вас от нагрузки на брутфорс атак.

54 коммента
Полезные 6 Все
  • Сергей

    Спасибо. Установил на локалке, для проверки, все работает. Только сообщение, после трех попыток, выходит кракозябрами.

    Ответить5.6 лет назад #
    • Kama7375

      Что-то с кодировкой. Попробуйте изменить кодировку файла.

      Ответить5.6 лет назад #
      • Галина cайт: dedavova.ru

        Спасибо за файл. У меня тоже зюки вместо кириллицы. В каком файле нужно посмотреть кодировку

        Ответить5.6 лет назад #
        • Kama7375

          kama_limit_login/main.php

          Ответить5.6 лет назад #
          • Галина cайт: dedavova.ru

            В том-то и дело, что кодировка для этого файла указана UTF-8 и тем не менее зюки.

            Ответить5.5 лет назад #
            • Доброжелатель

              потому что нужно использовать pspad, в котором нужно указать "Кодировать в UTF-8 (Без BOM)"

              Ответить5.2 лет назад #
            • Доброжелатель

              то есть Notepad++ =mosking

              Ответить5.2 лет назад #
  • Dimox

    Я с недавнего времени использую плагин, который вообще закрывает возможность доступа как к /wp-admin/, так и к wp-login.php. При обращении к этим адресам происходит настраиваемый редирект, и ссылку на доступ в админку (тоже настраиваемую) знаю только я.

    Кроме того, мой хостер самостоятельно принял определенные меры по снижению нагрузки при массовом брутфорсе, полностью ограничив "чужим" доступ к wp-login.php.

    Ответить5.6 лет назад #
    • Kama7375

      Что за плагин

      Ответить5.6 лет назад #
      • Dimox

        Stealth Login Page. Если хочешь его потестировать, то качай 3-ю версию, т.к. в последней этот функционал заменили другим.

        Ответить5.6 лет назад #
  • Сергей

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

    Ответить5.6 лет назад #
  • Otshelnik-Fm202 cайт: otshelnik-fm.ru

    Если интересно про атаки на вордпресс - то вот ссылка на массовое обсуждение и придумывание костылей http://forum.searchengines.ru/showthread.php?t=805626

    Ваш метод там не проскакивал. Думаю что задумка хорошая, но вот если многопользовательский блог? Я приводил пример там, как вышел из этой беды:

    Решение для тех у кого много пользователей пользуются авторизацией, и ваш айпи динамический.

    1. Создаете файл в корне блога (там где wp-login.php), называете его как хотите, но не так как в этой статье. Я назвал его fggtreswerr.php (вру конечно же)

    2. в него копируете весь код из wp-login.php (код придется обновить при обновлении движка в будущем)

    3. В этом файле (fggtreswerr.php) находите все упоминания wp-login.php и меняете на имя созданного файла (в моем примере fggtreswerr.php). У меня нашел 20 упоминаний. Сохраняете.

    Теперь вы можете зайти на блог через строку ввв.ваш-сайт/fggtreswerr.php

    1. Закрываем в файле .htaccess (в корне блога) доступ всем к wp-login.php. Для этого вписываем
    <filesmatch "wp-login.php">
    Order Allow,Deny
    Deny from all
    </filesmatch>

    (Не забудьте файлу .htaccess снова установить права "только чтение" (444) - это важное действие от злоумышленников.)

    и при заходе ввв.ваш-сайт/wp-login.php сервер будет отдавать 403 код.

    1. но в админке, для того чтобы выйти нам надо переписать адрес выхода. Используем экшн, вписываем его в файл functions.php своей темы:
    add_filter('login_url', 'my_custom_login_url');
    add_filter('logout_url', 'my_custom_logout_url');
    
    function my_custom_login_url($force_reauth, $redirect=null){
    $login_url = site_url('fggtreswerr.php');
    if (empty($redirect)) $redirect=home_url();
    $login_url = add_query_arg('redirect_to', urlencode( $redirect ), $login_url );
    return $login_url ;
    }
    
    function my_custom_logout_url($force_reauth, $redirect=null){
    $logout_url = wp_nonce_url(site_url('fggtreswerr.php')."?action=logout", 'log-out' );
    if (empty($redirect)) $redirect=home_url();
    $logout_url = add_query_arg('redirect_to', urlencode( $redirect )."/?loggedout=true", $logout_url );
    return $logout_url ;
    }

    обратите внимание: fggtreswerr.php в этом коде вам нужно заменить на свою новую страницу входа.

    в этом коде:

    add_filter('login_url', 'my_custom_login_url');
    add_filter('logout_url', 'my_custom_logout_url'); - необходимы для входа и выхода (если используется виджет входа вп).

    код использует wp_nonce_url для генерирования случайной строки в урл. Необходимая мера для защиты.

    $redirect=home_url(); - после выхода - редирект на главную страницу

    источник

    Плюсы:
    Теперь ваш wp-login.php закрыт для всех
    вам в .htaccess каждый раз не нужно вписывать ваш новый динамический айпи.
    Блогом продолжают пользоваться ваши многие зарегистрированные пользователи
    Файлы движка мы не трогаем
    Код в functions.php ни коем образом не грузит сайт

    Минусы:
    При обновлении движка блога вам нужно скопировать новый wp-login.php в ваш файл авторизации и выполнить пункт 3. Но это так простоsmile

    Наблюдения в процессе эксплуатации:

    Один пользователь сказал что не может посмотреть свои записи защищенные паролем (есть такая фишка у вордпресса) - они отдают ошибку 40х (точно не вспомню или 401 или 403). Но у меня нет запароленых записей - и все работает как часы.

    Понаблюдал я за этим методом на 3х своих сайтах - в логи ошибок пишет 403 ошибку - и это хорошо. Посмотрите на то, как сервер обрабатывает запросы в порядке очередности - тут видно что запрос блокируется уже на 4-й проверке. Значит этот метод меньше, чем 404-й ответ, нагружает веб сервер.
    Нагрузка на хостинг вернулась к прежним нормам, но и собственно попытки брута уменьшились - или хостер поограничивал, или интерес к 403 ответу сервера отбил желание долбить сайт.
    Плагин Limit login attempts вообще перестал фиксировать тех кто брутит сайт - в спокойные времена по 3-5 сообщений приходило. Сейчас он не отправляет мне отчеты потому как до файла авторизации никто не доходит.

    Ну и самое важное - я с динамическим айпишником захожу с фронтэнда через ajax как и раньше, для этого мне не пришлось править код той страницы входа. Всё осталось как прежде - даже не нужно вбивать тот самый новый адрес авторизации. Соответственно все авторизованные пользователи не заметили ничего.

    Ну и последнее резюме - вы то защитили свои сайты, но у вас виртуальный хостинг. На вашем сервере находятся еще сотни соседей - если они или хостер не побеспокоились о защите - 502 ошибка вам будет обеспечена. Сам такое пережил. Обидно конечно, но хоть не взломали сайты.

    1
    Ответить5.6 лет назад #
    • Otshelnik-Fm202 cайт: otshelnik-fm.ru

      Мой комментарий получился по объёму как у статьи ))

      Ответить5.6 лет назад #
    • Kama7375

      В первую очередь, спасибо за такой огромный и полезный коммент.

      но вот если многопользовательский блог

      . Должно все работать вроде.

      Если сравнивать с моим методом (рассуждаю о приведенном методе):
      минусы:

      1. При обновлении движка блога вам нужно скопировать новый wp-login.php
      1. редактирование htaccess
      2. изменение базовой структуры авторизации (фильтры и все такое). Могут возникнуть всякие баги, в том числе при обновлении (есть зависимость от WP).

      Плюсы:

      Значит этот метод меньше, чем 404-й ответ, нагружает веб сервер.
      . Но это сущая мелочь как я понимаю.
      Ответить5.6 лет назад #
  • Mikanoshi cайт: mikanoshi.name

    Для апача и нгинкса я постил конфиги с куками на сёрче, минус только один - пропустит ботов, понимающих яваскрипт, но текущий брут однозначно не из таких. В остальном - для юзеров прозрачен, отсекает коннекты ещё до php и WP, нагрузки ноль, срабатывание 100% (у меня по крайней мере, ни одной попытки брута).

    Хотя, если на блоге нет профилей, логин вообще можно заблокировать всем и всё wink
    А вот некоторые хостеры, в том числе мой на вдс, заблокировали доступ к логину глобально через конфиг в шаблоне вдс, что совсем не хорошо. Если бы логин в ВП не нужен был, его бы там и не было изначально.

    Ответить5.6 лет назад #
  • @ Vladislav cайт: skywebsource.net

    Спасибо за хорошее изложение материала. Поставили, потестили - отлично.
    Кстати, порадовало то, что мой хостер сам предупредил о массовых атаках и дал соответствующие рекомендации.

    Ответить5.5 лет назад #
  • @ Николай

    Здравствуйте.
    Решение многих проблем с безопасностью - Better WP Security. Закрывание входа в админку сайта одна из его фунцый.
    P.S Соблюдайте осторожность с ним, очень мудренный.

    Ответить5.5 лет назад #
  • ws256 cайт: 256ws.ru

    Использую для этих целей плагин User Locker

    Ответить5.5 лет назад #
  • Vadim

    Огромное спасибо!!! Я даже не ожидал, заработало сразу. Я думал повозиться придется. При том, что не на WordPress поставил, а на другой движок.
    Просто прописал инклюд в исполняющем файле авторизации, а в main.php поменял - "wp-login.php" на свой.

    Ответить5.4 лет назад #
    • Kama7375

      Ага, скрипт не зависит от движка. Я так и хотел. Рад, что помог.

      Ответить5.4 лет назад #
  • petrozavodsky777 cайт: alkoweb.ru

    хм помню было время брутили, ну надо сказать если сайту "не повезло" заиметь хотя бы тиц 10 то то брутят его постоянно, мои соображения на этот счет такие: заметил я это ещё 4 года назад впервые, проведя пару эксперементов понял что пару раз тыкнувшись в 404 ошибку боты перестают пробовать поэтому тогда сделал свой вариант плагина который недавно даже отправил в репозиторий, он просто прозрачно на сколько это возможно переносит url формы логина на mysite.com/su.php, боты не догадываются икать админуку по этому адресу и просто уходят, есть конечно минусы,в том что просто перед удалением придется плагин деактивировать сначала и с некоторыми виджетами он не совместим по идее, но для большинства блогов приемлимо.

    P.S. интересно начнут ли брутить мои админки посл того как я это здесь написал.

    Ответить5.2 лет назад #
Здравствуйте, !     Войти . Зарегистрироваться