Joomla: Как обезопасить сайт от взлома?

За последние несколько недель, часто и таки много встречал сообщений о взломе сайта, которые управляются CMS Joomla. Пришлось потрудиться и самому. Один из мной разработанных сайтов был заражен. После очистки стал искать, может, что пропустил в настройке безопасности. Вот именно в этот момент появилось желание собрать все отысканные рекомендации на одной странице.
И так, допустим, что очередной сайт создали, теперь самое время перейти к настройке безопасности.

Удаляем ненужные файлы, каталоги

Первым с чего следует начать настройку – это удалить не нужные файлы и каталоги. В корне сайта ищем каталог INSTALLATION (если его не удалили после установки системы), а также файлы: INSTALL.php,  configuration.php-dist, INSTALL.php, LICENSE.php,  LICENSES.php, CHANGELOG, CREDITS, COPYRIGHT (в Joomla 1.7 их нет, есть только LICENSE.txt README.txt). Удаляем эти файлы.
Также не забываем о компонентах и плагинах, которые не задействованы.

Файл .htaccess

Чтобы произвести настройку безопасности, нам потребуется файл .htaccess. Он уже присутствует в корне сайта, только имеет расширение текстового файла — htaccess.txt — заменяем его на .htaccess.

Логин администратора

Часто такое случается, лично со своей практики, что готовый сайт передают со стандартным логином – admin. Это уже есть не очень хорошо, поскольку если известно одно данное из двух, то второе подобрать можно.
Изменяем логин по умолчанию – admin на свой!

Права на файлы, папки.

Проверяем права доступа к файлам и папкам. Они должны быть такими:
*на файл конфигурации (configuration.php) выставить права 444
*php файлы – 644
*прочие каталоги – 755
Если нам зачем-то понадобиться изменить какие строки в этих файлах, то сначала нужно изменить права, а только потом внести изменения.

Просмотр директорий

Раз мы заговорили о правах, то стоит напомнить о том, что следует запретить возможность просмотра файлов в какой-то из папок. Для этого в каждую папку (директорию) помещаем пустой файл — index html или index.php и в файл .htaccess или в конфигурации apache добавляем строку
Options –Indexes

Favicon

Заходишь на сайт и видишь стандартный файвикон Joomla. Все понятно о системе. Чтобы не преподносить такой подарок – заменяем стандартный favicon.ico на свой. Сделать это можно так: нужно создать свою иконку и разместить ее в корне сайта.

Скрываем Мета-теги

Если мы заменили стандартную иконку Joomla на свою, то это еще не все. Joomla сообщает о себе в мета-тегах, которые можно увидеть, если открыть исходный код страницы.
Чтобы удалить строку
<meta name=»generator» content=»Joomla! 1.5 — Open Source Content Management» />
или изменить саму надпись — Joomla! 1.5 — Open Source Content Management, нужно:
**изменяем надпись – открываем файл document.php  (он находиться — \libraries\joomla\document\document.php) и в строке 83-87, вместо Joomla! 1.5 … устанавливаем свою надпись;
**чтобы удалить эту строку вовсе, нужно в файле head.php (он находиться — \ libraries\joomla\document\html\renderer\head.php) отыскать такую строку (приблизительно 83-85) и комментируем ее – (\\)
\\$strHtml .= $tab.’<meta name=»generator» content=»‘.$document->getGenerator().’» />’.$lnEnd;
Стоит подчеркнуть, что этот вариант работает до первого обновления Joomla. Если произвели обновление, придется проделать это снова. Но чтобы избежать этого, можно произвести изменения в самом шаблоне. Между тегами <head>…</head> размещаем строку
<?php $this->setGenerator(‘Ваш мета-тег geneator’);?>
или же просто оставляем пустое значение мета-тега:
<?php $this->setGenerator(»); ?>

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

Копирайты внизу страницы

Картинка внизу страницы сайта:
© 2011 Site Name
Joomla! is Free Software released under the GNU/GPL License.

Решения проблемы:
а) В менеджере модулей отключить вывод модуля «Footer» (mod_footer). Но в этом случае исчезнуть все копирайты, а не только джумловские.
б) В языковом файле \language\ru-RU\ru-RU.mod_footer.ini в строках:
FOOTER_LINE1=
FOOTER_LINE2=
Убрать все, что справа от знака равно
в) В файле \modules\mod_footer\tmpl\default.php отключить вывод 2-ой строки, удалив строку:

<div><?php echo JText::_( 'FOOTER_LINE2' ); ?></div>

Запрет просмотра позиций в шаблоне

Еще одной характерной чертой Joomla является уникальный запрос (?tp=1) для просмотра существующих позиций в шаблоне сайта. Для запрета выполнения такого запроса нужно в файл .htaccess добавить такие строки:

##### Start ?tp=1 prevention######
 RewriteCond %{QUERY_STRING} tp=(.*)
 RewriteRule ^(.*)$ index.php [F,L] 
##### End ?tp=1 prevention ######

Существует еще один вариант блокировки этой характеристики, который заключается в комментарии строк, а именно, в файле helper.php (его расположение — /libraries/joomla/application/module/helper.php) находим код (приблизительно 96-103 строка)

if(count($result) == 0) {
if(JRequest::getBool(‘tp’)) {
$result[0] = JModuleHelper::getModule( ‘mod_’.$position );
$result[0]->title = $position;
$result[0]->content = $position;
$result[0]->position = $position;

комментируем каждую строку, а также в этом файле, комментируем вот такие строки (199-201)

if(JRequest::getBool(‘tp’)) {
$attribs['style'] .= ‘ outline’;
}

Этот вариант с комментированием строк, если честно, у меня не всегда получается. Бывает, что из за этого перестает работать админка сайта, тому в большинстве случаев – добавляю строки в файл .htaccess

Папка images: Запрет выполнения php

Большинство «вредоносных» файлов помещают в папку images. Это хорошее решение, ведь мало кто отважится просмотреть эту папку, поскольку там же только картинки.
Чтобы этого избежать, снова обращаемся к файлу .htaccess.
Создаем новый файл .htaccess в котором размещаем строки:
php_flag engine off
RemoveHandler .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml
AddType application/x-httpd-php-source .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml
и помещаем его в папку images.

Блокировка основных эксплойтов

Не стану расписывать, что же такое эксплойт, лучше сразу перейдем к защите от таких хакерских атак. В основной файл .htaccess (в корне сайта) добавляем блок
########## Начинаем запись правил чтобы заблокировать основные эксплойты
#
# Блокируем любой скрипт пытающийся получить значение mosConfig через URL
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|%3D) [OR]
# Блокируем любой скрипт пытающийся отправить любое дерьмо чере base64_encode по URL
RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR]
# Блокируем любой скрипт который содержит тег < script> в URL
RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]
# Блокируем любой скрипт, который пытается установить глобальную переменную PHP через URL
RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]
# Блокируем любой скрипт пытающийся изменить _REQUEST переменную через URL
RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2}) [OR]
# Блокируем любой скрипт, который пытается установить CONFIG_EXT (баг в com_extcal2)
RewriteCond %{QUERY_STRING} CONFIG_EXT([|%20|%5B).*= [NC,OR]
# Блокируем любой скрипт, который пытается установить sbp or sb_authorname чере URL (баг simpleboard)
RewriteCond %{QUERY_STRING} sbp(=|%20|%3D) [OR]
RewriteCond %{QUERY_STRING} sb_authorname(=|%20|%3D)
# Отправляем все заблокированный запросы на главную с ошибкой 403 Forbidden!
RewriteRule ^(.*)$ index.php [F,L]
#
########## Заканчиваем запись правил чтобы заблокировать основные эксплойты

Приведенные выше рекомендации – это методы, которые подвластны каждому. Теперь же перейдем к более сложным способам защиты, которые могут нарушить работу сайта. Прежде чем приступить, создайте копию сайта!
Создали? Идем далее.

Двойной доступ. Защита админ-части сайта

Почему ”Двойной доступ”? Ответ на это вопрос можете отыскать на одном из ранее опубликованных материалов, а также подробно ознакомиться с тонкостями ее создания и работы. Здесь же только скажу, что нужно создать два файла — .htaccess и .htpasswd, составить необходимый код
AuthUserFile /DocumentRoot/administrator/.htpasswd – размещение файла .htpasswd, а DocumentRoot — это прямой путь Хоста, который можно посмотреть в configuration.php сайта
AuthGroupFile /dev/null
AuthName «Запароленная зона» — сообщение, которое будет выводиться пользователю
AuthType Basic
<limit GET POST>
require valid-user
</limit>
сохранить его в .htaccess. В шифре MD5 сгенерировать пароль для входа и занести его в .htpasswd
admin: aaAN1ZUwjW7to – где aaAN1ZUwjW7to – это зашифрованный пароль
и разместить эти файлы в папке administrator
Это же можно сделать через панель управления Хостингом сайта.

Страница ошибок 404

Стандартная страница ошибок 404 Joomla является простой и такой узнаваемой, что по ее строению сразу определяем систему.
Изменить оформление страницы 404 можно такими способами:
***создаем материал, не указывая раздел и категорию;
***в меню создаем новый пункт по типу шаблона материала для этой страницы. После создания в свойствах данного пункта меню смотрите истинный адрес страницы. Например, этот: index.php?option=com_content&view=article&id=23
Записываем;
***в папке templates/system есть файл error.php. Удаляем все его содержимое и вместо этого пишем:

<?php
defined(‘JPATH_BASE’) or die();
echo file_get_contents(JURI::root().’/index.php?option=com_content&view=article&id=23′);
?>

Еще вариант. Переименовываем оригинальный файл, а вместо него создаем свой — новый error.php, вписываем туда то, что указано выше, и снова помещаем в папку templates/system.

Стандартный префикс (jos_) таблиц базы данных

Большинство SQL инъекций для получения необходимой информации для взлома используют именно стандартное свойство Joomla — префикс (jos_), которое устанавливается по умолчанию, например данные таблиц — jos_users.
Изменим его. Это можно сделать при помощи Admin Tools или в ручную.
Прежде чем приступить к изменению префикса – создайте копию сайта!
Другой префикс для таблицы можно задать непосредственно при установке Joomla, но если система установлена и работа сайта настроена, то в таком случае, нужно:
****войти в панель управления Joomla!. Открыть «Общие настройки» —> «Сервер» и отыскать панель «Установка базы данных».
Именно в этом пункте можно изменить установленный префикс таблиц на любой другой. После того, как записали значение нового префикса, жмем кнопку Сохранить.
Внимание! Если после такого изменения сайт не работает – это нормально и для восстановления работы нужно выполнить:
****войти в PhpMyAdmin. Переходим в кладку экспорт, оставляем все значения по умолчанию и нажимаем кнопку «Пуск/Пошел». Не стоит волноваться, если экспорт данных займет много времени.
Как экспорт будет завершен, выделяем весь код и копируем его в блокнот (или другой текстовый редактор), сохраняем файл. Копию сделали, можем двигаться далее.
Возвращаемся в PhpMyAdmin. Выбираем все наши таблицы, и удаляем.
Еще раз, обязательно убедитесь, что сохранили экспортированный до этого код, иначе потеряете данные сайта!!!
Теперь возвращаемся к текстовому редактору, в котором производим поиск – ключ «jos_» и заменяем этот стандартный префикс на новый (установленный ранее в панели управления Joomla).
Теперь, полученный результат замены префикса, копируем (копируем все!), переходим в PhpMyAdmin, вкладка SQL и вставляем запросы (то, что скопировали в редакторе) и жмем кнопку Пуск.