我们有一个公司的服务器与各种网站。 他们由我们公司内的不同人员维护。 所有网站都是公开的。 服务器访问仅限于我们公司。 这不是共享主机环境。
我们正在考虑保护服务器,目前正在分析与文件权限有关的风险。 我们觉得上传文件,然后公开打开/执行文件的风险最高。 这不应该发生,但脚本中的错误可能允许人们这样做(有图像上传,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 VirtualHost
configuration包含上传文件的目录(如果您必须接受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个。
该死的权利,这不应该发生 – 如果你是该网站的pipe理员这是你的错,它已经发生
我们正在考虑mod_php和FastCGI,
这与您目前遇到的问题无关 ,也不涉及如何使系统安全。
首先您需要的是一个权限模型和stream程,以支持以受控方式将代码部署到服务器。
一种方法是为每个项目设置一个排除Web服务器uid的组,然后将所有文件作为rw-rw-r部署给用户和开发组 – webserver依靠“其他”权限来读取文件。 设置组粘贴位设置的所有目录。
每个项目都应该位于文档根目录下的自己的子目录中,并且每个项目都应该有一个可由webserver uid在文档根目录之外写入的上传目录,并且至less有一个专用(每个组)包含文档根目录之外的目录应该是在自己的虚拟主机)。 访问应该由open_basedir限制
发布一个编码标准,该标准应该指定不能从标准设置中操作权限 – 并且调整你的IDS以获取任何添加的PHP文件或权限改变。
但还有其他的模式。
重要的是:
networking服务器永远不能写入通过networking服务器直接访问的文件。
如果用户上传的内容是可访问的,则应该在上传时进行清理,并通过控制器脚本进行访问。
在恶意代码部署在服务器上的情况下,应该严格限制其可以执行的损害的数量
应该可以检测系统上的代码更改时间
你的权限模型应该防止一个项目干扰另一个项目的行为(例如,假设你有一个共同的'包括'目录 – 即使不同的项目不能修改其他的文件,他们可以通过在其他地方使用相同的文件名掩盖行为包含path – 或者更糟的是通过使用相同的函数或类名称来创build错误两次)。