Опубликовано автор в категориях CMS, Joomla.

Защита сайта на Joomla!

Это вторая часть статьи по защите веб-сайтов, которая переведена с израильского руководства опубликованного в The Joomla! Community Magazine. Первая часть была более простой и более подходила начинающим. Эта часть является более продвинутой, с подробной информацией и разъяснениями.

Серверы

Серверная архитектураБольшинство веб-серверов в мире работают на операционной системе Linux. Причина в том, что эта система является надежной и простой в обслуживании ИТ-менеджеров. Причиной большинства уязвимостей сайтов на платформе Linux является не сама операционная система, a источник кроется на уровень выше серверной платформы.

Если ваш хостинг-провайдер заботится и поддерживает все уровни сервера — Apache, MySQL и PHP и обновляет их по мере необходимости — большая часть рисков безопасности будет происходить на уровне приложений, а это значит, что Joomla в этом случае это то, где вы должны быть наиболее осторожными.

Разрешения файла

Одна из первых вещей, на которую вы должны обратить внимание — это права доступа к файлам, если вы собираетесь переходить из стадии разработки в стадию серьёзной работы вашего проекта.

При прямой установке Joomla вам не нужно делать это. Для каждого файла и каталога в Linux есть три так называемых флажка – чтение(r), запись(w) и выполнение (х), по английски — read (r), write (w) and execute (x). Кроме того, есть три родственные группы — пользователь (u), группа (g) и остальное(s), в английском варианте user (u), group (g) and others (s). Каждая группа содержит 3 флажка.

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

Важное значение в этих флагах имеет флаг «запись» (write) для других групп, которые позволяют пользователям добавлять файлы в файловую систему. К примеру, добавление файлов в файловую систему, добавление изображений и других файлов контента.

Joomla имеет несколько каталогов которым нужно выставить права на запись для файлов, в том числе каталог кэша «cache» (используется для кэширования страниц), и «tmp» каталог (используется для временных файлов, например, которые создаются во время установки расширений). Поэтому мы должны сделать так, чтобы эти каталоги были доступны для записи, НО только эти каталоги. Все остальные каталоги и файлы, не должны быть доступны для записи.

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

Данная команда позволить вам с помощью SSH установить права 644 для всех файлов на вашем сайте при условии, что вы выполняете ее из верхнего уровня после авторизации в шел и путь к вашему сайту на сервере имеет вид /home/xxx/domains/xxxxxxx.com/public:

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 {} \;
Несколько отдельных советов:

— Если вам интересна информация о цифрах и как они конвертируются из флагов и групп в цифры — прочтите это руководство (http://www.tuxfiles.org/linuxhelp/filepermissions.html)
— Команда может быть запущена через FTP, SSH или интерфейс cpanel.
— Обратите внимание, что каталог /home/xxx/domains/xxxxxxx.com/public подразумевает путь к вашей Joomla на вашем сервере, как уже пояснялось выше.

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

Как уже и говорилось ранее, иногда нам нужно, что бы несколько директорий (каталогов) были доступными для записи (writable). Рекомендуемыми каталогами, которые могут быть доступны для записи, являются: cache, tmp и images.
Вы можете сделать это с помощью следующей команды:

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

Теперь рассмотрим такую ситуацию, если кто-то захватывает ваш Joomla сайт (хакер например) и добавляет файл сценария, он же скрипт «script» ( ведь PHP это скриптовый язык)? Злоумышленник может установить скрипт, который будет делать всё что угодно на сервере, включая уничтожение вашего сайта.

Конечно, 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, вызывая .htaccess перед любым 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 каталог должен быть доступен (это не Joomlовский каталог tmp), потому что PHP загружает в первую очередь в этот каталог, прежде чем переходит к Joomla.

Дополнительно: htaccess

Как упоминалось ранее, .htaccess файл может фильтровать данные перед входом в приложение Joomla, что еще и экономит ресурсы сервера.
Это все хорошо, но вы можете спросить, почему этот раздел для продвинутых пользователей, если он так быстро настраивается и так же быстро забывается. Ответом на этот вопрос является то, что .htaccess может фильтровать информацию, требуемую от необходимых запросов, но бывает, что иногда начинающие пользователи с малым опытом начинают играться с файлом, тем самым ломая его.

В худшем случае неопытный пользователь может удалить директивы перезаписи Joomla, это приведет к тому, что .htaccess будет поврежден и основные операции в Joomla перестанут работать (например SEF ссылки).

Наши рекомендации — добавить специальный раздел в htaccess файл для каждой новой директивы, и отслеживать директивы, которые вы добавляли, и будете добавлять.

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

Вы можете найти более подробные и длинные .htaccess файлы в Joomla-вики и использовать специальные разделы прямо оттуда. (http://docs.joomla.org/Htaccess_examples_%28security%29)

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

Все запросы Joomla проходят через однин файл , это — index.php (в версии 1.5 есть также index2.php). Любые другие попытки прямого доступа можно рассматривать как попытки взлома. Ни одно расширение (большинство из них) не используют прямой доступ к файлам, кроме index.php, проходя через платформу Joomla, которая в свою очередь сама уже проходит через эти «ворота».

Таким образом, вы можете заблокировать прямой доступ к большинству файлов (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, потому что большинство разработчиков используют функции ядра Joomla SQL. Но, опять же, есть несколько «ленивых» расширений для разработчиков, которые не делают этого. Таким образом, вы можете блокировать эти попытки следующими строками:

#### @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

Инструмент блокирования захвата

Любой, кто посещает ваш сайт, называется User-Agent. Для постоянных посетителей, включает в себя идентификацию браузеров (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 делают этот файл открытым для записи, для того чтобы иметь возможность обновить глобальную конфигурацию сайта через админ-панель.

Главный вопрос состоит в том, чтобы изменить директорию расположения файла configuration.php при этом сохранив корректную работу 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;

3. Следующим нашим шагом будет изменение директории расположения файла configuration.php во вновь созданных нами файлах. Для примера давайте переместим файл конфигурации из папки public_html (на уровень выше).
Для этого изменим следующие строки :

define('JPATH_CONFIGURATION', JPATH_ROOT);

на:

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

4. Делаем эти изменения в обоих новых файлах defines.php

5. Не забываем переместить файл configuration.php в новую директорию!

6. Вот и все.

Заключение

Надеюсь, во второй части данного руководства вы узнали намного больше о безопасности Joomla. Помните, что системы взлома постоянно совершенствуются, поэтому безопасность тоже не должна стоять на месте. Если вы хотите сохранить свой сайт от вторжения злоумышленников, вы должны постоянно заботиться о его безопасности улучшая его системы защиты. И помните, если вы хотите действительно хороший и безопасный сайт, о лучше доверить его создание профессионалам, например, заказать сайт на Joomla! у в Hiwayarts

4 комментария к записи “Простое руководство безопасности Joomla!, Часть 2”

  1. Alexpts

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

    Это всегда так, просто на шаред хостингах владелец как правило и является инициатором процессов веб сервера. На VDS это будет 664 возможно. Тут главное понимать, что значат цифры, как это работает, и какие из под какого пользователя работают службы «веб сервера», чтобы дать им нужное число прав и обеспечить при этом некоторую инкапсуляцию для остальной среды.

    Ответить
  2. Алексей

    В пишу .htaccess ->

    order allow,deny
    deny from all

    Deny from all

    order allow,deny
    allow from all

    order allow,deny
    allow from all

    order allow,deny
    allow from all

    — Запрет на исполнение php файлов. Если злоумышленник, «закинет» вредоносные файлы на сайт, он не сможет запустить их.

    Ответить

Оставить комментарий

  • (не будет показан)