Заметки по созданию хостинга на базе панели ISP Control
Бэкап
Использование многопоточной архивации на 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: доработать панель, чтобы статистику можно было закрывать паролем)
Настройка 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 ;
- Awstat
Особенности настройки
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 (который славится дырявостью) - выбирать вам.
Ссылки
- Официальный сайт
- Официальный форум (часто спамится, но можно найти что-то полезное)