Заметки по созданию хостинга на базе панели ISP Control

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску

Бэкап

Использование многопоточной архивации на 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 (а рядом и другие дефолтные файлы), которые копируются юзеру при создании домена.
  • Настройки аплоада файлов: в php.ini для нужного домена (в частности для phpmyadmin, net2ftp):
# лимит для выполнения скриптов
memory_limit = 64M
post_max_size = 64M
# лимит для аплоада файлов
upload_max_filesize = 64M

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

MaxRequestLen 128000000

Без него может появляться 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: проверить, можно ли делать чаще)
  • Недостаток 3: статистика дефолтно показывается всем (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-конфиги и прописывать соответствующие записи в конфиг Апача для вновь создаваемых доменов. Для уже существующих придется это сделать вручную.

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

Настройки 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 (который славится дырявостью) - выбирать вам.

Ссылки