Назад | Перейти на главную страницу

Как chroot VirtualHosts на сервере Apache?

У меня есть сервер FreeBSD (ОС компании по выбору). В настоящее время у нас есть несколько веб-сайтов на каждом из веб-серверов. Веб-сайты находятся на PHP, который работает в режиме модуля Apache. У Apache нет chrooted, поэтому Apache и PHP имеют доступ ко всей файловой системе.

Для своих частных сайтов я использую общий хостинг. Кажется, что поставщик услуг использует настроенную версию Apache. Что интересно, каждый веб-сайт (я полагаю, VirtualHost) на сервере привязан к DocumentRoot. Как я могу это сделать при настройке Apache?

Я посмотрел на ChrootDir Apache что почти достаточно для меня, но либо проблема с обработкой VirtualHosts, либо я не могу его правильно настроить. Хотя кажется, что он работает нормально - может получить доступ к VirtualHosts - кажется, есть проблема при (повторном) запуске apache. Я получаю предупреждения для VirtualHosts DocumentRoot. Экстракт конфигурации:

ChrootDir "/usr/local/www/apache22/data"
DocumentRoot "/"

<VirtualHost *:80>
    DocumentRoot "/test-1"
    ServerName test-1.example.com
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/test-2"
    ServerName test-1.example.com
</VirtualHost>

И предупреждения:

Warning: DocumentRoot [/test-1] does not exist
Warning: DocumentRoot [/test-2] does not exist

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

Итак, мои вопросы:

  1. Как привязать каждый VirtualHost к его DocumentRoot?
  2. Как правильно chroot глобального DocumentRoot Apache, чтобы он работал с VirtualHosts и SSL?

# 1) Исключение виртуальных хостов по отдельности не поддерживается. «Контекст» для директивы ChrootDir - «конфигурация сервера», и поэтому ...

"Это означает, что директива может использоваться в файлах конфигурации сервера (например, httpd.conf), но не в каких-либо <VirtualHost> или <Directory> контейнеры. Это вообще не разрешено в файлах .htaccess. "[1]

В остальном он уже работает нормально, хотя и с раздражающими предупреждениями, от которых легко избавиться. Просто...

CD / ; ln -s / usr / local / www / apache24 / data.

... и тогда не только исчезнут ложные и раздражающие предупреждения, но у вас будет удобный, короткий и удобный путь к каталогу Apache ChrootDir.

В моем [да, FreeBSD тоже] случае это было ...

CD / ; ln -s / usr / local / www / apache24 / data / vhosts.

... что мне кажется немного приятнее, но каждому свое.

# 2) Вы являются Здесь "chroot [ing] глобальный DocumentRoot Apache". Как сказано, это все, что поддерживается. Ваш / test-? каталоги будут прекрасно работать как виртуальные хосты, если вы завершите их настройку с помощью директив ServerName и всего, что вам нужно. То же самое с SSL.

*) Что касается вашего провайдера, он может делать все возможное, чтобы добиться своей изоляции. Отсюда нечего сказать. Сожалею.

*) Наконец, поскольку вы используете PHP, вы можете также установить open_basedir в вашем файле php.ini, чтобы заблокировать его аналогичным образом. И обратите внимание, что это жестяная банка быть настроенным индивидуально для каждого виртуального хоста, включив что-то вроде следующего в определение каждого виртуального хоста ...

php_admin_value open_basedir "/ data / test-1"

[1] http://httpd.apache.org/docs/2.4/mod/mod_unixd.html#chrootdir

Так сказать баг. Проблема в том, что Apache проверяет ваш файл конфигурации перед фактическим запуском, что имеет смысл по ряду причин. Но это означает, что проверка выполняется до запуска системного вызова chroot, поэтому каталог не найден. Это сообщение безопасно проигнорировать, но от него невозможно избавиться, кроме редактирования кода Apache.