Ограничение количества попыток входа в WordPress
С недавних пор на моих сайтах и в сообщениях в Twitter стала замечаться волна атак на WordPress-блоги: боты из Китая пробуют разные пароли, отправляя POST-запросы к файлу wp-login.php
.
Содержимое:
- Kama WP Limit Login
- Установка Kama WP Limit Login
- Немного поэзии
- Защита/блокировка сайта с помощью .htaccess + .htpasswd
- Nginx
Проблема заключается не в том, что сайт может быть взломан — есть плагины, ограничивающие количество попыток входа, такие как 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
-
Клонируйте git-репозиторий в свой проект:
$ git clone [email protected]/cdn-cgi/l/email-protection:doiftrue/wp_limit_login.git
Или скачайте архив:
-
Загрузите папку из архива
wp_limit_login
в корень вашего сайта, где расположенwp-config.php
. -
Установите разрешения 755 для папки
cache
, чтобы сервер мог создавать и изменять файлы в этой папке. На некоторых серверах такие разрешения устанавливаются по умолчанию. -
Откройте файл
wp-config.php
и в самом начале, после<?php
, вставьте следующую строку:require DIR . '/wp_limit_login/main.php';
-
Готово!
Проверка
Чтобы убедиться, что все работает, нужно неправильно ввести логин три раза. После третьей попытки вы должны увидеть сообщение о блокировке.
Немного поэзии
Это не плагин 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
Этот пример защищает доступ к сайту для всех запросов (за исключением статических файлов).