Ограничение попыток входа в WordPress: новый метод защиты сайта

Ограничение количества попыток входа в 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

  1. Клонируйте git-репозиторий в свой проект:

    $ git clone [email protected]/cdn-cgi/l/email-protection:doiftrue/wp_limit_login.git

    Или скачайте архив:

  2. Загрузите папку из архива wp_limit_login в корень вашего сайта, где расположен wp-config.php.

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

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

    require DIR . '/wp_limit_login/main.php';

  5. Готово!

Проверка

Чтобы убедиться, что все работает, нужно неправильно ввести логин три раза. После третьей попытки вы должны увидеть сообщение о блокировке.

Немного поэзии

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

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

require dirname( DIR, 2 ) . '/wp_limit_login/main.php';

Здесь 2 означает, что папка wp_limit_login находится на два уровня выше, в файлах wp-config.php ваших сайтов.

Защита/блокировка сайта с помощью .htaccess + .htpasswd

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

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

Пример окна авторизации

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

Шаг 1: Создание файла .htpasswd

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

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

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

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

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


AuthName "Access Denied"
AuthType Basic
AuthUserFile /home/www/example.com/.htpasswd
require valid-user

Не забудьте изменить путь к файлу на /home/www/example.com.

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

Nginx

Вы также можете настроить блокировку на уровне Nginx. Для этого можно использовать следующие директивы в конфигурационном файле вашего домена:

auth_basic string | off;
auth_basic_user_file file;

Пример использования директив:

server {
    listen 443 ssl http2;
    server_name example.com;

    # другие директивы...

    location / {
        auth_basic "Restricted Access!";
        auth_basic_user_file /etc/nginx/htpasswd_example.com;

        index index.php;
        try_files $uri $uri/ /index.php?$args;
    }

    # другие директивы...
}

Теперь в файле /etc/nginx/htpasswd_example.com вам нужно указать пароли. Формат файла следующий:

# комментарий
name1:password1
name2:password2:комментарий
kama:$wet1$F4HT89kL$f0gEMNpFKZNH4VggDMYTm0

Этот пример защищает доступ к сайту для всех запросов (за исключением статических файлов).

Leave a Reply

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