Заметки по созданию хостинга на базе панели ISP Control: различия между версиями

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску
Строка 15: Строка 15:
==Конфиги==
==Конфиги==
===Настройки PHP===
===Настройки PHP===
* '''/etc/ispcp/fcgi/parts/php5/php.ini''' - тут находятся дефолтные настройки PHP (а рядом и другие дефолтные файлы), которые копируются юзеру при создании домена.
*
'''/etc/ispcp/fcgi/parts/php5/php.ini''' - тут находятся дефолтные настройки PHP (а рядом и другие дефолтные файлы), которые копируются юзеру при создании домена.
'''/etc/ispcp/fcgi/parts/master/php5/php.ini''' - аналогично, но для самой панели.
 
{{Msg|Внимание: при запуске скрипта обновления панели все пользовательские php.ini-файлы перезаписываются вышеуказанными}}
 
* Настройки аплоада файлов: в '''php.ini''' для нужного домена (в частности для phpmyadmin, net2ftp):
* Настройки аплоада файлов: в '''php.ini''' для нужного домена (в частности для phpmyadmin, net2ftp):


Строка 24: Строка 29:
  upload_max_filesize = 64M
  upload_max_filesize = 64M


Кроме того, в '''/etc/apache2/mods-enabled/fcgid_ispcp.conf''' изменить (добавить) параметр '''MaxRequestLen''':
Кроме того, в '''/etc/apache2/mods-enabled/fcgid_ispcp.conf''' (и '''/etc/ispcp/apache/working/fcgid_ispcp.conf''') изменить (добавить) параметр '''MaxRequestLen''':
  MaxRequestLen 64000000
  MaxRequestLen 64000000
Без него может появляться 500-я ошибка при аплоаде больших файлов (в частности дампов баз в phpmyadmin), ошибку можно отловить в '''error_log''' сервера.
Без него может появляться 500-я ошибка при аплоаде больших файлов (в частности дампов баз в phpmyadmin), ошибку можно отловить в '''error_log''' сервера.

Версия 18:24, 1 августа 2011

Бэкап

Использование многопоточной архивации на SMP

Для улучшения использования многоядерных процессоров есть смысл поставить pbzip2. Для его использования в /etc/ispcp/ispcp.conf изменить параметр ZIP на bzip2, а CMD_BZIP на

CMD_BZIP = /usr/bin/pbzip2

это затронет архивирование баз данных (как для доменов, так и для самой панели). Для многопоточной архивации контента придется немного изменить скрипт /var/www/ispcp/engine/backup/ispcp-backup-all, 297-я строка - надо сжатие напрямую через tar сменить на внешнюю команду. Скрипт в этом месте выглядит так (закомментированный старый и новый вариант):

#$backup_cmd = "$cmd_tar --create --directory=$dmn_dir --$zip --file=$www_dir/$backup_filename --exclude=logs --exclude=phptmp --exclude=backups . 2> $www_dir/$backup_filename.log";
$backup_cmd = "$cmd_tar --create --directory=$dmn_dir --exclude=logs --exclude=phptmp --exclude=backups . 2> $www_dir/$backup_filename.log | pbzip2 -9c > $www_dir/$backup_filename";

Как (более правильный) вариант - переделать скрипт, добавив новый тип сжатия - pbzip2, обрабатывающийся по тем же правилам, что и обычный bzip2, тогда в правке выше можно использовать переменную $zip.

Править ispcp-backup-ispcp, думаю, нет смысла, ибо база данных и так обрабатывается pbzip2'ом, а сжатие конфигов не настолько ресурсоемко, чтобы ради этого переделывать скрипт

Конфиги

Настройки PHP

/etc/ispcp/fcgi/parts/php5/php.ini - тут находятся дефолтные настройки PHP (а рядом и другие дефолтные файлы), которые копируются юзеру при создании домена. /etc/ispcp/fcgi/parts/master/php5/php.ini - аналогично, но для самой панели.

Warning.png Внимание: при запуске скрипта обновления панели все пользовательские php.ini-файлы перезаписываются вышеуказанными
  • Настройки аплоада файлов: в php.ini для нужного домена (в частности для phpmyadmin, net2ftp):
# лимит для выполнения скриптов
memory_limit = 64M
post_max_size = 64M
# лимит для аплоада файлов
upload_max_filesize = 64M

Кроме того, в /etc/apache2/mods-enabled/fcgid_ispcp.conf/etc/ispcp/apache/working/fcgid_ispcp.conf) изменить (добавить) параметр MaxRequestLen:

MaxRequestLen 64000000

Без него может появляться 500-я ошибка при аплоаде больших файлов (в частности дампов баз в phpmyadmin), ошибку можно отловить в error_log сервера.

Скрытие версий серверов

Апач
/etc/apache2/conf.d/security
ServerTokens Prod
ServerSignature Off
proftpd
/etc/proftpd/proftpd.conf
ServerIdent                on "любая строка"

При просто "on" отдается внутренний IP-адрес и имя сервера. При off - только адрес. Чтобы убрать все, надо вставить свой идентификатор по примеру выше.

Включение AWStats

У AWStats (напомню, это софт для построения статистики посещений по логам веб-сервера) в панели есть 2 режима работы: static и dynamic, переключение производится сменой параметра AWSTATS_MODE в /etc/ispcp/ispcp.conf. В чем разница:

Dynamic-mode
  • Включается дополнительный модуль в Apache - http_proxy
  • Добавляется еще один виртуальный хост в Апачe, слушающий localhost
  • Для каждого домена добавляется запись, проксирующая запросы с каталога /stats домена через этот виртуальный хост.
  • Дефолтно запросы обрабатываются только после прохождения авторизации. Пользователи/пароли настраиваются из "Веб-инструментов" в панели
  • В итоге запросы обрабатываются напрямую Perl-скриптом awstats.pl, выполняющимся с привилегиями www-data.
  • В cron'e для обновления статистики создается запись, обрабатывающая пакетно все домены.
  • awstats.pl, вызываемый браузером, в реальном времени рисует и отдает статистику по данным, сгенерированным на бэкграунде (см. строчку про крон выше)
  • Обновление базы делается раз в 6 часов
  • Преимущество 1: обновление базы забирает очень мало ресурсов и делается достаточно быстро.
  • Недостаток 1: awstats.pl после авторизации пользователя может получить доступ к другим файлам статистики, которые лежат рядом, путем подстановки в адресной строке нужного домена, минуя авторизацию целевого домена.
  • Недостаток 2: при нахождении уязвимости в awstats.pl (и наличии своего домена на хостинге для прохождения авторизации) взломщик получит на сервере шелл с правами www-data (а, следовательно, с доступом ко всем доменам)
Static-mode
  • Для каждого домена в домашнем каталоге пользователя создается дополнительный каталог statistics
  • В конфиге виртуалхоста в Апаче делается простой редирект на этот каталог
  • Для каждого домена в /etc/cron.d/ispcp добавляется запись, вызывающая скрипт обновления статистики в /var/cache/awstats/ и генерации HTML-файлов, которые складируются в каталоге домена statistics
  • Обновление статистики для домена делается раз в день.
  • Дефолтно статистика показывается всем, при необходимости каталог можно закрыть стандартными средствами через "Защищенные страницы" в "Веб-инструментах"
  • Преимущество 1: Никаких скриптов, с которыми работает пользователь. Браузеру отдается чистая статика
  • Преимущество 2: Никаких дополнительных модулей для Апача
  • Преимущество 3: Никаких дополнительных виртуалхостов
  • Преимущество 4: Пользователь не имеет доступа к чужой статистике, если того не хочет пользователь чужого домена
  • Недостаток 1: Обновление статистики и генерация страниц кушает ресурсы процессора (ToDo: проверить зависимость от размеров логов)
  • Недостаток 2: Обновление статистики делается реже (ToDo: проверить, можно ли делать чаще. Судя по алгоритму, основной апдейт делается так же само, а потом генерятся страницы, так что можно пускать обновление как угодно часто (в разумных пределах, ибо помним про генерацию HTML'а и проц))
ToDo: Разобраться с недостатками, ибо это более секьюрный и удобный вариант (не считая нагрузки на проц)
ToDo: Проверить, что такой режим позволяет работать с подробной статистикой нескольких месяцев

Настройка dynamic-mode

При необходимости включить отключенный дефолтно awstats необходимо проделать следующее:

  • Собственно, поставить пакет awstats:
apt-get install awstats
  • В /etc/awstats/ удалить дефолтный конфиг awstats.conf (или переместить его под другое имя, например, awstats.conf.disabled)
  • В /etc/cron.d/ispcp (а также поправить файлы в /etc/ispcp/cron.d/, в частности шаблон и рабочую копию в каталоге /working/ - не знаю, надо ли - в какое время они могут перезаписывать рабочие? - но лучше сделать) раскомментировать строку для запуска обслуживающих AWStats скриптов каждые 6 часов
  • Удалить /etc/cron.d/awstats, теперь его работа делается в файле ispcp (см. выше)
  • В Apache включить модуль proxy_http, он потянет за собой модуль proxy
    • Для proxy закомментировать все параметры в /etc/apache2/mods-available/proxy.conf
  • Создать файл /etc/apache2/sites-available/01_awstats.conf, который должен генерироваться из темплейта /etc/ispcp/apache/01_awstats.conf (правки нужны минимальные)
    • Включить сайт 01_awstats.conf
  • В /etc/ispcp/ispcp.conf включить работу awstats:
AWSTATS_ACTIVE = yes

после этого в хостинг-панели в "Веб-инструментах" появится дополнительный пункт. Панель после этого начнет создавать awstats-конфиги и прописывать соответствующие записи в конфиг Апача для вновь создаваемых доменов. Для уже существующих придется это сделать вручную.

  • Не забыть перезапустить Апач, чтобы изменения вступили в силу

Настройка static-mode

ToDo: Написать

Настройки AWStats

  • В конфигах (и темплейте /etc/ispcp/awstats/awstats.ispcp_tpl.conf) есть смысл поправить параметр ErrorMessages= для того, чтобы в случае какой-либо ошибки скрывать местоположение конфигов и заменять текст на одинаковое сообщение.

Права доступа

  • Включаем Апач в группу каждого создаваемого домена. Это позволит ставить на файлы и каталоги более секьюрные права - вплоть до 400 на скрипты и 440 на обычный html. Для этого надо поправить скрипт /var/www/ispcp/engine/ispcp_common_methods.pl на строке 2275:
# Добавляем Апач в группу домена
$cmd = "/usr/sbin/usermod -a -G $sys_group www-data";
sys_command($cmd);

Внимание: в разных системах существуют разные ограничения на количество групп, в которые может входить пользователь. В BSD это вроде как 16 (соответственно, для более-менее крупного хостинга такой способ неприменим), в современном Linux'e дефолтно это 65536 (и вроде как может быть легко увеличен при необходимости).

  • При аплоаде файлов через FTP-клиент могут возникать случаи, когда права на файлы выставляются не такие, как указаны в конфиге proftpd.conf (параметр Umask 022 022). Проблема в FTP-клиенте, который пытается сохранить на сайте те же unix'овые права, что и в файловой системе. Лучше сменить FTP-клиент, чем запрещать SITE_CHMOD.

Недоработки

  • При вынесении FTP-сервера на отдельный хост может возникнуть проблема с тем, что при создании FTP-аккаунта в панели нельзя выбрать произвольный каталог - возникает ошибка "Невозможно сменить каталог, обратитесь к администратору" при нажатии кнопки-ссылки "Выбрать каталог". Проблема в том, что панель для данного запроса создает временного FTP-пользователя, который подключается к системе и получает содержимое домашнего каталога, после чего строит виртуальную файловую систему. При этом в скрипте создания этой файловой системы жестко забито подключение к localhost. Поэтому при вынесении FTP-сервера на другой хост следует в файле /var/www/ispcp/gui/include/ispCP/VirtualFileSystem.php найти строки
// 'localhost' for testing purposes. I have to study if a better
// $this->_domain would work on all situations
$this->_handle = @ftp_connect('localhost');

и вписать вместо localhost нужный IP-адрес или домен.

  • Дефолтно файлы данных awstats создаются с правами root:root 640, соответственно, веб-сервер не имеет к ним доступа. Для исправления этого надо в /etc/cron.d/ispcp после слова root добавить umask 022 ;
ToDo: Подумать насчет лучшего распределения прав
  • Awstat
ToDo: Любой пользователь хостинга может получить доступ к статистике других доменов, подставив имя домена в адресной строке. Подумать, как от этого избавиться. Кроме того, перловый скрипт выполняется с правами пользователя www-data, что не есть хорошо

Особенности настройки

PHP

  • Дефолтно в PHP отключен ряд функций, в частности
disable_functions = show_source, system, shell_exec, passthru, exec, phpinfo, shell, symlink, popen, proc_open

(иначе говоря, не пугаться, когда в файлике с phpinfo () будет белый экран)

Просто мысли

База данных и phpmyadmin

  • Потенциально для MySQL-сервера можно включить опцию skip-show-database, которая отключает для пользователей вывод списка доступных баз, что может быть полезно в плане безопасности - получив параметры подключения к одной базе, злоумышленник не знает про остальные, хотя доступ к ним и есть. Однако в таком случае phpmyadmin тоже не может получить спискок баз, соответственно, после авторизации выдает, что базы отсутствуют. Для этих целей заводится специальный пользователь, имеющий readonly-доступ к некоторым таблицам базы mysql (соответственно, имеющий доступ к списку всех баз сервера). Что является бОльшим злом - возможное получение списка баз одного пользователя при взломе сайта или получение списка всех баз при последующем возможном взломе PHPMyAdmin (который славится дырявостью) - выбирать вам.

Ссылки