Захист WordPress від брутфорс атаки [11 способів]

Що таке брутфорс-атака? Це спроби отримання несанкціонованого доступу до сайту або сервера методом перебору всіляких комбінацій з логіна і пароля. Брутфорс в дослівному перекладі означає “груба сила”.

Можливо, ви вважаєте, що брутфорс атаки вас не стосуються, тому що ваш невеликий і не дуже популярний сайт не представляє інтересу для хакерів. Змушені вам повідомити, що це давно вже не так. Будь-який ресурс у мережі є об’єктом постійних і численних атак. Метою таких атак є не сам сайт, а ресурси сервера, на яких він розташований: зламаний сайт перетворюється на майданчик для хостингу вірусів, розсилки спаму, фішингу, майнінгу криптовалют і т. д. Тому захищати адмін-панель будь-якого сайту – це необхідність. В іншому випадку рано чи пізно доступ буде зламаний.

Цього разу розповідаємо, як захистити адмін-панель WordPress від злому через брутфорс – способів дуже багато, кожен знайде для себе найбільш простий і зручний, але при цьому ефективний.

1. Складні паролі

Так-так, все так просто. Перший і головний спосіб захисту – використання надійних паролів і їх регулярна заміна. Ви повинні завжди, ЗАВЖДИ використовувати тільки складні парольні комбінації. Це відноситься до всіх користувачів адмін-панелі сайту, а не тільки до головного облікового запису адміністратора. Також не забувайте використовувати складні паролі до панелі управління хостингом, FTP, бази даних, і будь-яких інших облікових записів, які стосуються ваших сайтів.

На даний момент надійним можна вважати пароль з довжиною від 12 символів, що містить букви, цифри і спеціальні символи. Інший варіант, – якщо хочете використовувати зручний до запам’ятовування пароль, – це використовувати три або більше слова, які не взаємопов’язаних за змістом, між якими будуть будь-які спец-символи як роздільники. І третій варіант – використовуйте пароль, що складається з зрозумілих запам’ятовуються слів російською мовою, що вводяться на англійській розкладці клавіатури.

Приклади надійних паролів по кожному з описаних способів їх створення:

(?CeRo*S9&rWT^J=zPu_

Superterrestrial_nationalism-basket
Cfvsq-Kexibq-Cfqn_567

2. Змінення логіна адміністратора

Для нових установок WordPress рекомендуємо відразу вказувати неочевидний логін. Тобто не вказуйте ім’я користувача admin, administrator, webmaster, superadmin, test, testadmin та інші. Якщо у вас вже є запис із логіном admin – дуже рекомендуємо її змінити. Зробити це дуже просто в адмін-панелі. Потрібно натиснути Користувачі – Додати нового. Не забудьте дати новому користувачеві права адміністратора.

admin_wp

Після цього потрібно авторизуватися з новим логіном і видалити користувача з логіном admin.

admin_wp1

3. Обмеження доступу по IP-адресам

Якщо ваш інтернет провайдер надає статичну IP-адресу, або він рідко змінюється, або ж існує обмежений список адрес, з яких може проводитися доступ в адмін-панель WordPress, то рекомендується обмежити доступ цим самим списком адрес. Якщо керуванням займається кілька людей і адреси часто змінюються, то даний спосіб захисту не буде зручним.

Налаштування обмеження доступу по IP-адресам для Apache

Налаштувати обмеження по IP-адресою можна за допомогою файлу .htaccess, який потрібно помістити в папку wp-admin/:

<IfModule mod_authz_core.c>
<RequireAny>
Require all denied #запретить всем
Require ip 127.0.0.1 #разрешить локальные подключения
Require ip 23.45.67.89 #один адрес
Require ip 10.20.30.40 #еще один адрес
Require ip 123.123.123.0/24 #блок адресов
</RequireAny>
</IfModule>

Зазначена настройка актуальна для веб-сервера Apache 2.4+.

Налаштування обмеження доступу по IP-адресам для Nginx

Якщо на вашому сервері використовується Nginx + php-fpm, то додавати обмеження потрібно в файл конфігурації Nginx для відповідного сайту (в блоці server):

location ~* ^/(wp-admin|wp-login.php)
{
allow 23.45.67.89; #один адрес
allow 123.123.123.0/24; #блок адресов
deny all; #запрет всем остальным
}

Зверніть увагу на обов’язкові крапки з комою в кінці кожного рядка і на те, що всі дозволи (allow) повинні бути вище заборон (deny).

4. Двохетапна авторизація

Захист файлів і директорій паролем в cPanel

Можна встановити захист паролем на будь-яку директорію на сервері засобами вбудованого модуля веб-сервера. Для хостингу на базі панелі cPanel потрібно натиснути в панелі Файли – Конфіденційність каталогу.

cpanel, protect directory

На наступному екрані виберіть папку, яку ви хочете захистити (/home/username/public_html/wp-admin). При натисканні на іконку зліва відбувається відкриття каталогу, при натискання на назву каталогу – вибір.

cpanel, choose dir to protect with password

Далі вкажіть логін і пароль і включіть захист. Ви ж пам’ятаєте, що паролі повинні відповідати критеріям із пункту 1? Ну і, звичайно, не встановлюйте однакові паролі на різні форми.

setup directory protect in cpanel

В результаті цих дій в папці wp-admin буде створений файл .htaccess з такими налаштуваннями:

AuthType Basic
AuthName "Autorize"
AuthUserFile "/home/username/.htpasswds/domain.com/passwd"
require valid-user

На жаль, інтерфейс панелі управління не передбачає захист файлу wp-login.php. Тому потрібно скопіювати фрагмент вище і вставити його в основний файл .htaccess в папці вашого сайту (зазвичай це /home/username/public_html) таким чином:

<FilesMatch "wp-login.php">
AuthType Basic
AuthName "Autorize"
AuthUserFile "/home/username/.htpasswds/domain.com/passwd"
require valid-user
</FilesMatch>

Захист файлів і директорій паролем в Apache

Якщо у вас панель керування не cPanel, або взагалі немає панелі керування на сервері, то можна просто додати такі рядки, як зазначено вище. Після чого потрібно згенерувати сам файл доступу (прописаний в рядку AuthUserFile). Паролі в даний файл записуюється в зашифрованому вигляді. Для шифрування пароля можна використовувати сервіс. Отримані рядки потрібно вписати в файл паролів, який в прикладі записаний як /home/username/.htpasswds/domain.com/passwd

Вміст файлу passwd повинно виглядати приблизно так:

admin:$apr1$jO5DLVTA$/KiKawt4F52ZNnTISPC1y/
editor:$apr1$BsN/.Ddj$zSgP0RrJpvgazIS4D23Ce/

Захист файлів і директорій паролем в Nginx

І в разі використання тільки веб-сервера Nginx – додайте такі рядки в файл конфігурації для сайту (в блоці server):

location   ~* ^/(wp-admin|wp-login.php)
{
auth_basic "Unauthorized";
auth_basic_user_file "/home/username/.htpasswds/domain.com/passwd";
}

Якщо хочете комбінувати цю настройку з обмеженням доступу з пункту 3 цієї статті, то досить додати тільки два рядки, що описують авторизацію в середині блоку, обмеженого фігурними дужками. Якщо ви продублюєете блок location нижче, то в результаті буде отримана помилка під час перезапуску веб-сервера Nginx.

Для перевірки правильності конфігураційного файлу Nginx і перезавантаження веб-сервера в командному рядку потрібно виконати:

~# nginx -t
~# systemctl restart nginx

Шлях до файлу, який вище вказаний як “/home/username/.htpasswds/domain.com/passwd” може бути будь-яким. Головне, щоб користувач, від імені якого працює Nginx, мав право на його читання. Вміст даного файлу формується так само, як і при налаштуванні для веб-сервера Apache.

5. Відключення xmlrpc.php

Атаки з виконанням запитів до файлу xmlrpc.php дуже популярні, оскільки таким чином за один запит можливо перебрати десятки тисяч комбінацій різних логінів і паролів. Тому дуже важлива частина захисту адмін-панелі – це відключення або обмеження доступу до даного файлу. У WordPress протокол XML-RPC використовується для взаємодії движку з різними зовнішніми застосунками, наприклад, Jetpack. Як показує практика, в 99% сайтів файл xmlrpc.php не використовується взагалі. Якщо ви сумніваєтеся, використовується він у вас чи ні, то створіть резервну копію файлів, які ви будете змінювати перед виконанням подальших інструкцій.

Відключення xmlrpc.php за допомогою плагінів

Для відключення xmlrpc.php можна використовувати різні плагіни, яких на даний момент вже досить багато. Просто напишіть в пошуку в маркетплейсі плагінів “xmlrpc”:

Після установки не забудьте активувати плагін і включити захист у налаштуваннях обраного плагіна.

Заборона доступу до xmlrpc.php за допомогою .htaccess

Перший варіант:

<IfModule mod_alias.c>
RedirectMatch 403 (?i)/xmlrpc.php
</IfModule>

Цей спосіб буде корисний, якщо у вас в одній директорії кілька установок WordPress в різних підпапках. Досить розмістити код в головному .htaccess-файлі, який розташовується рівнем вище папок з WordPress, і всі сайти будуть захищені. Також захист регістронезалежний, тобто буде працювати в разі атаки запитами з великими літерами.

Другий варіант:

<Files xmlrpc.php>
Require all denied
Require ip 127.0.0.1 #дозволити локальні підключення
Require ip 23.45.67.89 #одна адреса
Require ip 10.20.30.40 #ще одна адреса
</Files>

Цей спосіб зручний тим, що можна закрити доступ для всіх або залишити доступ з деяких довірених адрес, якщо потрібно.

Заборона доступу до xmlrpc.php за допомогою Nginx

Якщо на вашому сервері не використовується Apache, то заборона доступу через Nginx буде виглядати так:

location /xmlrpc.php
{
allow 23.45.67.89; #одна адреса
allow 123.123.123.0/24; #блок адрес
deny all; #заборона для усіх інших
}

Відключення xmlrpc.php за допомогою користувальницької функції

Ще один варіант захисту пов’язаний із доданням користувальницької функції в файл вашої теми сайту. В кінці functions.php вашої теми додайте код:

function shapeSpace_disable_xmlrpc_multicall($methods) {
unset($methods['system.multicall']);
return $methods;
}
add_filter('xmlrpc_methods', 'shapeSpace_disable_xmlrpc_multicall');

Даний метод дозволяє не зачіпати налаштування Apache або Nginx і буде корисний, якщо у вас обмежений доступ до сервера, де розташований сайт. Але недолік в тому, що захист прив’язаний до конкретної теми і при її зміні або оновленні настройку потрібно додавати повторно.

6. Обмеження кількості спроб входу в адмін-панель

Для автоматичного блокування зловмисників можна використовувати плагін, який обмежує число невдалих спроб входу в адмін-панель WordPress. Наприклад, можна використовувати Limit Login Attempts Reloaded. Після установки і активації в налаштуваннях можна встановити ліміт спроб входу і час блокування, а також додати деякі адреси або діапазони адрес у білий або чорний список на постійній основі.

7. Використання двофакторної аутентифікації

При підключенні двухфакторної авторизації для входу в адмін-панель необхідно надати два типи даних – звичайний пароль і деякий одноразовий пароль, що генерується вашим смартфоном в застосунку Google Authenticator (Android | iOS). Підключення проводиться за допомогою плагіна, який також дозволяє використовувати застосунки Authy Authenticator  і LastPass Authenticator, крім Google Authenticator. Для початку налаштування потрібно буде зареєструватись на сайті розробника плагіна (можна зробити прямо в адмін-панелі) і далі вибрати застосунок для двухфактороной аутентифікації.

Після підключення програми не забудьте активувати захист сторінки авторизації.

8. Змінення секретних ключів для кукі

Дані ключі знаходяться в файлі конфігурації wp-config.php і виглядають так:

define('AUTH_KEY', 's0lj0b~7iR`EyyI36;A(1e,#yc|i(>YB8TER:<yBLoxx;w)KF@T{t2Gx%D++X7lj');
define('SECURE_AUTH_KEY', 'HtOFJu-|I7|&fz]8 b-)T0cT+DEmFP<yKpE0+F4]Rp>(9!F6ChL+)&k1G(Ch>L8`');
define('LOGGED_IN_KEY', '<.4=H2dN8+9pif2Zd*4N}Gra{+y TsxopbEf+&GoJ u7`:Cs]A}&L #dB&[b3k|0');
define('NONCE_KEY', 'PlRd6E.s`f&X)K%;-#`~Xni`0?(=nQl_Wl# ?AT+v,8k.1PrukCm?ax]55Q+&SH!');
define('AUTH_SALT', '0F24#]RP2h>!StYxA}Hvc[uJkqO]g`7xfLA&p{ F$7|bUfB{B<Hx 69y>zQ9gA|F');
define('SECURE_AUTH_SALT', 'S~IKi]Ok1=;EP8}u[B#s&BfGE]i*Z^JHXqc6&gJ1DJ3$W0Rs-o)@Mo|Iu:.?7A`/');
define('LOGGED_IN_SALT', '1;D~W]s&_7[XVJ]vx>HA|u=.JvcEHHTf),UZ$lN| kxIT-zdAkOi0kcq+IT]&E`!');
define('NONCE_SALT', '3vIG<DWecj+KXbA9zN8DSZsVt}CJn]|7Ol;zBFxepClZ*Y8QZ`oGtW/.?6 z=B5G');

При установці WordPress використовується деяйкий набір ключів за замовчуванням, який буде однаковим для всіх. Тому, якщо зловмисник зможе отримати хеш пароля адміністратора, то він зможе і розшифрувати його з цими стандартними ключами. Згенерувати унікальні ключі можна на спеціальній сторінці.

Кожен раз під час переходу або оновленні сторінки ключі оновлюються.

9. Додавання капчі на форму авторизації в адмін-панель

Ще один метод захисту від ботів – це включення капчі на сторінці авторизації (а також реєстрації і коментарів). Як варіант, можна використовувати плагін Captcha by BestWebSoft.

У налаштуваннях ви можете вибрати форми, на які буде встановлена капча, а також способи перевірки, набори “задачок”, які будуть показуватися. Можна вибрати як звичайний варіант з введенням символів із малюнку, так і більш складні – виконати арифметичні дії.

В результаті сторінка авторизації буде виглядати так:

10. Змінення адреси адмін-панелі

Можливо, це не найбільш простий і зручний спосіб захисту, але точно один з максимально ефективних. Змінити адресу (URL) для входу в адмін панель можна вручну, якщо ви досвідчений адміністратор, або ж за допомогою спеціальних плагінів.

Вручну процес складається з декількох етапів:

  1. Перейменуйте файл wp-login.php. Використовуйте випадкову послідовність рядкових латинських букв, цифри і тире. Наприклад: some-new-page456.php
  2. В отриманому файлі знайдіть всі згадки wp-login.php і замініть їх на нову назву.
  3.  Для коректної роботи сайту заміну необхідно виконати також в файлах: wp-activate.php, general-template.php, post-template.php, functions.php, class-wp-customize-manager.php, general-template.php , link-template.php, admin-bar.php, post.php, pluggable.php, ms-functions.php, canonical.php, functions.wp-scripts.php, wp-signup.php, my-sites.php , schema.php, ru_RU.po

Після цього адресу адмін панелі буде розташовуватися по вашій новій посиланням https://site.com/some-new-page456.php. Доступ до нового файлу було б корисно теж обмежити і захистити паролем так, як зазначено вище.

Простіше це можна зробити з використанням плагіна, наприклад, WPS Hide Login. Після встановлення плагіну в меню “Налаштування” з’явиться новий пункт WPS Hide Login.

11. Відключення виведення помилок авторизації

Під час брут-форс атаки хакеру буде корисно бачити інформацію про те, що введені дані є невірні. Повідомлення про це відображаються кожен раз при невдалій спробі входу, причому також повідомляється, що саме – логін або пароль – неправильне. Тому можливо трохи ускладнити життя хакерам: прибрати ці повідомлення.

Для цього досить додати в functions.php теми вашого сайту лише один рядок:

add_filter('login_errors',create_function('$a', "return null;"));

Редагувати файл можна будь-яким зручним вам способом, як з адмін-панелі, так і по FTP або через файловий менеджер. Рядок потрібно додати на початку файлу після відкриваючого тега (<?php ).

Це були на наш погляд найбільш дієві методи захисту сайтів на WordPress від зломів методом брут-форс атаки. Ви можете вибирати будь-який один або скомбінувати декілька. А наступного разу ми познайомимо вас з одним плагіном, який об’єднує в собі майже всі описані тут методики захисту сайту.