(注意:如果您熟悉suPHP设置,并且想要跳过问题的详细信息,可以在最后find我想要实现的内容的快速解释)
我目前正在设置一台机器来承载几个网站,属于几个用户。 为了方便起见,这些用户存储在MySQL数据库中。 libnss-mysql和pam-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查询实际上没有很好的配合:
/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通过使用setuid模拟脚本执行,与suPHP_UserGroup值比较后,将基于文件系统权限。 使用扩展acl将允许www数据用户访问所有文件,但不会允许执行php脚本,因为它没有在suPHP_UserGroup指令中指定。
你需要在/ home文件系统上添加acl选项(把它添加到fstab中,重新装入文件系统就可以了),然后再在文件和文件夹上添加扩展的acls。
你可以在它的manpage( http://linuxcommand.org/man_pages/setfacl1.html )上得到关于setfacl的更多信息,它相当完整。