suPHP和Apache DBD:仅更改GID

(注意:如果您熟悉suPHP设置,并且想要跳过问题的详细信息,可以在最后find我想要实现的内容的快速解释)

我目前正在设置一台机器来承载几个网站,属于几个用户。 为了方便起见,这些用户存储在MySQL数据库中。 libnss-mysqlpam-mysql用来连接这个后端和Linux,因此允许这些用户login和使用机器的服务。 存储在MySQL数据库中的每个用户都属于users组。

这些用户中的每一个都在/home/users下被提供一个主目录。 例如,用户test的文件可以在/home/users/test下find。 该目录具有以下所有权/权限

 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中使用DBD并依靠MySQL后端来configuration以下VirtualHost。

 <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解释。 事情是:由www-data:www-data运行的Apache进程,可以访问任何脚本的所有家庭

为了防止这种情况,我决定安装suPHP,但这里是我的问题:suPHP和DBD MySQL查询实际上没有很好的配合:

  • 如果我以偏执模式编译suPHP,我必须为所有请求设置一个静态用户和组。 但是, /home/users/test脚本必须以test:users身份运行,而/home/users/othertest必须以其他/home/users/othertest运行。

这是configuration中发生问题的地方:

 <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,那么所有的PHP脚本都是作为test:www-data执行的test:www-data而不是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 

我不确定是否理解了您的问题,但如果您试图限制不同用户之间的执行和访问,同时删除其他人的读取权限并允许www-data访问这些文件,则可以尝试执行以下操作:

  • 编译suphp偏执setid模式
  • 使用您已拥有的虚拟主机configuration和权限
  • 使用扩展的acls为指定文件夹(setfacL)上的www-data用户授予读取权限

Suphp通过使用setuid模拟脚本执行,与suPHP_UserGroup值比较后,将基于文件系统权限。 使用扩展acl将允许www数据用户访问所有文件,但不会允许执行php脚本,因为它没有在suPHP_UserGroup指令中指定。

你需要在/ home文件系统上添加acl选项(把它添加到fstab中,重新装入文件系统就可以了),然后再在文件和文件夹上添加扩展的acls。

你可以在它的manpage( http://linuxcommand.org/man_pages/setfacl1.html )上得到关于setfacl的更多信息,它相当完整。