标准PHP生产环境设置

3

背景

我最近在一台我有root访问权限的主机上设置了一个基于php的网站。我按照linode.com上的指南安装了一个基于lamp的设置,现在我想知道该如何处理php文件权限、目录权限,以及哪些用户应该在哪些组中运行哪些进程。

特别是,我想知道“标准的php网站在ACLs、所有权和生产ids方面应该如何配置?”这个问题的答案。

目前,任何目录列表都会返回以下内容:

-rw-r--r--  1 root    root   70 Nov  8 17:17 index.php

我看到Apache网服务器运行为名为www-data的用户,因此我可以假设php将作为同一用户运行(可能是将继承相同用户的子进程)。
对所有文件设置chmod 640并将自己(用户bob)设置为所有者是否有问题?创建一个名为productionIDs的组,其中包含www-data用户,并将文件的组设置为productionIDs是否合适?
在我看来,这样以最小特权为安全。除了我自己和Web服务器之外还有谁?只有我需要编写文件,Web服务器只需要读取。没有其他人需要做任何事情。
我的设置无法处理存在多个开发人员的情况,但我不确定该情况应该是什么样子。
那么,640拥有者是我,组Web服务器组是否存在任何风险?如果有,相应的目录750也安全吗?
如果不是,为什么没有更多人使用这种配置?
在“尝试并查看”理论下,它可以正常工作。因此,问题现在包括“此配置不允许什么/此配置的缺点是什么”的方面。

你所问的问题很大程度上取决于系统的工作方式。可以直接说的是,你不应该以root身份创建PHP文件。这只是出于安全考虑而提醒一下。实际上回答你的问题需要写一本书,这也不是一个好的提问方式。 - hakre
该问题要求您描述一个理想的用户+组+文件权限配置,以确定理想的生产设置。它不涉及文件是如何到达那里的,如果文件神奇地出现在其他人(非root)的用户下,并且即将撤销他们的特权,那么情况也是一样的。 “未来设置应该是什么样子”的问题保持不变。如果它取决于任何事情,那么我应该在问题中包含它,并且您应该在答案中询问它。 - Dan
如果你关心的是系统配置问题,那么这个话题就不在这里讨论了。你可能想去superuser或者更好的serverfault上问问。 - hakre
1
上下文是PHP,超级用户对于我之前给出的原因来说是无关紧要的,现在为了完整起见,我再次解释一下:如果涉及的文件是由另一个被撤销权限的非超级用户创建的,那么情况也是一样的。 - Dan
它仍然存在。你仍然只关心640模式意味着什么(urw&gr)以及750意味着什么(urwx&grx)。将其简化到这一点,我首先看到的是一个配置问题。这在很大程度上取决于Web服务器的配置以及如何调用PHP,并基于该配置允许系统资源的PHP脚本允许或不允许。此外,我无法理解您在问题中写的内容,关于“为什么其他人不这样做”。对我来说,它看起来更像是一个常见的设置,而不是一个不常见的设置。 - hakre
1个回答

2
首先,您的文件绝对不应该由root:root拥有。应该使用一个用户名和通用组来拥有所有权。
虽然最初网页服务器用户只需要读/执行访问您的文件,但在某些情况下,该用户可能需要针对上传或应用程序日志等特定文件夹进行写访问。
因此,我们针对PHP应用程序的典型设置是文件的644(640也可以),文件夹的755(750也可以)。请注意,我们将文件设为每个人都可读的原因有几个。首先,它允许其他用户在没有修改代码的能力的情况下审计服务器上的代码。其次,在生产托管服务器上,我们只有开发人员用户,因此任何具有帐户的人都具有查看所有代码的信任级别。在其他环境中,这种情况可能会有所不同。
关于您提出的问题:是否使用网页服务器组作为组所有者,我们通常不这样做。虽然您可以使用该组,但我们喜欢保留所有系统安装组并为应用程序文件创建特定组。然后,我们只需将网页服务器用户添加到新组即可。

谢谢,所以OWNER应该是创建它的人类用户,www-data用户应该被添加到一个组(比如php-readers),并且php-readers应该是文件的GROUP。将其他人设置为0的唯一原因是如果您的代码中有不想让其他开发人员看到的秘密。 - Dan
@Dan:对于这个群组不一定。但是,就写好的内容而言那个取决于服务器配置和你的需求。 - hakre
@Dan,是的,这就是我们的做法。而且,有时候为了正好你提到的那个原因,我们会将其他值设置为0!;) - davidethell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接