Обмежуємо кількість спроб авторизуватися в обхід 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
Залийте папку з архіву _kama_wp_limit_login в корінь вашого сайту, де лежить wp-config.php .
Встановіть права 755 на папку
cache
, щоб сервер міг створювати та змінювати файли у цій папці. На деяких серверах такі права встановлені за промовчанням.Відкрийте файл wp-config.php і насамперед, після <?php , вставте такий рядок:
require __DIR__ . '/_kama_wp_limit_login/main.php';
- Готово!
Залишилось перевірити: потрібно неправильно авторизуватись 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 (як виглядає вікно залежить від браузера).
Якщо пароль введено правильно, то сервер допускає вас до файлу і далі, як звичайно, можна авторизуватися в самому 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
Цей приклад закриє сайт паролем всіх запитів на сайт (крім статичних файлів).