Защита сайтов Joomla.  Продвинутый уровень.

 

Защита сайтов Joomla.  Продвинутый уровень.

Серверы

Большинство веб-серверов работают на ОС Linux. Дело в том, что Linux считается надежной и безопасной системой, подходящей для работы IT-менеджеров. Большинство эксплойтов, с которыми я сталкивался, возникали не по вине ОС Linux, а на уровень выше платформы сервера. Если хостинг-провайдер заботится о безопасности на всех уровнях: Apache, MySQL и PHP, и обновляет их по мере необходимости, то доля риска сохраняется на уровне исполняемых приложений (в нашем случае Joomla). Так что тут нужно быть особенно осторожным.

 

Права доступа к файлам

При переходе от разработки к внедрению сайта, первым делом нужно позаботиться о правах доступа к файлам. При установке Joomla это делать не обязательно. Для каждого файла и директории в Linux существует три флага – чтение (r), запись (w) и выполнение (x). К тому же есть три связанные группы: пользователь (u), группа (g) и другие (s). В каждой группе есть все три флага. У каждого файла есть права доступа, которые можно преобразовать в числа, но я не буду вдаваться в детали по поводу флагов, групп и чисел. Эту информацию можно найти в сети Интернет. Важен флаг «запись» для группы «другие», который позволяет пользователям добавлять файлы в файловую систему. Пример – это добавление картинок и других файлов контента. В Joomla есть несколько директорий, которым нужно устанавливать права записи для доступа к файлам, включая директорию cache (используется для кэширования страниц) и директорию tmp (используется для временного хранения файлов, например, в процессе установки расширений). Все остальные директории и файлы нужно закрыть от записи.

Права доступа для файлов должны быть выставлены в 644 (что означает, что только группа «пользователей» имеет возможность «писать»):

find /home/xxx/domains/xxxxxxx.com/public -type f -exec chmod 644 {} \;

Для папок нужно выставить 755 (что будет означать, что только группа «пользователей» имеет возможность «писать» и «выполнять»):

find /home/xxx/domains/xxxxxxx.com/public -type d -exec chmod 755 {} \;

Еще несколько замечаний:

  • Если вам интересно, как работают эти числа и как они конвертируются из флагов и групп, то прочитайте это руководство;
  • Команды работают в интерфейсах ftp, ssh и cpanel;
  • Обратите внимание на то, что директория /home/xxx/domains/xxxxxxx.com/public должна быть заменена на ваш путь к установленной на сервере Joomla.

Делаем директории доступными для записи

Я упоминал выше, что иногда требуется сделать некоторые директории доступными для записи. Например, такие как: cache, tmp и images. Это можно сделать с помощью следующей команды:

cd /home/xxxxxx/domains/xxxxxxx.com/public_html && chmod -R o+w images cache tmp

Что же будет, если кто-то захочет взломать сайт и загрузит файл со скриптом? Можно установить скрипт, который может сделать что угодно, и даже уничтожить полностью весь сайт. По умолчанию, Joomla блокирует возможность загрузки скрипта, но что если некоторые расширения не заблокировали эту возможность?

Ответ состоит из двух возможных вариантов. Во-первых, если нет нужды загружать картинки для контента, не используете кэш и не устанавливаете расширения - не делайте директории доступными для записи!

Если же все-таки нужно использовать одну из выше перечисленных возможностей, или возможность, которая требует доступную для записи директорию, то можно отключить запуск скриптов для этих директорий. Для этого нужно сделать следующее – добавить файл .htaccess (начинается с точки!) для каждой директории. Он должен содержать следующие строки:

# secure directory by disabling script execution
Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi

Директива htaccess предшествует любой активности Joomla, так как файл наследуется от Apache и вызывается перед PHP.

База данных MySQL

Я рекомендую не использовать стандартный префикс jos_ для таблиц MySQL. В версии 2.5 префикс генерируется в случайном порядке. Если вы установили Joomla с таким префиксом, используйте скрипт или руководство по конвертированию префиксов таблиц и не забудьте сразу же после этого обновить конфигурацию.

Кроме того, советую назначить для пользователя сервиса MySQL только эти права доступа - SELECT, UPDATE, DELETE, INSERT, CREATE. В любом случае, НЕ ИСПОЛЬЗУЙТЕ привилегированного пользователя (root) для MySQL. Это очень опасно!

Продвинутый уровень: PHP

Я уже упоминал о том, что первая часть руководства была предназначена больше для начинающих. Настало время для продвинутых настроек. Начнем с изменения файла конфигурации PHP - php.ini. Если вы с ним не знакомы, то оставьте его для своего хостинг-провайдера.

Блокирование потенциально опасной команды

PHP – это наиболее распространенный язык программирования для веб-приложений. Проще всего начать разработку с PHP, и это одно из его больших преимуществ, но это также может быть рискованным. Есть несколько команд, которые открывают доступ к нежелательным зонам. Заблокировать их можно с помощью параметровdisable_functions:

disable_functions = show_source, system, shell_exec, passthru, exec, phpinfo, popen, proc_open, eval

Эти команды позволяют пользователям использовать на сервере такие возможности, как передача данных, запуск команд с сервера, получение информации о сервере и т.д. Но будьте осторожны. Они полезны при разработке, но при внедрении сайта их использование не рекомендуется.

Директивы доступа PHP

У PHP есть доступ к любым частям сервера, если конфигурация этого не запрещает. Это опасно. Ведь, если хакер получит доступ к серверу, он сможет получить доступ ко всему. Чтобы избежать этого, пропишем в PHP, к чему он имеет доступ:

open_basedir =/home/xxxxxx/domains/xxxxxxx.com/:/tmp

Директория tmp должна быть доступна (это не временная директория Joomla), так как загрузки PHP производятся сначала в эту директорию, а потом уже в директорию Joomla.

Продвинутый уровень: htaccess

Как упоминалось выше, файл htaccess может фильтровать данные перед доступом к приложению Joomla и это экономит ресурсы сервера. Может возникнуть вопрос, почему эта часть статьи для продвинутых пользователей, если речь идет только об однократной настройке? Дело в том, что htaccess может фильтровать информацию, которая требуется от необходимых запросов, и иногда новички с ограниченным опытом начинают "играть" с этим файлом, что приводит к поломке некоторых вещей. Худшее, что они могут сделать – это удалить директивы rewrite в Joomla, тогда файл htaccess будет поврежден, а основные операции перестанут работать (такие как ссылки SEF).

Я рекомендую добавить специальный раздел для файла htaccess к каждой новой директиве и отслеживать добавленные директивы. Сохраните оригинальный файл htaccess.txt, так чтобы можно было восстановить его в случае неудачных действий. Здесь можно найти подробное описание использования файла htaccess в Joomla.

Блокирование прямого доступа к ядру Joomla

Все запросы приложения Joomla проходят через index.php (в версии 1.5 есть также index2.php). Любой другой прямой доступ можно расценивать, как хакерскую атаку. Ни одно приложение (или большинство из них) не использует прямой доступ к файлам, за исключением файла index.php. Таким образом, можно заблокировать прямой доступ к большинству файлов (ini, xml и php), добавив следующий раздел в файл htaccess:

#### @RS
# Deny access to php, xml and ini files 
# within components and plugins directories
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} \.php|\.ini|\.xml [NC]
RewriteCond %{REQUEST_URI} \/components\/ [OR]
RewriteCond %{REQUEST_URI} ^\/includes\/|^\/administrator\/includes\/ [OR]
RewriteCond %{REQUEST_URI} \/language\/ [OR]
RewriteCond %{REQUEST_URI} \/libraries\/ [OR]
RewriteCond %{REQUEST_URI} \/modules\/ [OR]
RewriteCond %{REQUEST_URI} \/plugins\/ [OR]
RewriteCond %{REQUEST_URI} \/templates\/ [OR]
RewriteCond %{REQUEST_URI} \/xmlrpc\/
RewriteRule ^(.*)$ index.php [R=404,L]
#### @RS

@RS ограничивает начало и конец раздела.

Блокирование MySQL инъекций

SQL инъекция не работает в Joomla, потому что большинство разработчиков используют стандартные SQL команды Joomla. Есть, конечно, и ленивые разработчики, которые этого не делают, поэтому можно блокировать атаки с помощью следующего раздела:

#### @RS
# Prevent most common SQL-Injections
RewriteCond %{query_string} concat.*\( [NC,OR]
RewriteCond %{query_string} union.*select.*\( [NC,OR]
RewriteCond %{query_string} union.*all.*select [NC]
RewriteRule ^(.*)$ index.php [F,L]
#### @RS

Блокирование инструментов хакера

Все, кто посещают сайт называются пользователями-агентами. На обычных пользователей распространяется возможность определения браузера (Firefox, Explorer, Chrome). Для поисковых ботов есть специальная возможность идентифицирования, а для инструментов хакера уникальная идентификация. Таким образом, их тоже можно заблокировать:


#### @RS
# Block most common hacking tools
SetEnvIf user-agent "Indy Library" stayout=1
SetEnvIf user-agent "libwww-perl" stayout=1
SetEnvIf user-agent "Wget" stayout=1
deny from env=stayout
#### @RS

Продвинутый уровень: Изменения расположения configuration.php

Начиная с версии Joomla 1.6, есть возможность изменить расположение главного файла конфигурацииconfiguration.php. Есть несколько причин для изменения его расположения. Первая – многие хакеры знают, что сайт работает на Joomla и будут пытаться взломать файл. Кроме того, файл находится там же (он статичен) и к нему можно получить доступ из веб-интерфейса, потому что он расположен в публичной папке. Риск увеличивается, когда этот файл предоставляют в свободный доступ для того, чтобы обновлять глобальную конфигурацию в панели администратора.

Как же можно изменить расположение файла, предпочтительно переместив из публичной папки, так, чтобы не нарушить работу Joomla?

Можно заместить стандартное расположение файла конфигурации, но не просто путь конфигурации к нему, а несколько путей. В этом руководстве мы изменим только конфигурацию (но сначала сделайте резервную копию!):

  1. Скопируйте файл public_html/includes/defines.php в public_html и public_html/administrator/includes/defines.php в public_html/administrator/defines.php.
  2. Отредактируйте каждый новый defines.php в public_html и public_html/administrator, добавив следующие строки:

define('_JDEFINES', 1);

define('JPATH_BASE', dirname(__FILE__));

После:

defined('_JEXEC') or die;

  1. Затем нужно обновить стандартное расположение файла конфигурации в новых файлах. Например, переместим конфигурацию из области public_html (на уровень выше). Для этого изменим строку:

define('JPATH_CONFIGURATION', JPATH_ROOT);

на следующую:

define('JPATH_CONFIGURATION',   JPATH_ROOT .DS.'..');

  1. И опять, мы меняем оба новых файла defines.php.
  2. Не забудьте переместить файл configuration.php в новую локацию.