Содержание
Безопасность InstantCMS
«InstantCMS» — это веб-приложение, которое часто используется на публичных серверах, доступных из Интернета. Это означает, что есть больший риск подвергнуться нападению злонамеренных людей.
«InstantCMS» разработана с учётом требований безопасности. Мы пытаемся найти баланс между дружелюбием к пользователю и безопасностью, но предпочитаем безопасность пользе, когда компромисс не может быть найден.
Эта страница должна дать краткий обзор, на какие аспекты заострить внимание, чтобы удостовериться, что ваша установка «InstantCMS» безопасна.
Уведомление о проблеме с безопасностью
Если обнаружена проблема безопасности кода «InstantCMS», пожалуйста, сообщите нам. Предпочтительные способы:
- Открыть новый тикет на GitHub
- Отправить личное сообщение
- Написать на email dev@instantcms.ru
Для небольших багов предпочтительнее первые два способа. При обнаружении серьезных ошибок, которые могут быть использованы для написания эксплойтов для «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 и скопируйте в неё все файлы из текущей директории /system/config/
. Теперь нужно задать переменную окружения для вашего вебсервера, а также скорректировать задачу планировщика.
Переменная окружения для Apache задаётся так:
<VirtualHost *:80> ServerName example1.com DocumentRoot /var/www/example1 SetEnv ICMS_CONFIG_DIR ../icmsconfig/ </VirtualHost>
Т.е. в блок VirtualHost добавляется строка
SetEnv ICMS_CONFIG_DIR ../icmsconfig/
Переменная окружения для PHP-FPM задаётся так:
env[ICMS_CONFIG_DIR] = ../icmsconfig/
После рестарта Apache или PHP-FPM убедитесь, что всё работает, поскольку применился новый путь и файлы уже подключаются из него. Только после этого можно удалить существующую (старую) директорию /system/config/
.
До версии InstantCMS 2.17.0 подобное, но только для файла конфигурации можно было сделать следующим образом: откройте файл /system/core/config.php и найдите там строчку
const CONFIG_DIR = '/system/config/';
замените её на
const CONFIG_DIR = '../icmsconfig/';
Сохраните файл. После чего удалите файл /system/config/config.php
(только его один).
Убедитесь, что всё работает. Не забывайте также про директиву open_basedir. Путь к новой директории хранения должен в ней быть тоже (через двоеточие).
Безопасность дополнений
InstantCMS имеет много разрабатываемых сообществом дополнений. Дополнения добавляют новую функциональность к InstantCMS, расширяя её код. Это означает, что у них есть фактически полный доступ к Вашему серверу. Кроме того, дополнения распространяются отдельно от InstantCMS, иногда довольно специфичными способами. Они не подвергаются столь тщательной проверке, как кодовая база InstantCMS. Таким образом, необходимо принять необходимые меры безопасности до установки дополнений.
Вот некоторые подсказки, чтобы помочь вам с выбором дополнений, которые вы устанавливаете.
- Если понимаете языки программирования, ознакомьтесь самостоятельно с исходными кодами дополнения - до его установки.
- Если сомневаетесь, спросите на форуме.
- Наводите справки о продавце, если дополнение платное, уточняйте все нюансы ДО покупки.
- Дополнения созданы разработчиками, напрямую не связанными с проектом InstantCMS - они могут быть неопытными, иметь злые намерения или могут разместить исходный код плагина на сервер, который был скомпрометирован. Будьте осторожны в доверии!
- Старайтесь всегда обновлять дополнения, как только выходят их новые релизы.
Назад к разделу Администраторам