与流程用户安全地共享目录

与流程用户安全地共享目录

假设我有一个目录/clients/bob,其所有者是bob:bob

我可能会授予开发人员该bob组,以便他们可以编辑这些文件,然后当他们不再需要访问权限时,我可以将他们从该组中删除。

但是我该如何处理像 这样的进程用户www-data?我不想将其放入www-databob组中,因为这将使 Apache 能够访问一切而不仅仅是网站的文档根目录。同样,我也不想将文档根目录的所有权交给bob:www-dataor,www-data:bob因为当我需要授予两个进程用户访问目录的权限时,此解决方案无法扩展(假设我在另一个用户上运行了一个 cronjob)

答案1

您应该将www-data用户视为“每个人”并相应地授予访问权限。

如果您认为 Web 资源已得到妥善保护,那么您也可以放弃基本的八进制权限系统并使用访问控制列表:

setfacl -R -m u:www-data:rX my-directory

这允许www-data u用户访问数据并进入目录,从 开始my-directory。(-R与 中的相同chmod,表示以递归方式应用更改。)

为了使新添加的文件和文件夹也具有该 ACL,您必须设置默认 ACL:

setfacl -R -d -m u:www-data:rX my-directory

请注意,内核和挂载点都必须启用 ACL。请参阅您使用的文件系统手册。它现在是大多数 Linux 发行版中的默认设置,因此可能已经可用。

答案2

我认为访问控制列表(来自 Daniel B 的回答)没问题。它们确实很强大。如果您无法使用它们,以下功能较弱的解决方案可能就足够了:

  1. 专门为这种情况创建一个组,例如cl_bob
  2. 然后chown将文档根目录(递归)到bob:cl_bob
  3. 将用户(包括流程用户)添加到cl_bob组。用户www-data应该在cl_bob但不在bob;开发人员可能需要同时在两个组中。
  4. setgid为目录启用:
    find /clients/bob/document/root -type d -exec chmod g+s "{}" +
    这样,将来在其中创建的目录和文件将继承cl_bob组,无论创建它们的用户(进程)是谁。
  5. 稍后可以轻松将另一个用户(如您的 cronjob 示例)添加到该组中。

相对于 ACL 的优势:

  • 相当简单且众所周知。
  • 使用标准工具轻松进行检查,例如ls -l
  • 开箱即用,受到广泛支持。
  • 将用户添加(删除)到组是一个简单的操作,几乎不产生磁盘 I/O,也不耗时。递归应用 ACL 元数据时情况可能会有所不同。

缺点:

  • 不够灵活。除bobxor 之外的用户不在 中cl_bob,因此适用组权限 xor 其他权限,特里姆。如果您想要更多权限级别(例如完全读写、有限只读、无访问权限),那么您需要 ACL。
  • 系统范围。您需要 root 访问权限才能创建组并向其中添加用户;关键信息存储在 中/etc/group。ACL 更加“私密”,就像文件名一样;ACL 元数据存储在文件系统中(但您仍然需要/etc/group/etc/passwd将 GID 和 UID 连接到现实世界)。
  • 可能会产生垃圾。想象一下,您删除了/clients/bob里面的所有内容;cl_bob除非您记得也删除它,否则该组现在就是无用的神器。ACL 元数据会随文件一起删除,不会留下任何垃圾。

相关内容