Ограничиваем количество попыток авторизоваться в обход 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
-
Склонируйте git репозиторий в свой проект:
$ git clone git@github.com:doiftrue/wp_limit_login.git
Или скачайте этот архив:
Kama WP Limit Login v4.0Скачано: 38, размер: 0 -
Залейте папку из архива
wp_limit_login
в корень вашего сайта, туда где лежитwp-config.php
. -
Установите права 755 на папку
cache
, чтобы сервер мог создавать и изменять файлы в этой папке. На некоторых серверах такие права установлены по умолчанию. -
Откройте файл
wp-config.php
и в самое начало, после<?php
, вставьте такую строчку:require_once __DIR__ . '/wp_limit_login/zero.php';
- Готово!
Проверка
Чтобы убедится что все работает нужно неправильно авторизоваться 3 раза. Через 3 попытки вы должны увидеть сообщение о блокировке.
Немного лирики
Это не плагин WordPress и поэтому подключается скрипт необычно.
-
Если у вас несколько сайтов на одном хосте, то можно найти родительскую директорию для всех сайтов и разместите папку wp_limit_login
туда. А для каждого сайта в wp-config.php указать подобный код, вместо приведенного выше:
require dirname( __DIR__, 2 ) . '/wp_limit_login/zero.php';
где 2
означает что папка wp_limit_login
лежит на 2 директории выше, файлов wp-config.php
ваших сайтов.
Защита/блокировка сайта с помощью .htaccess + .htpasswd
Build In PostДругой вариант защиты - это установка пароля на сервере для доступа к файлу wp-login.php.
Принцип работы заключается в том, что при заходе на страницу 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
и добавляем в него такой код (в любое место):
<Files wp-login.php> AuthName "Access Denied" AuthType Basic AuthUserFile /home/www/example.com/.htpasswd require valid-user </Files>
Не забудьте поменять путь до файла к /home/www/example.com
Готово! Теперь попробуйте авторизоваться в WordPress. И вы уведите дополнительное окно для ввода логина и пароля. Такая защита защитит вас от нагрузки на брутфорс атак.
Nginx
Блокировку можно установить и на уровне Nginx. Для этого в конфиге файла домена можно использовать следующие директивы:
- auth_basic строка | off;
- auth_basic_user_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
нужно указать пароли. Формат файла такой:
# комментарий имя1:пароль1 имя2:пароль2:комментарий kama:$wet1$F4HT89kL$f0gEMNpFKZNH4VggDMYTm0
Этот пример закроет сайт паролем для всех запросов на сайт (кроме статических файлов).