(注意:如果您熟悉 suPHP 设置并且想要跳过问题的详细信息,您会在最后找到我想要实现的目标的快速解释)
我目前正在设置一台机器来托管多个网站,这些网站属于多个用户。为了方便起见,这些用户存储在 MySQL 数据库中。libnss-mysql
并pam-mysql
用于连接此后端和 Linux,从而允许这些用户登录并使用机器的服务。存储在 MySQL 数据库中的每个用户都属于该users
组。
每个用户在 下都有一个主目录/home/users
。例如,用户test
的文件可以在 下找到/home/users/test
。此目录具有以下所有权/权限:
drwx--x--- test www-data /home/users/test
同样,网站索引(和其他文件)显示以下权限:
-rw-r----- test www-data /home/users/test/index.php
-rw-r----- test www-data /home/users/test/robots.txt
为了允许访问这些网站,在 Apache 中配置了以下 VirtualHost,使用 DBD 并依赖于 MySQL 后端。
<VirtualHost *:80>
ServerName *
DBDriver mysql
DBDParams host=localhost,user=user,pass=pass,dbname=db
DBDocRoot "SELECT document_root FROM users WHERE domain=%s" HOSTNAME
</VirtualHost>
如果关联的域test
是 example.com,Apache 将使用 DBD 来匹配此域/home/users/test
并提供其内容。例如,example.com/index.php将把索引传递给 PHP 解释器,而example.com/robots.txt将让 Apache 将文件作为静态内容传送。
现在,为了保护我的用户免受彼此攻击,我想限制他们的 PHP 脚本的权限。使用上述设置,PHP 脚本将通过 Apache,并由 解释mod_php
。问题是: 中的 Apache 进程由 运行www-data:www-data
,它允许访问所有房屋任何脚本。
为了防止这种情况,我决定安装 suPHP,但我的问题是:suPHP 和 DBD MySQL 查找实际上不能很好地协作:
- 如果我编译 suPHP偏执模式,我必须为所有请求。但是, 中的脚本
/home/users/test
必须作为 运行test:users
, 而 中的脚本/home/users/othertest
必须作为 运行othertest:users
。
问题出现在配置中:
<VirtualHost *:80>
ServerName *
suPHP_Engine on
# The user is stored in the database, it can't be set statically.
suPHP_UserGroup ??user?? users
DBDriver mysql
DBDParams host=localhost,user=user,pass=pass,dbname=db
DBDocRoot "SELECT document_root FROM users WHERE domain=%s" HOSTNAME
</VirtualHost>
如果我编译 suPHP所有者模式
test:www-data
,则所有 PHP 脚本都将以而不是 的形式执行test:users
。这还将在所有主目录中提供权限。如果我将所有文件设置为
test:users
所有权/home/users/test
(并使用所有者模式),那么 Web 服务器就无法再访问它,甚至无法传递静态内容。
总而言之
有什么方法可以结合 DBD MySQL 和 suPHP,并在两者之间实现某种效果吗?偏执模式和所有者模式?我需要将执行组从 更改www-data
为users
(偏执模式),但执行用户必须是脚本所有者(所有者模式)简单来说:
# The following script must be interpreted as test:users.
-rw-r----- test www-data /home/users/test/index.php
# The following script must be interpreted as othertest:users.
-rw-r----- othertest www-data /home/users/test/index.php
答案1
我不确定我是否理解了您的问题,但如果您试图限制不同用户之间的执行和访问,同时删除其他用户读取的权限并允许 www-data 访问这些文件,您可以尝试执行以下操作:
- 使用 paranoid setid-mode 编译 suphp
- 使用您已有的虚拟主机配置和权限
- 使用扩展 acl 授予 www-data 用户对指定文件夹的读取权限(setfacL)
Suphp 使用 setuid 模拟脚本执行,它将基于与 suPHP_UserGroup 值进行比较后的文件系统权限。使用扩展 acls 将允许 www-data 用户访问所有文件,但不允许执行 php 脚本,因为它未在 suPHP_UserGroup 指令中指定。
在文件和文件夹上添加扩展 acl 之前,您需要在 /home 文件系统上添加 acl 选项(将其添加到 fstab 并重新挂载文件系统就可以了)。
您可以在 setfacl 的手册页上获得有关它的更多信息 (http://linuxcommand.org/man_pages/setfacl1.html),还是比较完整的。