Статті / Безопасность /

Как защитить свой сайт или блог под управлением CMS Wordpress от взлома: практические советы.

После того как сайт или блог создан и запущен, перед каждым стоит задача защиты ресурса от вредоносных программ и хакерских взломов. Как правило, большинство владельцев популярной системы управления контентом (CMS) Wordpress устанавливают среднюю степень защиты и предполагают, что несколько установленных плагинов обеспечат высокий уровень защиты. В тоже время имеет место мнение о том, что “мой сайт или блог вряд ли может интересовать хакеров”, но именно на такие ресурсы хакеры ориентируются в первую очередь. Ведь взломав ваш абсолютно безобидный блог “ни о чем”, который по вашему мнению не должен привлекать злоумышленников, вы тем самым становитесь одним из многих распространителей вредоносного кода для его конечной цели. В данной статье рассмотрим методы защиты движка Wordpress.

На сегодняшний день Wordpress является одним из самых популярных CMS в мире. Блоги, мини-сайты, а также целые порталы — строится, взяв за основу Wordpress. За лёгкостью освоения все же кроются вопросы, которые связанны с безопасностью сайта. Большое распространение CMS — все большее внимание со стороны злоумышленников.

Программисты всегда стараются, чтобы GET- и POST- запросы были защищены, но этого недостаточно. Также необходимо защищать блог от всевозможных XSS-инъекций, иногда и от попыток модификации переменных GLOBALS и _REQUEST. 

Основные методы защиты CMS Wordpress

1. Защищаем Wordpress от XSS-инъекций.

1.1. Если вы хоститесь на виртуальном кластерном хостинге дата-центра UNIT-IS или на виртуальном сервере (VPS) в случае использования в качестве веб-сервера Apache, вставьте код в файл .htaccess, расположенный в корне сайта (не забывайте делать резервную копию этого файла перед внесением любых изменений). 

Options +FollowSymLinks 

RewriteEngine On 

RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR] 

RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] 

RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) 

RewriteRule ^(.*)$ index.php [F,L] 

Данные код позволяет проверять все возможные запросы. Но, если же запрос содержит тег или, возможно, попытку модифицировать значение переменных GLOBALS и _REQUEST, тогда он попросту блокирует его и выдаёт пользователю ошибку 403.

1.2. В случае с VPS и установленным NGINX как самостоятельным веб-сервером (+ php-fpm), в последних версиях разработчиком внедрена штатная защита NAXSI (NGINX ANTI XSS & SQL INJECTION).

Файрвол веб-приложений (WAF) для NGINX, который помогает в защите от XSS, SQL-инъекций, CSRF, а также Local & Remote File Inclusions. 

Установка:

Ubuntu, Debian, Netbsd, Freebsd: возможно в виде пакета. 

К примеру, в серверной Ubuntu 12.04 достаточно сделать

apt-get install nginx-naxsi

Также и другие Linux-системы: 

Если пакеты еще не появились, тогда собираем nginx + naxsi из готовых исходников: 

wget http://nginx.org/download/nginx-x.x.xx.tar.gz 

wget http://naxsi.googlecode.com/files/naxsi-x.xx.tar.gz 

tar xvzf nginx-x.x.xx.tar.gz 

tar xvzf naxsi-x.xx.tar.gz 

cd nginx-x.x.xx/ 

(вместо x.x.x.x —  необходимо поставить доступные актуальные версии)

Необходимо раскомментировать в конфигурации NGINX включение базовых запретительных правил

include /etc/nginx/naxsi_core.rules;

и уже после перезапустите конфигурацию (service nginx reload).

Если при попытке зайти в админ панель CMS Wordpress вы ошибётесь с вводом логина или пароля, движок незамедлительно вам об этом сообщит. Зачем хакеру знать, что пароли, который он подбирает – неверены?

2. Убираем показ лишней информации

Следует открыть functions.php, который лежит в папке с активной темой

блога (wp-content/themes/название-вашей-темы/) и, непосредственно,

добавить следующий код:

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

сохраняем файл. Теперь никаких сообщений.

3. Принудительное использование SSL

Если вы хотите, чтобы информация, которую вы передаете была защищена, тогда вам необходимо использовать SSL-протокол, который обеспечивает целостность и конфиденциальность обмена данными. В отдельных случаях это может затруднить работу процесса подбора паролей роботами. В Wordpress’e это сделать очень просто.

Прежде всего узнаём, есть ли возможность на вашем тарифном плане

использовать SSL. Если да, то открываем файл wp-config.php (в корне

сайта) и добавляем следующее:

define('FORCE_SSL_ADMIN', true);

4. Используем .htaccess для защиты файла wp-config

wp-config.php содержит абсолютно все данные, которые необходимы для

подключения к нашему серверу MySQL, а также к базе данных. Защитить

доступ – одна из самых главных и сложных задач.

В первую очередь необходимо находити файл .htaccess в корне нашего сайта, далее добавить следующие строки: 

 

order allow,deny 

deny from all 

5. Сокрытие версии Wordpress

Движок автоматически вставляет номер текущей версии CMS в исходный

код каждой страницы. Не всегда есть время или возможность обновить

движок. А это значит, что человек знает, какая версия Wordpress’a стоит,

знает, какие слабые места на вашем сайте еще присутствуют. Что следует

делать? Необходимо убрать добавление в исходный код версии CMS

WordPress.

Открываем functions.php, и добавляем:

remove_action('wp_head', 'wp_generator');

Желательно также удалить файл readme.html в корневой папке сайта. В нём тоже содержится информация о текущей версии Wordpress.

6. Убиваем админа! Нет дефолтному юзернейму «admin».

Злоумышленникам намного легче получить доступ к вашему сайту при

помощи брута, особенно, если логин уже известен. Легче всего взломать

сайты, если стоит стандартный логин «admin» для администирования сайта.

В версии 3.0 CMS WorsPress и выше, имеется возможность изменить

стандартный логин для администратора. Для всех остальных (ранних) версий

необходимо выполнить один SQL-запрос (например через phpMyAdmin):

UPDATE wp_users SET user_login = 'Ваш новый логин' WHERE user_login = 'Admin';

7. Организация предварительной аутентификации на файле wp-login.php

Как правило, первым попадает под удар файл входа в административную

панель wp-login.php. Самый простой метод защиты, это скрыть этот файл

(переименовать или сделать доступным на произвольном порту). Но иногда

такие методы приносят массу неудобств, к примеру для блогов с большим

количеством зарегистрированных подписчиков и редакторов.

Введем предварительную авторизацию с использованием HTTP Auth Basic

средствами PHP, конфиги веб-сервера трогать не станем, что придаст

методу наибольшей универсальности.

Создаем файл preauth.php со следующим кодом:

$p = "md5_hash_of_pass"; 

$u = "Login"; 

function a() { 

    header('WWW-Authenticate: Basic realm="Administration Area"'); 

    header('HTTP/1.1 401 Unauthorized'); 

    if ($_SESSION['pre']!=1) echo 'Preauthentication required!'; 

    $_SESSION['pre']=''; 

    exit; 

if (!isset($_SERVER['PHP_AUTH_USER']) or !isset($_SERVER['PHP_AUTH_PW'])) { 

a(); 

} else if($_SERVER['PHP_AUTH_USER'] == $u and md5($_SERVER['PHP_AUTH_PW']) == $p) { 

  echo 'Preauthenticated!'; 

} else { 

echo('Preauthentication failed!'); 

$_SESSION['pre']=1; 

a(); 

?>

Где $p – заранее сгенерированный md5-хеш пароля, $u – логин (не

устанавливайте те же логин и пароль, что используете для входа через

штатную форму авторизации, иначе смысл метода потеряется).

Модифицируем файл wp-login.php, прописываем код в самом начале файла, после “

include('preauth.php');

Теперь при обращении по адресу http://мойсайт/wp-login.php, будет

запрошен логин и пароль из файла preauth.php, в случае корректного

ввода, отобразится штатная форма авторизации Wordpress. Метод не только

вдвойне затруднит подбор паролей злоумышленником, но и предоставит

неожиданность ботам, которые вряд ли ожидают такой ответ от стандартной

формы входа движка. Стоит учесть что файл wp-login.php будет перезаписан

при обновлении CMS, поэтому необходимо прописать строку

“include('preauth.php');” повторно.

Последовательность действий по устранению последствий

Если вас уже взломали, то самый безотказное “лечение” последствий

взлома и модификации вашего сайта или блога, а также базы данных – это

бэкап. Если вы самостоятельно не делали резервных копий, обратитесь в

техническую поддержку, дата-центр UNIT-IS регулярно проводит резервное копирование клиентских сайтов.

Но восстановление из бэкапа недостаточно, один раз взломав сайт, к вам могут вернуться еще.

Проще всего это увидеть по дате изменения файла;

  • Постарайтесь сразу определить, какие именно файлы были заменены,

    это может быть как index.php, так и файлы шаблонов, изображений и т.п.

    определить характер используемой уязвимости и IP-адрес злоумышленника;

  •  Сделайте скриншоты последствий;
  •  Обязательно оповестите техническую поддержку ДЦ UNIT-IS и согласуйте свои дальнейшие действия;
  • Сохраните в отдельный каталог файлы сайта, время модификации файлов в дальнейшем поможет Вам определить злоумышленника;
  • Восстановите из резервной копии сайт или обратитесь для этого в тикет-систему нашей технической поддержки;
  • Скачайте логи ошибок и доступа к сайту, лучше скопировать их в отдельный каталог, чтобы не удалились при ротации логов;
  • Анализ

    времени изменения файлов и сопоставления с записями в логах позволяют

  • Обновите Worpress и все плагины до актуальной версии, откажитесь от использования подозрительных плагинов;
  • Обязательно смените все пароли доступа.

Заключение

Безопасность вашего сайта или блога — задача не только разработчика,

но и наша, дата-центра UNIT-IS, чем обязаны обеспечить максимальную

защищённость наших серверов, но и владельца сайта. Заказывая хостинг для WordPress

в дата-центре UNIT-IS, вы уверены в качестве и высокой надежности

серверов! Наши системные администраторы всегда готовы помочь в случае

возникновения каких-либо вопросов.

Напоследок приведем несколько тривиальных советов вебмастеру:

  • нигде не храните учетные данные доступа;
  • используйте длинные комплексные пароли и нестандартные логины, периодически выполняйте их смену;
  • своевременно обновляйте ядро Worpress и подключаемые плагины с выходом обновлений;
  • при выборе плагина проверяйте надежность источника, а также наличие незакрытых уязвимостей;
  • следите за правами на файлы скриптов и особенно критические файлы конфигурации;
  • периодически, в том числе внешними сервисами, проверяйте доступность конкретных разделов своего сайта;
  • храните локальные копии бекапов сайта и базы данных.