自己的服务器,多个网站:最安全的PHP设置

我们有一个公司的服务器与各种网站。 他们由我们公司内的不同人员维护。 所有网站都是公开的。 服务器访问仅限于我们公司。 这不是共享主机环境。

我们正在考虑保护服务器,目前正在分析与文件权限有关的风险。 我们觉得上传文件,然后公开打开/执行文件的风险最高。 这不应该发生,但脚本中的错误可能允许人们这样做(有图像上传,file upload等)。 上传器脚本使用PHP

所以问题是:设置/组织文件和进程权限的最佳方式是什么? 似乎有几个选项来运行PHP(和Apache),并设置权限。 我们应该考虑什么? 有小费吗?

我们正在考虑mod_php和FastCGI,但也许考虑到我们的情况,其他解决scheme是首选?

我强烈build议运行suPHP 。 使用suPHP,每个网站可以划分到自己的用户名,而不是像普通的Apache用户那样运行。 这意味着如果有人由于服务器上的脚本不安全而“碰巧”进入服务器, 他们将仅限于该网站,而不是整个服务器。 唯一的例外是,如果有一个根漏洞,他们可以访问整个服务器…但至lesssuPHP将有助于安全每个单独的网站。

一旦你有不同的用户的Apache / PHP的服务器上的文件的读/写权限变得重要。 您还可以从组织的angular度更充分地利用权限,允许用户在网站上更新文件,而不仅仅是更新文件。

两个更多的select与不同的安全:

  • 在Apache上suexec。 Apache可能会吃掉记忆。 (并不与我相信的fcgi)

  • 虚拟设备,每个站点一个。 这个解决scheme当然提供了关于php版本的最大自由(我运行openvz获得了巨大的成功)。

问,/吨

  • 上传文件默认保存在/var/tmp ,因此将其挂载为+noexec +nosuid并且使用php_flag engine 0 (参考:PHP手册)为Apache VirtualHostconfiguration包含上传文件的目录(如果您必须接受file upload – 否则,在你的php.ini设置file_uploads 0

  • php.ini设置allow_url_fopen 0 (以防万一你的编码人员有明确的想法包含URL),并考虑Suhosin,如果你有任何有问题的编码员

就mod_php / fastcgi而言,我更喜欢php-fpm的FastCGI实现,它现在被包含在PHP中(自5.33开始)。 PHP-FPM给每个“池”(网站)自己的进程(dynamic或静态),它服务于PHP。 apache / nginx中的每个虚拟主机连接到自己的特定端口上的php-fpm池(即9000)。 这基本上和suExec完成同样的事情,每个php进程/请求都是“Exec”,因为它是自己的用户(你指定每个池的用户:组,应该被chrooted / jailed)。

这也提供了更细粒度的内存使用控制,并分离了静态文件/图像和dynamic内容(PHP)的处理。由于这种分离,Apache在服务静态内容时不会将PHP加载到其进程中。 当使用mod_php时,即使有一个静态请求(其中30个是php),每个来自用户的请求都需要一个〜40MB的进程。 至less这是我的理解…如果我错了,请纠正我。

您可以设置一个池(www.domain1.com),使其具有5个静态PHP进程来处理请求,另一个池(www.domain2.com)有10个进程,最less为30个。

http://php-fpm.org/about/

该死的权利,这不应该发生 – 如果你是该网站的pipe理员这是你的错,它已经发生

我们正在考虑mod_php和FastCGI,

您目前遇到的问题无关 ,也不涉及如何使系统安全。

首先您需要的是一个权限模型和stream程,以支持以受控方式将代码部署到服务器。

一种方法是为每个项目设置一个排除Web服务器uid的组,然后将所有文件作为rw-rw-r部署给用户和开发组 – webserver依靠“其他”权限来读取文件。 设置组粘贴位设置的所有目录。

每个项目都应该位于文档根目录下的自己的子目录中,并且每个项目都应该有一个可由webserver uid在文档根目录之外写入的上传目录,并且至less有一个专用(每个组)包含文档根目录之外的目录应该是在自己的虚拟主机)。 访问应该由open_basedir限制

发布一个编码标准,该标准应该指定不能从标准设置中操作权限 – 并且调整你的IDS以获取任何添加的PHP文件或权限改变。

但还有其他的模式。

重要的是:

  • networking服务器永远不能写入通过networking服务器直接访问的文件。

  • 如果用户上传的内容是可访问的,则应该在上传时进行清理,并通过控制器脚本进行访问。

  • 在恶意代码部署在服务器上的情况下,应该严格限制其可以执行的损害的数量

  • 应该可以检测系统上的代码更改时间

  • 你的权限模型应该防止一个项目干扰另一个项目的行为(例如,假设你有一个共同的'包括'目录 – 即使不同的项目不能修改其他的文件,他们可以通过在其他地方使用相同的文件名掩盖行为包含path – 或者更糟的是通过使用相同的函数或类名称来创build错误两次)。