Обмежуємо кількість спроб авторизуватися в обхід 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

Кама Wp Limit Login ver 3.5

Завантажено: 449, розмір: 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 рази. Через три спроби ви повинні побачити повідомлення про блокування.


Трохи лірики

Це не плагін 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/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

Цей приклад закриє сайт паролем всіх запитів на сайт (крім статичних файлів).

Залишити коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *