强制以任何方式位于目录内/目录下的所有文件和子目录继承所有权限和组

强制以任何方式位于目录内/目录下的所有文件和子目录继承所有权限和组

我知道这个问题可能出现这是重复的,因为很多人问过关于权限继承的相关问题。然而,我找到的所有答案都不能解决我想要完成的全部问题,因此,如下所示:

我在 Debian 稳定版的 ext4 文件系统上有一个“共享”目录,其中包含属于不同用户的子目录。每个用户都应该对整个树中的所有内容具有读取权限,并对自己的子树具有读写权限。用户可以自由地将文件添加到他们自己的子树中,而这些文件来自我无法控制的无数种来源,因此他们现有的权限是可以毫不犹豫地丢弃的不一致的垃圾。

到目前为止,我已经创建了一个“共享”组并向其中添加了相关用户,然后chown -R将组所有权设置为该“共享”组,并chmod -R设置所需的权限......对于所有文件已经在那里。使用 SetGID 位,我可以将组所有权传播到新建文件,并使用 Posix ACL 的“默认”功能,我可以将权限传播到新建文件。

但!如果将现有文件从其他地方移入“共享”目录树,则其现有 GID 和权限/ACL 优先,上述任何内容均不产生任何影响。我理解,这之所以是文件系统的正常默认行为,有充分且重要的原因(最小意外原则、用户设置的权限通常是出于某种原因而选择的,等等)...但在这种情况下,对于这个特定的目录树,我想覆盖该行为。

我希望尽可能迅速地(必要时强制)始终如一地将一组权限和组所有权应用于全部位于此目录树中的文件、目录和符号链接,无论它们是通过创建、移动、复制、rsync、scp、解压缩、解压缩、隐形传态、轨道下降、自发量子事件还是任何其他方式到达那里。

我是这台机器的根用户,并且愿意考虑替代文件系统,但只有成熟的、可用于生产的、并且得到 Linux 良好支持的文件系统才会被视为候选。

到目前为止,我能想到的实现这一目标的最不糟糕的方法是运行某种 inotify 监视程序(可能是 Watchman)作为始终开启的 systemd 服务,以递归方式监视整个树,并在监视程序检测到更改时调用脚本来 chown 和 chmod 文件。这比盲目地一遍又一遍地运行定时作业要好chown -Rchmod -R但这仍然是一种粗糙且低效的方法。在我开始实施这种丑陋的解决方法之前,我真的希望有人知道 ext4 或其他适用文件系统的内置功能,可以以高效和原生的方式处理此问题。

答案1

我并不是说这是不可能的,但我要说的是,Linux 不太可能支持这样的解决方案。这与文件系统堆栈的工作方式有关。但首先,让我们了解一下历史。

诺威尔(20 世纪 80 年代末到 2000 年代中期,取决于你如何看待死亡日期)有一个文件系统,它有一个很好的功能,可以支持这一点。如果你有一个目录结构,如A -> B -> C ->D和 ,设置权限B,则会自动立即应用于CD。这是可能的,因为文件系统被编写为使祖先查询非常快;当有人打开一个文件时,它可以快速遍历整个树并[root]构建有效的权限模型来做出允许/禁止的决定。这使得文件系统操作比那些更简单的模型(如那些拥有遵守。

文件系统不是这样做的。当您为其设置权限时,它会B向下遍历整个树B以对每个文件和目录应用适当的权限。如果您最终需要触及数千万或数亿个文件,这可能会花费数小时。对于在 B 下创建的新文件,将使用直接目录上的权限来确定文件获得什么。

现在,对于我们拥有更多的 Windows 模型。文件操作查看文件对象和直接目录,并根据那里的属性做出允许/禁止的决定,而不考虑任何其他对象的权限状态。这使得文件操作非常快,与 NetWare 不同。

在 Linux 中,posix ACL 执行发生在VFS 层,它位于特定文件系统(如 ext4、xfs 和 btrfs)之上。要将 Linux 文件系统转变为 Windows 模型(其中上面的更改会向下级联),您需要进行更改,这将需要一个定制的守护进程来监视相关文件系统上任何目录的 ACL 更改并向下级联更改。但也会捕获任何新文件或任何文件 inode 上的更改 acl 事件并强制执行“正确”版本。这不是标准设置,必须完全在用户空间中进行(可能作为FUSE 文件系统)。

Linux VFS 层极不可能支持 NetWare 权限模型,主要有两个原因:

  • 那不是 Posix。
  • 它使得所有文件访问速度变慢,这是人们所讨厌的。

是的。您已经找到了解决此问题的唯一方法:在用户空间中完成所有操作。


我说得太早了。事实证明,Novell 的开放企业服务器 (OES) 仍然存在,已经成功做到了这一点。对于服务器上的用户访问,例如通过 SSH 或服务器上运行的应用程序,用户需要存在于 eDirectory(OES 的身份验证数据库)中,并且访问 NSS 卷会完全绕过 Posix 层。需要 eDirectory 存在才能确定用户在 NSS 卷上拥有哪些权限。

从架构角度来看,Novell/MicroFocus 编写了内核模块来实现所有这些功能。不,他们没有在宽松的许可下共享这些模块。OES 就是因为这个原因才成为付费产品。

答案2

下面的方法非常有效:

  1. 像往常一样安装驱动器
  2. 导出已安装驱动器的 NFS 共享,并压缩所有权限。
  3. 挂载 NFS 共享。使用新挂载的 NFS 驱动器作为共享驱动器,不存在权限问题。

相关内容