Документация InstantCMS

для администраторов и разработчиков

Инструменты пользователя

Инструменты сайта


manual:security

Безопасность InstantCMS

«InstantCMS» — это веб-приложение, которое часто используется на публичных серверах, доступных из Интернета. Это означает, что есть больший риск подвергнуться нападению злонамеренных людей.

«InstantCMS» разработана с учётом требований безопасности. Мы пытаемся найти баланс между дружелюбием к пользователю и безопасностью, но предпочитаем безопасность пользе, когда компромисс не может быть найден.

Эта страница должна дать краткий обзор, на какие аспекты заострить внимание, чтобы удостовериться, что ваша установка «InstantCMS» безопасна.

Уведомление о проблеме с безопасностью

Если обнаружена проблема безопасности кода «InstantCMS», пожалуйста, сообщите нам. Предпочтительные способы:

Для небольших багов предпочтительнее первые два способа. При обнаружении серьезных ошибок, которые могут быть использованы для написания эксплойтов для «InstantCMS», рекомендуем пользоваться приватной перепиской.

В зависимости от серьезности найденной проблемы безопасности, либо она будет исправлена в будущем релизе (по очень незначительным проблемам), либо будет выпущен срочный bugfix-релиз. В последнем случае пользователи будут проинформированы через механизм проверки обновлений.

Вы должны всегда использовать самую последнюю версию «InstantCMS», поскольку старые версии никогда не исправляются.

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

Все файлы и директории CMS должны быть недоступны для записи пользователю, под которым работает web сервер (www-data обычно). Исключения составляют директории /cache/ и /upload/ и всех вложенных в них, а также файл конфигурации CMS и файл конфигурации шаблона, находящиеся в /system/config/.

Установите для всех файлов движка права (chmod) 644, а для всех директорий права (chmod) 755. После этого для директорий /cache/ и /upload/ и всех вложенных в них установите права 777 (упрощённо). На время установки движка так же должна быть доступна для записи (права 777) директория /system/config/. После процедуры установки права доступа для нее нужно выставить в 755.

Для шаблона modern также нужно дать права на запись (666 в общем случае) для CSS файлов шаблона. Т.е. на все файлы в директории /templates/modern/css/, а также для CSS файлов контроллеров /templates/modern/controllers/название/styles.css.

Обращаем ваше внимание, что здесь даны базовые рекомендации по правам доступа, не учитывая особенности настроек безопасности вашего сервера или хостинга.

На unix-like системах вы можете использовать вот такой простой скрипт для быстрой установки правильных прав доступа:

#!/bin/bash
 
clear
 
if [ -z "$1" ]
  then
    echo "Введите абсолютный путь к корневой папке InstantCMS 2.X"
    exit
fi
 
SITE_PATH=$1
 
echo "Устанавливаем корректные права доступа для сайта с корневой категорией $SITE_PATH"
 
find $SITE_PATH/ -type f -exec chmod 644 {} \;
find $SITE_PATH/ -type d -exec chmod 755 {} \;
 
# на время установки
chmod 777 $SITE_PATH/system/config;
 
find $SITE_PATH/cache -type d -exec chmod 777 {} \;
find $SITE_PATH/upload -type d -exec chmod 777 {} \;
find $SITE_PATH/templates/modern/css/ -name "*.css" -exec chmod 666 {} \;
find $SITE_PATH/templates/modern/controllers/ -name "*.css" -exec chmod 666 {} \;

Указанный код нужно скопировать в любой файл, дать ему название, выставить права на исполнение (chmod +x chmod_icms.sh) и запускать, передавая параметром полный путь к корню сайта, например:

файл: chmod_icms.sh
запускать так: chmod_icms.sh /path/to/icms_site_root

Обратите внимание, там где даны рекомендации для выставления прав 777 или 666 - это упрощённо. Самый главный смысл - это дать возможность пользователю, под которым работает web сервер, запись в указанные директории или файлы.

Безопасность веб-доступа

Распространяемый дистрибутив InstantCMS содержит ряд .htaccess файлов, которые указывают веб-серверу Apache закрыть доступ к определенным директориям.

Если вы не используете веб-сервер Apache, или ваш Apache не использует .htaccess-файлы, вы должны вручную защитить свою установку.

Следующие директории не должны быть, без исключений, доступны из сети:

  • system
  • cache/data
  • cache/rss
  • cache/rsscache

Чтобы проверить, должны ли вы настроить права доступа попытайтесь получить доступ к https://yourserver.com/system/config/version.ini. Вы не должны получить доступ к файлу по этому пути. Если вы видите данные о версии InstantCMS - у вас проблема с безопасностью сервера.

Запрет доступа к директориям в Apache

Самый простой путь состоит в том, чтобы включить поддержку файлов .htaccess в вашей конфигурации Apache. Посмотрите учебник Apache по .htaccess.

«InstantCMS» поставляется с правильно сконфигурированными .htaccess-файлами. Содержимое файла .htaccess для блокировки доступа к директории, в которой он находится, должно быть следующим (корректно для версий Apache 2.2 и 2.4):

<IfModule !mod_authz_core.c>
  Order deny,allow
  Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  Require all denied
</IfModule>

На обработку файлов .htaccess влияет директива AllowOverride, которая по умолчанию отключена. В настройках своего виртуального хоста её нужно включить (выставить значение all), например:

# Упрощённо
<VirtualHost *>

        DocumentRoot /var/www/mysite

        <Directory /var/www/mysite>
                AllowOverride all
        </Directory>
</VirtualHost>

Сделайте /etc/init.d/apache2 reload для обновления конфигурации Apache и файлы .htaccess будут работать.


Другой вариант, без включения AllowOverride all заключается в переносе всех правил из файлов .htaccess в конфигурацию хоста. Пример настройки, учитывая дерево директорий как на изображении

# Упрощённо, чтобы был понятен принцип
<VirtualHost *:80>

    DocumentRoot /var/www/mysite.ru/html

    ServerName mysite.ru

    <Directory "/var/www/mysite.ru/html">

	    # Initialization InstantCMS
	    AddDefaultCharset utf-8
	    Options -Indexes
	    RewriteEngine on

	    RewriteRule ^.htaccess$ - [F]

	    # Remove trailing slash from URLs
	    RewriteCond %{REQUEST_FILENAME} !-d
	    RewriteRule ^(.+)/$  /$1 [R=301,L]

	    # Sitemaps
	    RewriteRule ^sitemap(.*).xml$ ./cache/static/sitemaps/sitemap$1.xml [L]

	    # Engine routing
	    RewriteCond %{REQUEST_FILENAME} !-f
	    RewriteCond %{REQUEST_FILENAME} !-d
	    RewriteRule ^(.*)$ ./index.php [L]

    </Directory>

    <Directory "/var/www/mysite.ru/html/system">
            Order allow,deny
            allow from all
    </Directory>

    <Directory "/var/www/mysite.ru/html/cache">
            php_flag engine 0
	    Order allow,deny
	    <Files ~ "\.(js|css|xml)$">
	       allow from all
	    </Files>
    </Directory>

    <Directory "/var/www/mysite.ru/html/static">
            php_flag engine 0
    </Directory>

    <Directory "/var/www/mysite.ru/html/upload">
            php_flag engine 0
    </Directory>

    <Directory "/var/www/mysite.ru/html/wysiwyg">
            php_flag engine 0
            <Files ~ "\.(php)$">
               deny from all
            </Files>
    </Directory>

    <Directory "/var/www/mysite.ru/html/templates">
	    Order allow,deny
	    <Files ~ "\.(js|css|scss|xml|png|gif|jpg|jpeg|ico|webp|map|eot|svg|ttf|woff|woff2|webmanifest|mp3)$">
	       allow from all
	    </Files>
    </Directory>

    DirectoryIndex index.php

    php_admin_value open_basedir "/var/www/mysite.ru:/var/www/mysite.ru/sessions"
    php_admin_value upload_tmp_dir "/var/www/mysite.ru/temp"
    php_admin_value session.save_path "/var/www/mysite.ru/sessions/"
    php_admin_value display_errors "Off"
</VirtualHost>

Так же обратите внимание на директивы:

  • php_flag engine 0 - отключает выполнение любых PHP файлов в директории.
  • php_admin_value open_basedir - ограничивает указанным деревом каталогов файлы, которые могут быть доступны для PHP, включая сам файл. Подробнее в документации.
  • php_admin_value display_errors «Off» - отключает показ ошибок и предупреждений PHP. Для продакшена это нужно отключать, чтобы не возникло раскрытия путей к директории сайта на вашем сервере.
  • php_admin_value session.save_path «/var/www/mysite.ru/sessions/« - путь к директории сессий PHP.

Кроме того, обратите внимание, что в директиве open_basedir также указан путь к директории сессий /var/www/mysite.ru/sessions для конкретно этого сайта. Именно этот путь к сессиям должен быть указан при установке InstantCMS.

Запрет доступа к директориям в Nginx

Этот раздел не дописан.

Директория /system/config/

В этой директории хранится файл config.php - это конфигурация InstantCMS, в которой указаны в том числе доступы к базе данных, реквизиты email и другая важная информация. Его можно переместить за корень установки InstantCMS. Для этого выше корня установки создайте директорию, например, icmsconfig, скопируйте в неё файл config.php. После этого откройте файл /system/core/config.php и найдите там строчку%

    const CONFIG_DIR = '/system/config/';

замените её на

    const CONFIG_DIR = '../icmsconfig/';

Сохраните файл. После чего удалите файл /system/config/config.php. Убедитесь, что всё работает. Не забывайте также про директиву open_basedir. Путь к новой директории хранения должен в ней быть тоже (через двоеточие).

Безопасность дополнений

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

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

  • Если понимаете языки программирования, ознакомьтесь самостоятельно с исходными кодами дополнения - до его установки.
  • Если сомневаетесь, спросите на форуме.
  • Наводите справки о продавце, если дополнение платное, уточняйте все нюансы ДО покупки.
  • Дополнения созданы разработчиками, напрямую не связанными с проектом InstantCMS - они могут быть неопытными, иметь злые намерения или могут разместить исходный код плагина на сервер, который был скомпрометирован. Будьте осторожны в доверии!
  • Старайтесь всегда обновлять дополнения, как только выходят их новые релизы.

Назад к разделу Администраторам

manual/security.txt · Последнее изменение: 09.01.2022 23:59 — fuze