我有一台 FreeBSD 服务器(公司选择的操作系统)。目前我们在每个 Web 服务器上运行多个网站。网站使用 PHP,以 Apache 模块模式运行。Apache 没有 chrooted,因此 Apache 和 PHP 可以访问整个文件系统。
对于我的私人网站,我使用共享托管服务。服务提供商似乎正在运行定制的 Apache 版本。有趣的是,服务器上的每个网站(我猜是 VirtualHost)都已 chroot 到 DocumentRoot。我该如何在我的 Apache 设置上执行此操作?
我看过Apache 的 ChrootDir这对我来说已经足够好了,但它在处理 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 还存在很多问题。不过我还没来得及解决这些问题。
所以,我的问题是:
- 如何将每个 VirtualHost chroot 到其 DocumentRoot?
- 如何正确地 chroot Apache 的全局 DocumentRoot 以使其与 VirtualHosts 和 SSL 一起工作?
答案1
#1) 不支持单独对虚拟主机进行 Chrooting。ChrootDir 指令的“上下文”是“服务器配置”,因此...
“这意味着该指令可以在服务器配置文件(例如 httpd.conf)中使用,但不能在任何容器中使用<VirtualHost>
。.htaccess<Directory>
文件中根本不允许使用该指令。”[1]
除此之外,它已经运行良好,尽管有一些烦人的警告,但很容易消除。只是...
cd / ; ln -s /usr/local/www/apache24/data 。
...这样,不仅虚假和烦人的警告会消失,而且您还将获得一条通往 Apache 的 ChrootDir 目录的简短而方便的路径。
就我 [是的,FreeBSD 也是] 的情况而言......
cd / ; ln -s /usr/local/www/apache24/data/vhosts 。
...我认为这更好一些,但每个人都有自己的想法。
2)你是此处“chroot[ing] Apache 的全局 DocumentRoot”。如前所述,这就是所支持的全部。如果您使用 ServerName 指令和其他任何您想要的内容完成配置,您的 /test-? 目录将可以很好地用作虚拟主机。SSL 也一样。
*) 关于您的提供商,他们可能会采取各种措施来实现隔离。目前还不能确定。抱歉。
*) 最后,由于您使用的是 PHP,您可能还想在 php.ini 文件中设置“open_basedir”,以同样的方式锁定它。请注意,这能通过在每个虚拟主机的定义中包含如下内容来为每个虚拟主机单独设置...
php_admin_value open_basedir“/数据/测试-1”
[1]http://httpd.apache.org/docs/2.4/mod/mod_unixd.html#chrootdir
答案2
可以说这是一个错误。问题在于 Apache 在实际启动之前会检查您的配置文件,出于多种原因,这完全合理。但这意味着检查是在发出 chroot 系统调用之前运行的,因此找不到目录。忽略该消息是安全的,但除了编辑 Apache 的代码之外,没有其他方法可以消除它们。