Close

Як захистити сайт на WordPress? 20 рекомендацій безпеки.

WordPress – одна з найпопулярніших та найрозвинутіших систем керування веб-контентом у світі. Близько 40% усіх сайтів у мережі Інтернет побудовані саме на WordPress. Відповідно така популярність спричиняє велику кількість атак, ризиків, вразливостей. Пропоную комплексні та дієві рекомендації як захистити свій сайт на WordPress.

Зміст статті

Використовуйте HTTPS

Сайти на незахищеному HTTP-протоколі є більш вразливими, аніж сайти на HTTPS (Hypertext Transfer Protocol Secure). Для хакерів вони є ласим шматочком, адже незахищене з’єднання дає можливість проексплуатувати найрізноманітніші типи вразливостей: SQL/PHP/XSS-ін’єкції, DOS/DDOS, LFI та багато інших.

HTTPS Security protocol

Щоби перевести сайт на захищений HTTPS-протокол, необхідно встановити на сервері SSL-сертифікат. Існують платні (COMODO, DigiCert) та безкоштовні SSL-сертифікати (LetsEncrypt, CloudFlare). Перевірити коректність встановлення і налаштування SSL/TLS можна з допомогою сервісу Qualys SSL Labs.

Для зручності керування, можна також скористатися WordPress-плагіном Really Simle SSL:

Really Simple SSL

Вмикайте багатофакторну аутентифікацію

У 90% випадків наявність багатофакторної аутентифікації (2FA/MFA) стає на заваді зламу. За відсутності 2FA, зловмиснику залишається лише підібрати логін і пароль до вашого сайту.

Wordfence Security 2FA

Багатофакторна аутентифікація – це додатковий шар захисту облікового запису, який окрім пароля, передбачає ще й введення коду підтвердження, який надійде вам на електронну пошту, мобільний застосунок (Google Authentificator) або в desktop-додаток (KeepassXC).

Для інтеграції 2FA в WordPress існує чудовий плагін – Wordfence Security:

Wordfence Security – Firewall, Malware Scan, and Login Security

Щоб увімкнути двофакторну аутентифікацію на сайті, необхідно перейти в меню Wodfence Security в сайдбарі WordPress й обрати пункт Login Security, після чого з’явиться вкладка Two-Factor Authentification з відповідними налаштуваннями:

How enable 2FA in Wordfence Security

Якщо сайтом користуються інші користувачі, бажано увімкнути обов’язкову 2FA-авторизацію для усіх типів облікових записів. Це можна зробити на вкладці Settings:

Wordfence Security 2Fa settings

Забезпечте захист файлів і папок WordPress (file permissions)

Усі файли і папки WordPress повинні бути надійно захищеними, інакше постає ризик витоку та розкриття даних. Основним службовим файлом WordPress є wp-config.php  – у ньому міститься вся ключова інформація щодо конфігурації сайту та з’єднання з базою даних. Тож варто почати з нього.

Найпростіший спосіб захистити wp-config —  це просто перенести його на 1 рівень вище, за межі кореневої директорії сайту (public_html) й встановити права доступу на файл  0600, що унеможливить будь-які маніпуляції з ним.

Wp-config WordPress location

Інші файли та папки, які обов’язково рекомендується захистити:

  • .htaccess
  • license.txt
  • readme.html
  • wp-settings.php
  • /wp-includes/
  • /wp-admin/
  • /wp-content/
  • /wp-content/themes/
  • /wp-content/plugins/
  • /wp-content/uploads/

WordPress рекомендує встановити коректні права доступу для всіх директорій:

find /path/to/your/wordpress/install/ -type d -exec chmod 755 {} \;

І для файлів:

find /path/to/your/wordpress/install/ -type f -exec chmod 644 {} \;

Можна також включити автоматичне виставлення прав доступу для файлів і папок в wp-config.php, додавши такі рядки:

define(‘FS_CHMOD_FILE’, 0644);
define(‘FS_CHMOD_DIR’, 0755);

Примітка: для критично важливих файлів налаштуйте права 640, 600 або 440. Розібратися з їх значеннями можна в онлафн-сервісі CHMOD-CALCULATOR.

Захистіть сторінку входу в адмін-панель WordPress

По замовчуванню, доступ в адмін-панель WordPress здійснюється за URL-адресою domain.com/wp-admin, яка є публічнодоступною і переспрямовує користувача на сторінку з формою входу domain.com/wp-login.php.

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

WordPress login attempts

Існує кілька способів, як вирішити цю проблему. Найпростіший – змінити URL-адресу сторінки входу в адмінку WordPress можна з допомогою плагіна WPS Hide Login:

WPS Hide Login

WPS Hide Login

Окрім того можна додатково обмежити кількість невдалих спроб входу в адмінку WordPress. Відповідні налаштування містить плагін Wordfence Security – вкладка Brute Force Protection у розділі All options:

Wordfence Brute Force Protection

Існує також окремий плагін для обмеження спроб входу – Limit Login Attempts Reloaded:

Limit Login Attempts Reloaded

Ще один дієвий спосіб як захистити адмінку WordPress без жодних плагінів (рекомендую) – це обмежити доступ до domain.com/wp-admin з допомогою фільтрації по IP або ж створити додаткову преавторизацію (HTTP Auth Login) до сторінки входу з допомогою методу htapsswd:

HTTP Auth login WordPress

Змініть ім’я користувача по замовчуванню та підберіть складний пароль

Ім’я користувача (username) WordPress за замовчуванням, наприклад “admin”, дуже легко визначити, а далі спробувати підібрати пароль до нього. Тому при створенні облікових записів дотримуйтесь складних нестандартних імен та багатозначних паролів (до 20-ти і більше символів), які містять літери верхнього та нижнього регістру, цифти та спеціальні знаки.

На жаль, ім’я вже існуючого облікового запису в WordPress неможливо змінити. Але можна створити нового користувача, вилучити старого і зв’язати усі його записи та права з новим користувачем:

Обмежте доступ до логів WordPress

Логи WordPress зберігаються в файлі debug.log, який знаходиться в директорії /wp-content. Часто він є публічнодоступним й зловмисник може скачати та переглянути його, дізнатися кореневу директорію сайту, розташування службових папок, тем і плагінів, отримати інформацію про критичні помилки і проблеми та проексплуатувати їх.

Debug.log in WordPress

Тому доступ до debug.log необхідно обмежити, виставивши права читання і перегляду лише для Адміністратора — 0660. Додатково можна перемістити його в іншу директорію.

Забороніть відкритий лістинг директорій

Відкритий лістинг директорій (Directory listing, CWE-548) — це вразливість, яка дає можливість переглядати папки вашого сайту публічно через інтернет.

Зловмисник може дослідити структуру сайту, ідентифікувати компоненти: теми, плагіни, стилі, скрипти. Може дізнатися розташування службових файлів, наприклад логів, дампів, файлів конфігурації. Усе це допоможе йому спланувати атаку.

Directory Listing Vulnerability in WordPress

Відключити лістинг директорій просто  –  достатньо у файлі .htaccess прописати директиву Options All -Indexes

Обмежте доступ до xmlrpc.php

XMLRPC — це протокол віддаленого доступу до CMS WordPress. Через нього деякі плагіни, такі як Jetpack, можуть дистанційно обмінюватися інформацією з вашим сайтом. На жаль, цим протоколом часто зловживають зловмисники, наприклад можуть провести DDOS або SSRF-атаку.

Рекомендується або повністю відключити XMLRPC або обмежити доступ до нього.

Плагін, який дозволить це зробити:

Disable XML-RPC-API

Обмежте доступ до wp-cron.php

WP-CRON — це вбудований планувальник WordPress, який дозволяє здійснювати публікацію записів за розкладом. По-замовчуванню, файл wp-cron.php є загальнодоступним й може також стати мішенню DDOS. Окрім того він споживає системні ресурси і на слабких серверах сповільнює WordPress. Я рекомендую відключити його і натомість активувати серверний планувальник Crontab.

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

define( 'DISABLE_WP_CRON', true );

Після цього підключитися до сервера по SSH і виконати команду:

crontab -e

Відкриється редактор серверного планувальника. Необхідно додати команду, яка запускатиме планувальник wp-cron за розкладом (наприклад, кожних 5 хвилин):

*/5 * * * * wget -qO- https://domain.com/wp-cron.php &> /dev/null

Для власників веб-серверів LiteSpeed/OpenLiteSpeed можна у цілях безпеки перекрити будь-які зовнішні запити до wp-cron.php. Для цього необхідно перейти в меню Server Configuration > General й увімкнути опцію Use Client IP in Header, а потім для Virtual Host (домену) прописати окремі правила в Rewrite Rules (вказавши IP-адресу вашого сервера):

RewriteCond %{REMOTE_ADDR} !^XXX\.XXX\.XXX\.XXX
RewriteCond %{REQUEST_URI} xmlrpc.php|wp-cron.php [NC]
RewriteRule .* - [F,L]

Обмежте доступ до REST API

REST API — це технологія, яка дозволяє різним плагінам, додаткам, обліковим записам віддалено взаємодіяти з WordPress. Цю технологію використовують деякі компоненти для синхронізації і оновлення контенту.

Інформація в REST API передається у форматі JSON. Якщо доступ до REST API не обмежено, кожен бажаючий може відкрити URL-посилання, наприклад https://domain.com/wp-json/wp/v2/users і провести атаку енумерації користувачів.

Подібним чином можна розкрити ID публікацій (https://domain.com/wp-json/wp/v2/posts), категорій (https://domain.com/wp-json/wp/v2/categories), тегів (https://domain.com/wp-json/wp/v2/tags), коментарів (https://domain.com/wp-json/wp/v2/comments) та інший службовий контент.

У 2017 році в WordPress була зафіксована серйозна вразливість, яка дозволяла через підключені по REST API плагіни провести екскалацію привілеїв і зламати більше 2 млн. сайтів.

Отже, у цілях безпеки рекомендується обмежити доступ по REST API для неавторизованих відвідувачів і HTTP-клієнтів. Існують вже готові плагіни, які реалізують це, наприклад Disable REST API:

Disable REST API

Вимкніть вбудований редактор коду WordPress

У CMS WordPress Адміністратор може редагувати вихідний код файлів, теми та плагіни відразу в адмін-панелі з допомогою вбудованого редактора коду:

Однак це створює додаткові ризики безпеки. Рекомендується працювати з файлами сайту лише через захищені протоколи sFTP або SSH.

Вимкнути вбудований редактор коду WordPress можна додавши в wp-config.php рядок:

// Disable WordPress file editor
define( 'DISALLOW_FILE_EDIT', true );

Обмежте інформацію у robots.txt

Robots.txt — це службовий файл, який встановлює правила індексації сайту для пошукових ботів. З його допомогою можна заборонити пошуковим системам індексувати ті чи інші сторінки сайту. 

Часто Адміністратори намагаються через robots.txt приховати якомога більше службових директорій та конфіденційних файлів сайту. Таким чином вони полегшують роботу зловмисникам і видають список прихованих ресурсів, які ті використовують як ціль для своїх атак:

Приклад як не треба наповнювати robots.txt

Отже, robots.txt варто створювати якомога лаконічнішим. Для блокування індексації тих чи інших веб-сторінок рекомендується застосовувати тег <meta name =”robots” content=”noindex, nofollow”>, а також серверні права доступу на файли і папки (chmod, chown). Таким чином, якщо пошуковий бот або відвідувач полізуть туди куди не треба, від сервера надійде код 403 – “Відмова у доступі”.

Застосовуйте Captcha

Captcha (Completely Automated Public Turing Test)— це автоматична система перевірки та захисту електронних ресурсів від ботів та спаму. Технологія перевіряє цифровий слід відвідувача: IP-адресу, країну, User-Agent та інші параметри. Якщо виявить підозру, попросить підтвердити, що ви не бот, інакше обмежить доступ.

Captcha WordPress

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

Відсутність капчі, дає можливість атакуючому провести ін’єкцію шкідливого коду, підмінити або перехопити дані, завантажити шелл:

Увімкнути капчу на WordPress-сайті можна з допомогою сервісу Google reCaptcha та плагіну Wordfence Security, або будь-якого іншого що підтримує reCAPTCHA v2/v3:

Інтеграція системи Captcha на сайті WordPress з допомогою плагіну Wordfence Security

Окрім Google reCaptcha, існують альтернативні системи:

Приховуйте версію WordPress та компонентів у коді сайту

WordPress у вихідному коді сайту розкриває чимало важливих характеристик, наприклад версію ядра та компонентів сайту (CSS/JS файли). Цього варто уникати, адже знаючи технічні деталі, зловмисник зможе написати експлойт та спланувати хід атаки.

Приховати версію WordPress найпростіше з допомогою плагінів безпеки Wordfence Security та Sucuri Security:

Можна також вручну дописати код в службовий файл WordPress functions.php:

function remove_version_info() { return ''; } add_filter('the_generator', 'remove_version_info');

Або цей код (використовується інший метод):

// remove version from head
remove_action('wp_head', 'wp_generator');

// remove version from rss
add_filter('the_generator', '__return_empty_string');

// remove version from scripts and styles
function collectiveray_remove_version_scripts_styles($src) {
	if (strpos($src, 'ver=')) {
		$src = remove_query_arg('ver', $src);
	}
	return $src;
}
add_filter('style_loader_src', 'collectiveray_remove_version_scripts_styles', 9999);
add_filter('script_loader_src', 'collectiveray_remove_version_scripts_styles', 9999);

Фільтруйте трафік і вхідні запити

Зловмисники намагатимуться просканувати ваш сайт, перебираючи різні комбінації URL-адрес (фаззінг), відправляючи GET (отримання) та POST (відправка) запити, підмішуючи до них різноманітні нелогічні і динамічні параметри, які ще називаються “payloads”, щоби таким чином виявити слабкі точки.

Фільтрація трафіку дозволить своєвчасно виявляти подібні кіберзагрози, відхиляти і блокувати будь-які невалідні та шкідливі HTTP-запити, токсичні User-Agent’и, хости, адреси і так далі. 

Реалізувати це можна з допомогою Web Application Firewall (WAF)CDN Cloudflare. Обидва засоби створять надійний мережевий екран-брандмауер для вашого сайту. З їх допомогою ви зможете сформувати правила блокування у разі виявлених несанкціонованих дій та аномалій.

Підключити Cloudflare можна безкоштовно, а в ролі WAF виступить кращий плагін безпеки для WordPress – Wordfence Security:

Wordfence Security WAF

Регулярно скануйте і оновлюйте WordPress

Зберігайте сайт в актуальному стані, адже щодня з’являються нові загрози та Zero-Day Вразливості. Не використовуйте “Nulled” та “warez” плагіни – вони можуть містити шкідливий код (закладки, бекдори) й сповільнювати роботу сайту, викликати системні збої та помилки.

Просканувати WordPress та усі його компоненти на вразливості, знайти “дірки безпеки” допоможуть наступні плагіни:

Patchstack – WordPress & Plugins Security

WPScan – WordPress Security Scanner

Wordfence Security – Firewall, Malware Scan, and Login Security

Також додатково рекомендую скористатися самостійними зовнішніми DAST-сканерами, які дозволять провести аудит безпеки сайту та комплексно оцінити захищеність, отримати рекомендації щодо покращення, наприклад:

Читайте також: ТОП сервісів для аудиту безпеки сайту.

Змініть стандартний префікс бази даних WordPress

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

Префікс бази даних WordPress

Змінити префікс можна з допомогою серверної утиліти PhpMyAdmin або спеціальних плагінів WordPress:

All-In-One Security (AIOS) – Security and Firewall

Brozzme DB Prefix & Tools Addons

Використовуйте HTTP Security Headers

HTTP Security Headers — це заголовки безпеки, які віддає сервер по протоколу HTTP з метою захистити інтернет-з’єднання з веб-сторінкою від перехвату даних та будь-яких інших маніпуляцій та загроз. Детальніше на сторінці OWASP.

HTTP Security Headers

Переглянути яких HTTP-заголовків не вистачає на сайті можна з допомогою онлайн-сервісів:

Здійснюйте резервне копіювання

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

Пропоную скористатися наступними плагінами для резервного копіювання WordPress:

BackWPup – WordPress Backup Plugin

UpdraftPlus: WordPress Backup & Migration Plugin

Подбайте про безпеку і захист сервера

Server Security

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

Зокрема, перевірте все, що стосується мережевих TCP/UDP портів:

  • Закрийте порт бази даних — 3306
  • Закрийте порт Remote Desktop Protocol — 3389
  • Закрийте або приховайте порти хостинг-панелі (cPanel, VestaCP, CyberPanel, DirectAdmin, Plesk або ін.)
  • Закрийте будь-які інші порти інтерфейсів, котрі не використовуються або мають високий ступінь важливості
  • В ідеалі, бажано залишити публічно доступними лише порти HTTP — 80 та HTTPS — 443

Проведіть аудит безпеки SSH-з’єднання, яке найчастіше піддається bruteforce атакам:

  • Змінити стандартний номер порта (замість 22 поставити будь-яке п’ятизначне число, попередньо надавши доступ у мережевому екрані на рівні сервера/хостинга)
  • Заборонити вхід на сервер під обліковим записом root
  • Дозволити вхід на сервер тільки з вашого IP
  • Дозволити вхід на сервер лише по SSH-ключу безпеки

Встановіть спеціалізовані програмні модулі для захисту сервера:

Хто і навіщо взламує WordPress?

Користувачі часто запитують: “Хто і навіщо буде мене ламати? Кому я та мій сайт потрібен?”.

Їм потрібні не ви чи ваші сайти. Їм потрібні ваші ресурси. Будь-який сайт  –  це інструмент, знаряддя, додаткові потужності, які можуть бути використані в різних цілях, наприклад:

  • організація ботнет і проведення DDOS-атак з використанням IP-адреси та потужностей сервера вашого сервера;
  • побудова PBN-сіток сайтів й розгортання “чорного” BlackHat SEO;
  • організація дорвеїв і клоак, продаж реклами і монетизація трафіку;
  • розміщення рекламних, партнерських, шпигунських посилань;
  • встановлення прихованого майнера криптовалют;
  • встановлення прихованого інтернет-парсера;
  • встановлення прихованого стилера, який стежитиме за відвідувачами і збиратиме їх персональні дані для подальшої продажі логів у даркнеті;
  • електронна розсилка спаму, відправка фішингових листів засобами WordPress.

А тепер уявіть, що таких сайтів — тисячі. Виходить прибутковий бізнес.

Найрозповсюдженіші типи атак на WordPress

Підсумовуючи, можу виділити вектори атак, яким найчастіше піддаються сайти на WordPress:

  • XSS-ін’єкції — втілення шкідливого JavaScript коду в веб-об’єкти і елементи сайту.
  • SQL-ін’єкції — взлам та модифікація бази даних через несанкціоновані запити до неї.
  • Local File Inclusion/Remote File Inclusion (LFI/RFI) — використання локальних та віддалених файлів для отримання несанкціонованого доступу.
  • DOS/DDOS-атаки — відправка великої кількості хаотичних HTTP-запитів з різних IP, спрямованих на вразливу веб-сторінку чи об’єкт.
  • Brute-Force — атаки “грубої сили”, масовий перебір комбінацій та значень.

WordPress BlackHat SEO examples

Що робити якщо ваш сайт на WordPress зламали?

  1. Негайно змінити паролі до всіх технічних засобів, вузлів, адміністративних частин та компонентів сайту, включаючи субдомени, сервери, хостинг-панель. Оновити доступи до всіх адмінок та служб керування: SSH, FTP, PhpMyadmin і т.д.
  2. Тичасово вимкнути публічний доступ до сайту.
  3. Деактивувати тимчасово усі плагіни. Можна просто перейменувати папку /wp-content/plugins і плагіни деактивуються скопом.
  4. Видалити усіх користувачів сайту WordPress, крім Адміністратора (їх дописи автоматично експортуються в обліковий запис адміна).
  5. Перевірити файли активної теми WordPress: index.php, header.php, footer.php, а також службові файли: wp-config.php, wp-settings.php, wp-load.php, wp-login.php. Вмістилищем шкідливого коду можуть бути також JavaScript-файли, а також документи, архіви, зображення (file.jpg.php, file.pdf.php, exploit.ico. і ін.).
  6. Видалити усі сторонні теми WordPress крім системних.
  7. Видалити будь-які підозрілі посилання, файли або папки з дивними назвами (adminer, wso, r57, c99, hiddencode і т.п.), які не мають відношення до CMS WordPress і можуть бути шкідливими.
  8. Перевірити файл sitemap.xml
  9. Зробити відкат файлу конфігурації сервера .htaccess.
  10. Зробити відкат файлу конфігурації PHP.INI (повернути до “заводського” стану)
  11. Відкотити файл WP-CONFIG.PHP
  12. Відкотити файл FUNCTIONS.PHP
  13. Перевірте службу Crontab (серверний планувальник) на наявність несанкціонованих задач
  14. Згенерувати нові ключі безпеки WordPress і оновити їх в wp-config.php (рядок AUTH KEYS).
  15. Запустити автоматичнее відновлення бази даних WordPress, додавши у wp-config.php рядок: define( ‘WP_ALLOW_REPAIR’, true ); та перейшовши за посиланням https://your-site.com/wp-admin/maint/repair.php Якщо є доступ до phpmyadmin — провести там також перевірку і оптимізацію таблиць бази даних. Також не зайвим буде перевірити таблиці wp_users (наявність прихованих користувачів) і wp_posts (на наявність шкідливого коду в публікаціях).
  16. Зробити резервну копію сайту і дамп бази даних. Це можна зробити швидко в командному рядку Linux, підключившись по SSH: zip -r website-backup.zip та mysqldump -u username -p databasename > dump_file.sql.
  17. Перевірити сайт на віруси та шкідливий код спеціалізованими сканерами:

18. Якщо сканери виявили шкідливий код у базі даних, то зробити її дамп, скачати SQL-файл на локальний комп’ютер, відкрити в редакторі вихідного коду Sublime Text та через пошук/заміна або регулярні вирази прибрати його. Тоді зберегти (у тому самому форматі і кодуванні) та імпортувати очищену базу назад.
19. Звернутися до KR. Laboratories, й ми допоможемо із захистом сайту на WordPress.
20. Перейти на якісний та безпечний хостинг, що унеможливить зараження від сайтів-сусідів.

ПОДІЛИТИСЬ У СОЦМЕРЕЖАХ:

5 1 голос
Рейтинг статті
Підписатися
Сповістити про
guest
0 Коментарі
Вбудовані Відгуки
Переглянути всі коментарі
0
Цікаво почути Вашу думку!x
Отримати комерційну пропозицію
Оформити заявку
Замовити консультацію

Заповніть, будь ласка, форму й наш спеціаліст зв’яжеться з Вами та надасть безкоштовну консультацію!

Замовити дзвінок

Вкажіть, будь ласка, контактний номер телефону. Наш менеджер миттєво зв’яжеться з Вами!