suPHP 和 Apache DBD:仅更改 GID

suPHP 和 Apache DBD:仅更改 GID

(注意:如果您熟悉 suPHP 设置并且想要跳过问题的详细信息,您会在最后找到我想要实现的目标的快速解释)

我目前正在设置一台机器来托管多个网站,这些网站属于多个用户。为了方便起见,这些用户存储在 MySQL 数据库中。libnss-mysqlpam-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-datausers(偏执模式),但执行用户必须是脚本所有者(所有者模式)简单来说:

# 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),还是比较完整的。

相关内容