在带有 的 Gentoo 3.2.12 服务器上apache2+php
,有几个网站正在运行:
/www
/website1
/website2
...etc
用户apache
应对所有网站拥有只读访问权限。每个网站内还有一些文件夹apache
应具有读写访问权限(上传文件夹等)。
有几个人在这些网站上工作。每个人都应该拥有对其工作网站的读写访问权限,但其他人则没有权限。此外,他们应该能够设置权限(在其网站内),以便apache
可以写入某些文件夹(好吧,如果他们创建新的上传文件夹或其他文件夹)。
/www
其他用户根本不应该访问。
这可以做到吗?如何做到?
(PS。另外...由于这些人可以上传 PHP 脚本,然后在 Apache 的上下文中执行,我猜他们也可以间接访问其他网站...是否也可以保证这一点?我不能想办法,但谁知道呢......)
答案1
一种方法是这样的:
- 每个站点都有一个组,让该组中的人员使用,
umask 0002
以便他们创建的文件默认可供该组读/写,并且默认情况下可供其他人读取。 chmod a-rwx
每个站点的根目录,以防止允许组之外的人员访问。- 除了其他权限之外,还为您的文件系统和
setfacl -m user:apache:rx
该目录启用 ACL,以向用户授予读取访问权限。apache
至于apache进程创建的文件:
- 相关组应该可以读取 apache 用户创建的文件,只要它们被创建为世界可读的。
- 只要文件驻留在组可写目录中,就可以删除它们。
- 如果这还不够,您可以允许您的用户使用
sudo
apache 用户。也许只是为了执行特定命令,例如使用 ACL 添加组写入权限。
但正如您所说,如果用户可以以 apache 用户身份运行任意脚本,则可以绕过所有读取限制。为了解决这个问题,您可以尝试以相应组中的特定用户身份执行一个站点的脚本。我相信有一种方法可以使用 进行设置mod_fcgid
。否则apache[suexec]
可能php[cgi]
适合你。
为了获得更好的隔离,您必须有多个 apache 进程,以不同的用户身份运行,甚至可能 chroot 到不同的目录。或者在不同的 OpenVZ 单元中,或者不同的 Xen domU 中,或者在不同的硬件上。正如您所看到的,有许多不同的隔离级别,每个级别都提供比之前更好的隔离,但代价是需要更多的资源。
答案2
通常的解决方案是超PHP。