区分每个apache用户并授予权限

Man*_*olo 7 php linux apache permissions chroot

在Web应用程序中,我想为每个www-data用户创建一个文件夹,并仅在该文件夹上提供写入权限,并且只为该用户提供写入权限.

验证后,我可以这样做:

mkdir($file->getPath().mt_rand(0,100000),0700);  
Run Code Online (Sandbox Code Playgroud)

这将在$file->getPath()具有所有者用户的所有权限的路径中创建具有随机名称的新目录.但它会为所有 www-data用户授予权限.

如果我创建一个chroot jail,我必须为每个用户再次复制所有文件,因为我应该创建许多jails(一个用于用户).

我对此感到疯狂,并没有找到解决方案.

Jim*_*ing 4

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

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

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

<IfModule mpm_itk_module>
AssignUserId USER GROUP
</IfModule>
Run Code Online (Sandbox Code Playgroud)

如果您确实想通过一个脚本执行创建不同的目录,则需要 root.root 拥有 apache 进程,然后脚本需要按照您想要的方式为每个目录设置权限和所有者。

但以 root 身份在网络服务器上运行即使是最好的脚本也绝不是一个好主意,因为您可能不会想到任何风险。

在我看来,通过虚拟主机进行用户/权限分离似乎是一种更节省的方式。

另一点 - 仅 PHP - 是 suPHP -> http://www.suphp.org

编辑:

好的,我浏览了您的网站,即使我不会说西班牙语,看起来您只有一个网站,代表始终通过该网页访问的不同用户。那么linux文件系统权限上哪里需要用户分离呢?您可以通过应用程序限制一切,无需文件系统用户。即使您提供额外的 ftp 访问权限 - 例如使用 proftpd 对其进行限制,它对于不同的用户都有自己的 chroot 机制。

仅当您无法控制谁在执行什么时,您才应该关心文件系统权限。这是多域主机上的常见问题,您可以使用我提到的 mpm_itk_module 来解决。

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

编辑2:

正如评论中所建议的,如果您仅使用 apache 来让用户访问文件以进行上传/操作,那么只需将文件放在 apache 的文档根树之外(!)并创建简单的数据库以了解哪个文件属于哪个文件用户:

user a | file parentdir/filename
Run Code Online (Sandbox Code Playgroud)

这可能是一个简单的表格,您的 php 代码从数据库中向用户提供一个列表,用户可以查看/操作该文件,并且您的代码按照用户操作的预期完成工作。

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

编辑3:

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

您的解决方案;):当用户访问您的页面时,您需要在一个会话中使用会话 ID 进行文件操作。因此,您的代码需要处理访问者(会话 ID)和他使用该会话 ID 上传的文件之间的关系。使用只要访问者在线就有效的会话 ID 是实现此目的的最佳方法。再说一次 - 不需要文件系统权限......;)

第二种方法是使用之前建议的经过身份验证的用户:创建一个数据库表,其中包含用于登录网页(而不是服务器)的用户/密码,以及另一个保存用户/文件关系的表。然后,在他登录网页后,再次使用会话以允许用户访问/操作已上传的文件。