如何在Apache服务器上chroot VirtualHosts?

我有一个FreeBSD服务器(公司的首选操作系统)。 目前,我们在每个networking服务器上运行多个网站。 网站是在PHP模式下运行的PHP模块。 在Apache不chrooted所以Apache和PHP可以访问整个文件系统。

对于我的私人网站,我使用共享托pipe服务。 看来服务提供商正在运行一个定制的Apache版本。 有趣的是,服务器上的每个网站(VirtualHost我设定的)都是根据文件根目录。 我将如何去做这个在我的Apache设置?

我已经看了Apache的ChrootDir ,这对我来说已经足够好了,但是在处理VirtualHosts或者我无法正确设置的时候,这个问题还是有的。 虽然它似乎运行良好 – 可以访问VirtualHosts – 似乎有一个问题,当(重新)启动Apache。 我得到了VirtualHosts DocumentRoot的警告。 configuration摘录:

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的问题还有很多。 尽pipe如此,还没有解决这些问题。

所以,我的问题是:

  1. 如何将每个VirtualHost chroot到它的DocumentRoot?
  2. 如何正确地chroot Apache的全局DocumentRoot使其与VirtualHosts和SSL一起工作?

这是一个错误,可以这么说。 问题是,Apache在实际启动之前检查你的configuration文件,因为一些原因是非常有意义的。 但是这意味着检查在发出chroot系统调用之前运行,所以没有find该目录。 忽略这个消息是安全的,但是没有办法摆脱编辑Apache代码的困难。

#1)不支持单独对虚拟主机进行Chroot。 ChrootDir指令的“上下文”是“服务器configuration”,因此…

“这意味着该指令可以在服务器configuration文件(例如httpd.conf)中使用,但不能在任何<VirtualHost><Directory>容器中使用,在.htaccess文件中根本不允许。 [1]

否则它已经在为你工作,虽然烦人的警告很容易摆脱。 只是…

cd /; ln -s / usr / local / www / apache24 / data。

…然后,不仅虚假和烦人的警告将消失,而且您将有一个很好,短而方便的path到Apache的ChrootDir目录。

在我的[是的,也是FreeBSD]的情况下,是…

cd /; ln -s / usr / local / www / apache24 / data / vhosts。

…我认为这是一个更好的,但每个他自己的。

#2)您在这里 “chroot Apache的全局DocumentRoot”。 如上所述,这就是所有的支持。 你的/testing? 目录将作为虚拟主机很好,如果你完成configurationServerName指令和其他任何你想要的。 与SSL相同。

*)关于你的提供者,他们可能会做各种事情来实现他们的隔离。 从这里不说。 抱歉。

*)最后,由于您使用的是PHP,因此您可能还需要在php.ini文件中设置“open_basedir”以将其类似地locking。 并且请注意, 可以通过在每个虚拟主机的定义中包含以下内容来为每个虚拟主机单独设置此function

php_admin_value open_basedir“/ data / test-1”

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