区分每个Apache用户并给予权限

在Web应用程序中,我想为每个www-data用户创build一个文件夹,并为该文件夹提供写权限,并仅为该用户提供写权限。

validation后我可以这样做:

 mkdir($file->getPath().mt_rand(0,100000),0700); 

这将在path$file->getPath()中为所有者用户创build一个具有随机名的新目录。 但它会给所有的 www-data用户的权限。

如果我创build一个chroot监狱,我必须为每个用户再次复制所有文件,因为我应该创build许多jail(一个用户)。

我疯了,没有find解决scheme。

如果我理解你的问题,你的问题就从linux权限/用户框架的结构开始。 因此,Apache进程所拥有的用户是在运行脚本时创建目录和文件的用户。

如果需要脚本的用户分离,例如:您的服务器上的不同(虚拟)主机有不同的目录,并且不希望一个主机的脚本正在同一个(apache)服务器上的不同主机的数据上执行操作,那么你应该使用“mpm_itk_module”而不是更常见的“mpm-prefork”apache。

使用这个,你可以去定义当apache执行任何脚本时使用的用户/组,例如通过这个命令为httpd.conf中的每个虚拟主机条目创建目录:

 <Ifmodulee mpm_itk_module> AssignUserId USER GROUP </Ifmodulee> 

如果您真的想要从一个脚本执行中创建不同的目录,则需要将apache进程归root.root所有,然后脚本需要按照您的要求设置每个directoy的权限和所有者。

但是,以root用户身份运行最好的脚本并不是一个好主意,因为你可能不会想到任何风险。

在我看来,虚拟主机的用户/权利分离似乎是一种非常节省的方式。

另一点 – PHP只 – 是suPHP – > http://www.suphp.org

编辑:

好吧,我看了一下你的网站,即使我不会说西班牙语,看起来你只有一个网站,代表不同的用户通过这个网页来。 那么需要在linux文件系统权限上分离用户呢? 您可以通过应用程序来限制所有内容,而不需要文件系统用户。 即使你提供例如额外的ftp访问权限 – 例如使用proftpd来限制它,它有不同的用户自己的chroot mech。

只有在无法控制谁在执行什么的情况下,您才应该关心文件系统权限。 这是一个多域主机上的常见问题,你可以用我提到的mpm_itk_module来解决。

也许你应该多描述一下你的情况?

编辑2:

如上所述,如果您只使用apache为用户提供访问上传/操作的文件,那么只需将文件放在(!)apache的documentroot树上,并创建一个简单的数据库来知道哪个文件由哪个用户:

 user a | file parentdir/filename 

这可能是一个简单的表格,你的php代码从数据库给用户一个列表,他可以看到/操作哪个文件,你的代码按用户操作的意图完成工作。

只要你不让用户通过其他服务访问文件(ftp,ssh等),根本就不需要使用linux用户权限。 只要注意将文件放置在服务器的documentroot之外,以便只有您的php代码可以通过服务器的apache用户的权限访问这些文件。

编辑3:

哈哈,现在我读了你的一个类似的帖子后,我终于明白了你的问题:( Apache用户在有权限的情况下如何写文件? )在这种情况下(你的网页上有真正的匿名用户)你没有机会根本解决这个问题。 每个访问者都被视为同一个访问者而无需身份验证 正如我在我上次编辑假设,并在类似的帖子中评论:根本不需要处理Linux文件的权限。

您的解决方案;):您需要在用户访问您的页面的同时使用session-id在一个会话中执行文件操作。 所以你的代码需要处理访问者(session-id)和他用这个session-id上传的文件之间的关系。 只要访问者在线,使用一个有效的会话ID是实现这一点的最佳方式。 再次 – 不需要文件系统权限….;)

第二种方式是使用以前建议的authed用户:使用用户名/密码创建一个数据库表来登录网页(而不是服务器)和另一个保存用户/文件关系的表。 在他登录网页之后,再次与会话一起工作,以允许用户访问/操作已经上传的文件。

我可以说你用mod_php运行Apache。 那么这意味着你的PHP实例在apache实例下工作并且有apache USER和GROUP。 您可以创建文件夹,并可以更改此文件夹的所有者,但所有者必须是您系统中的用户(不是apache或同一个虚拟用户)。

但是你可以存储在每个目录文件中,例如“.permitions”,并把inthat文件虚拟所有者。 接下来,您需要筛选每个写入(删除,重命名等)尝试到此目录并比较您的虚拟用户和存储在.permitions文件中的用户。

示例类(不是完整的,但它足以理解):

 class UserDirs { private $path='/home/vusers'; public function mkdir($user){ $d = $this->path.'/'.md5($user); mkdir($d); file_put_contents($d."/.owner",$user); } public function checkOwner($user, $dirname){ $f = $dirname."/.owner"; $virtual_owner = file_get_contents($f); return $user === $virtual_owner; } } $d = new UserDirs() $d->mkdir("foo","bar"); echo $d->checkOwner("foo1","bar") === true ? "OK":"FAIL"; echo $d->checkOwner("foo","bar") === true ? "OK":"FAIL"; 

你可以封装你需要的所有这个类来处理UserDirs并根据需要扩展类。

您的用户没有系统帐户。 创建这些账户可能也是不可行的。 因此,我建议通过Web UI来管理所有这些。

继续按照原样创建您的目录。 权限是好的。 您的用户界面需要更改,只显示用户的目录或文件。 我假设你有一个与此页面相关的数据库。 将用户名和随机生成的目录名与用户关联起来。 如果有人试图转到直接路径,而他们不是与该目录相关的用户,请将其踢回登录屏幕。

为了说明,我创建了一个名为test的帐户,据推测给了一个独特的目录。 如果我注销,我不应该能够访问该目录,因为您的代码会看到

  • 我没有登录,因此无法访问该目录

如果我以test2身份登录并访问test目录,您的代码应该可以看到

  • 我不是所访问的目录的所有者,因此应该适当地重定向。

您需要添加一个函数来检查用户正在访问的目录,并将其与用户关联的目录进行比较。 如果他们两个匹配,让他们继续。 如果它们不匹配,则重定向用户。