适用于多个 Apache/PHP 站点的理想权限方案

适用于多个 Apache/PHP 站点的理想权限方案

我在一台服务器上托管多个网站,每个网站都有自己的用户,主目录中有 www 目录。目前我们的 Web 服务器以用户 nobody(99) 的身份运行。我们注意到,要运行几个流行的脚本和引擎,它们需要对自己的文件具有写访问权限。

由于主目录归用户所有,而不是无人(99),最好的策略或托管配置更改是什么:

  • ...使各种引擎和平台都能正常工作?
  • ...仍然允许我们操作文件并编辑它们而无须以 root 身份操作权限?
  • 不需要我在每次文件更改时调整权限和/或所有权。

感谢您的建议!

答案1

您应该考虑扩展 ACL。FreeBSD 和 Linux 均支持 setfacl 命令,它允许您定义多个有权访问每个文件/目录的用户/组。然后,您可以为 nobody 用户/组授予 /home /home/user 的“执行”权限。然后,仅在需要的站点的文档根目录上进行读写。

如果失败了,您只需将每个用户的主目录的组更改为 nobody,并在 /home/username 上使用 710 的权限,然后在文档根目录上使用 chown user:nobody 和 chmod 770。

请记住,“nobody”用户将需要对 / 和文档根目录之间的每个目录具有“执行”权限(查看特定权限或“其他”字段),然后对文档根目录进行读取(并可选择写入)。您可以禁止所有其他用户对用户目录或文档根目录进行读取或执行。在 /home 中,除了 root 之外,没有其他人具有读取权限,所有用户都只有执行权限,这种情况并不罕见。然后他们可以访问 /home/username,但无法获取服务器上存在的其他用户的列表

答案2

chown -R :nobody root_of_all_sites
chmod g+rw -R root_of_all_sites

基本上,您使站点组可写,并指定无人组对其进行读写。您可能需要定期设置它(如果用户上传新文件或有不同的机制 - umask 等)

答案3

这些网站的用户是否相互信任?如果是,用户自己处理这个问题相当容易。用户需要做的就是使用以下命令使相应目录可供所有人访问/写入:

chmod o+wx dir
chmod o+w dir/files_webserver_should_edit*

如果用户想要确保能够访问该目录中创建的文件,用户还可以运行

chmod g+s dir

这样,Web 服务器创建的文件就不属于任何人,而属于用户组(尽管 PHP 脚本需要确保创建具有组访问权限的文件)。这o+s将使文件归用户所有,但如果文件的权限不正确,这可能会拒绝 Web 服务器访问它创建的文件。如果某些文件不应该由 Web 服务器写入,您可以更进一步,

chmod o+t dir
chmod g-w dir/files_not_to_be_altered*

如果用户对某个目录有写权限,但对该目录中的文件无写权限,则他们可以从目录中删除该文件并创建一个他们有写权限的新文件。粘性位 (o+t) 可防止用户从目录中删除不属于他们的文件。结合这些功能,PHP 脚本可以创建新文件并更新和删除他们创建的文件(因为它们将归“nobody”所有),但无法编辑“files_not_to_be_altered”并且无法删除它们,因为它们归“user”所有。

这使用户可以控制哪些目录实际上可由 Web 服务器写入,并且不需要 root 访问权限,因为它不会改变所有权。

如果用户之间不信任,那么你需要一点 root 干预。每个网站的目录结构都需要调整一次以转换其所有权:
注意:这些说明假设 nobody 的组也是 nobody,但有些系统使用 nogroup

chown -R user:nobody /some/website
chmod -R g+rX,o-rwx /some/website

(大写 X 添加 x 个目录访问权限)

这将使目录树仅对用户开放,其他任何人都无法访问,并删除其他所有人的访问权限。用户可以自行从那里继续,授予g+w他们想要的访问权限,但他们必须使用u+s而不是 来g+s确保他们有权访问由网络服务器创建的文件。o+t将按预期工作。

顺便说一句,您可能有其他使用 nobody/nogroup 的服务器...为了尽量减少替代攻击方法(以 nobody 身份运行的其他一些服务中的漏洞使攻击者能够在这些网站上写入内容),大多数系统都有一个专用的 Web 服务器用户/组,只有 Web 服务器以此身份运行。

答案4

为了获得最佳性能,您应该以单独的用户身份运行 PHP 脚本,并设置文件的所有者,以便 Apache 用户仅对它们具有读取权限。

最简单的方法是使用 SuPHP:http://www.suphp.org/

另一个选项是在 CGI 模式下运行 PHP,并确保 Apache 配置为在其自己的用户 ID 下执行每个 CGI。说明如下:

http://php.net/manual/en/security.cgi-bin.php

相关内容