我已经设置了一个用于生产的网络服务器。操作系统是 Windows Server,它运行 Apache 2.0 和 PHP 5.3 作为 apache 模块(还有 MySQL ......)。它用于托管属于不同客户的多个虚拟主机(Apache vhosts)。
此时PHP是以系统用户身份运行的。将来可能会授予客户 FTP 访问权限,因此 - 默认情况下 - 每个客户都可以通过 PHP 访问整个系统。这显然是不能接受的。
我知道我可以在 PHP 中设置 open_basedir,但我不确定它是否包含和足够可靠以被视为一个解决方案 - 它是否限制对所有 PHP 函数的访问,例如 include...?PHP 流怎么样?
我也知道 IIS 提供了解决该问题的方法,但我更愿意保留 Apache。
我最想设置的是一个可以满足以下要求(主要)的解决方案:
- 保持优雅并以某种方式自动。我正在手动管理服务器 - 我希望每个虚拟主机的设置都涉及尽可能少的设置和配置编辑。
- 允许例外。大多数托管网站都是我自己开发的,我想将它们全部链接到一个库文件夹,因此应该允许对该文件夹进行只读访问,尽管它位于虚拟主机的根目录之外。
那么,有哪些可用选项(如果有)?我已经做了一些研究,似乎该领域的大部分工作都是在 Linux 系统上完成的。
PHP 和 FTP 彼此无关。
FTP 是一种(糟糕的、不安全的、古老的)在机器之间移动文件的方式。
PHP 是一种由您的 Web 服务器执行的脚本语言。
您可以(并且可能应该)使用 IIS FTP 功能授予对您的服务器的 FTP 访问权限,同时拒绝您的用户访问诸如根卷 (
C:\
) 和您的共享库目录之类的内容。安全问题的另一半是 PHP 本身——
mod_php
不擅长多租户安全,open_basedir
也不是包罗万象的解决方案(尽管总比没有好)。如果你想要真正的安全,你几乎需要在 chroot 中为每个人提供他们自己的 Apache。
这令人不快(对于作为管理员的您而言),但安全。它也很灵活,因为您可以为每个站点修改 php.ini。
下一个最佳选择是将 PHP 作为 CGI。
您可以调用 PHP 的 CGI 解释器作为网站所有者的用户 ID - 这使您受益于操作系统的文件权限功能,并避免为每个站点维护单独的 Apache/PHP 实例。
主要缺点是 PHP 必须作为 CGI 调用,因此您失去了依赖 PHP 作为 Web 服务器模块的任何功能。
第三个最佳选择是
open_basedir
anddisable_functions
/disable_classes
。open_basedir
并没有真正保护任何东西,因为它只影响PHP:您的用户仍然可以上传/执行二进制文件来访问其他人的数据。php.ini中的
disable_functions
和disable_classes
指令让您关闭某些不安全的功能(您需要自己获取可利用类的列表)。你可以用这种方式掩盖明显的洞,但你基本上就是那个手指插在堤坝上的荷兰小男孩。你的手指只有那么多,而且总会多出一个洞……
您绝对不应该将 Apache 运行为
Local System
(或任何具有提升权限的帐户)。在将此服务器投入生产之前,请确保根据 Apache 文档中的最佳实践对其进行配置。
我已经通过以下组合解决了这个问题:
它绝不是最安全的解决方案,但通过定期备份,它应该足以托管一些低调的网站。
更新(大约一年后):这个设置救了我——如果在这种情况下可以这么说的话。我的一个虚拟主机是一个过时的 Wordpress 安装,它被感染了。我可以看到在 PHP 日志中创建了奇怪的临时文件。vhost 通过 open_basedir 受到限制,我认为它包含问题 - 恐怕我的所有文件,而不仅仅是这个 vhost 的文件,如果不是因为这个,都会受到损害。