好的,假设我的 Apache 配置中有两个虚拟主机。一个定义了 example.com 的目录和,而另一个定义了 second.org 的目录。apache 的服务器根目录是/var/www/
,两个服务器的文档根目录分别是var/www/example
和var/www/second
。如果 PHP 脚本位于 中var/www/example
,它可以读取整个系统文件。它还可以读取和执行/var/www/
目录内的任何内容。这意味着 example.com 上的脚本可用于运行或读取 second.org 上的脚本。
我希望能够锁定每个虚拟主机,以便每个 PHP 脚本只能读取 /var/www/virtualdomain 目录。有点像共享托管服务器,如果您尝试运行如下脚本:
<?php
$dir = '/var/www/otheruser';
$files1 = scandir($dir);
$files2 = scandir($dir, 1);
print_r($files1);
print_r($files2);
?>
答案1
处理这个问题一般有两种方式:
- 以单独的用户身份运行您的 PHP 进程。
- 配置 PHP 以保留在其文档根目录中。
两者都有其缺点。
保护 PHP允许您设置文档根目录在启用 PHP 的安全模式功能时,虚拟主机应在其中运行。稍微更动态的配置是使用open_basedir(无需安全模式即可使用)但依赖于正确的 Apache 配置。我认为这些配置都不是很好的安全功能,因为它不考虑外部库,并且使安全性依赖于 PHP 实现,而不是操作系统。
使用 Apache 以单独用户身份运行 PHP 将需要第三方模块或特定配置。通常,PHP 是作为 Apache 中的一个模块构建的,因此所有 PHP 脚本都以与 Web 服务器相同的用户身份运行。类似苏普或者mod_ruid将从 root 特定用户中删除一个进程并继续请求。这将需要以 root 身份运行 apache 并编译一些模块,更不用说可能的安全漏洞了。我不推荐这些设置。
您还可以使用以下方式切换到 PHP-FPMmod_fastcgi或者修改代理服务器。这将要求您为每个想要为其提供一个或多个虚拟主机的用户设置一个 PHP-FPM“池”。PHP-FPM 将以此特定用户身份运行,并在启动时设置为特定权限。您还可以为每个 PHP-FPM 池进行特定的 PHP(ini)配置设置。
答案2
在单独的用户上下文中为每个 vost 运行 php 进程并适当地设置文件系统权限。