我对这个例子的疑问:

我对这个例子的疑问:

如果我在 FreeBSD 上使用 NFSv4 ACL,并且我以影响其子文件+目录的继承 ACL 的方式更改目录上的 ACL(并且可能可能级联并影响其子目录的子/孙),则在重新计算的重点是什么?流程是如何管理的?

具体示例:假设我有一个现有的目录层次结构,并且我想添加一个新的 ACL,为某些组添加拒绝或删除允许。我对顶级目录执行以下命令之一:

  • setfacl -a 0 g:mygroup:dD:fd:deny /path_to_dir
  • setfacl -x g:mygroup:dD:fd:allow /path_to_dir

但文档中尚不清楚 ACL 传播如何工作、何时实际发生,甚至是否发生(或需要发生)。此外,如果使用错误的 ACL 复制文件,我找不到从父级重新计算 ACL 的方法,甚至找不到这种情况是否存在。

我对这个例子的疑问:

  1. 只需执行一个setfacl命令就足以触发这些规则的传播,并且(如果需要)将它们“级联”到层次结构中,导致所有包含的对象的权限/ACL 被更新?
  2. 或者,setfacl命令期间的运行时重新计算是否不必要,可能是因为 FreeBSD 在任何文件访问期间从顶部目录向下“动态”计算 ACL,而不是预先计算和存储有效的 ACL,并在 ACL 更改时为所有受影响的对象更新它们?
  3. 如果是FreeBSD当执行命令时向下计算,并且不会“即时”计算它们,当新的 ACL 在整个树中生效,和/或必须采取什么措施才能使其在树下进一步有效?
  4. 如果文件/目录存在不正确的 ACL,那么唯一的解决方法是使这些文件上的所有 ACL 显式定义(并放弃继承)吗?

没有用的答案:

如果传播是一个问题并且需要解决方法,那么我可能会想到一些可能的答案,但它们并不能真正回答问题(对我来说)。为了帮助集中好的答案,我在这里将它们标记为非答案:

  1. 我知道我可以手动设置显式 ACL,用于find /path_to_dir -exec setfacl解决任何传播/重新计算问题。但这并没有什么帮助,因为这意味着整个过程中都将继承的 ACL 替换为显式 ACL。在许多客户端(尤其是 Windows)上,显式/继承 ACL 具有不同的优先级,因此这会改变 ACL 的计算方式,并且之前有效的 ACL 之后可能会有所不同。太容易弄坏东西了。也意味着审计权限不能只检查非继承的文件+目录,因为太多的 ACL 设置将转移到非继承,需要逐案检查。基本上是“恶心”:)
  2. 我还知道另一个可能的答案可能是复制所有受影响的文件/目录。到同一文件系统中的新的并行位置,因为可以强制复制从头开始创建 ACL,并且这些 ACL 将基于顶级目录的当前 ACL。这是不适用的,因为在现实中仅仅为了更改 ACL 而要求复制整个文件系统通常是不现实的。也太容易破坏事物、破坏事物、弄乱rsync/backups/snapshots(如果使用带有快照的 zfs)。

我还想在这里继续使用 FreeBSD,因为不同的系统检查和更新 acl 的方式可能非常不同,而我需要答案的当前系统是基于 FreeBSD 的。

答案1

肯定缺乏这方面的文档。据我所知,根据我自己的经验,是这样的:

setfacl只是添加、修改或删除给定访问控制列表 (ACL) 的访问控制条目 (ACE)。任何其他 ACL 上的其他 ACE 都不会受到影响,即使其中一些 ACE 继承自发生更改的 ACE。那些其他“继承的”ACE 保持不变。

ACE 仅在文件或目录继承它时才被继承被建造

这意味着,如果您要使用设置的 ACE 或f继承d位来修改 ACE,则您有责任手动“传播”该更改到之前从其继承的任何内容(如果这是您想要的行为)。在某些情况下,可能不会,这可能就是 FreeBSD 不会自动为您执行此操作的原因。

例如:

mkdir -p test_dir
getfacl test_dir
# file: test_dir
# owner: root
# group: wheel
#           owner@:rwxp--aARWcCos:-------:allow
#           group@:r-x---a-R-c--s:-------:allow
#        everyone@:r-x---a-R-c--s:-------:allow
setfacl -m g:staff:read_set:fd:allow test_dir # <- CREATE NEW ACE
getfacl test_dir
# file: test_dir
# owner: root
# group: wheel
#      group:staff:r-----a-R-c---:fd-----:allow <- NEW INHERITING ACE
#           owner@:rwxp--aARWcCos:-------:allow
#           group@:r-x---a-R-c--s:-------:allow
#        everyone@:r-x---a-R-c--s:-------:allow
mkdir -p test_dir/child_dir
getfacl test_dir/child_dir
# file: test_dir/child_dir
# owner: root
# group: wheel
#      group:staff:r-----a-R-c---:fd----I:allow <- NEW ACE INHERITED ON CREATE
#           owner@:rwxp--aARWcCos:-------:allow
#           group@:r-x---a-R-c--s:-------:allow
#        everyone@:r-x---a-R-c--s:-------:allow
touch test_dir/child_file
getfacl test_dir/child_file 
# file: test_dir/child_file
# owner: root
# group: wheel
#      group:staff:r-----a-R-c---:------I:allow <- NEW ACE INHERITED ON CREATE
#           owner@:rw-p--aARWcCos:-------:allow
#           group@:r-----a-R-c--s:-------:allow
#        everyone@:r-----a-R-c--s:-------:allow
setfacl -m g:staff:full_set:fd:allow test_dir # <- MODIFY ACE
getfacl test_dir
# file: test_dir
# owner: root
# group: wheel
#      group:staff:rwxpDdaARWcCos:fd-----:allow <- MODIFIED INHERITING ACE
#           owner@:rwxp--aARWcCos:-------:allow
#           group@:r-x---a-R-c--s:-------:allow
#        everyone@:r-x---a-R-c--s:-------:allow
getfacl test_dir/child_dir
# file: test_dir/child_dir
# owner: root
# group: wheel
#      group:staff:r-----a-R-c---:fd----I:allow <- DID NOT CHANGE
#           owner@:rwxp--aARWcCos:-------:allow
#           group@:r-x---a-R-c--s:-------:allow
#        everyone@:r-x---a-R-c--s:-------:allow
getfacl test_dir/child_file 
# file: test_dir/child_file
# owner: root
# group: wheel
#      group:staff:r-----a-R-c---:------I:allow <- DID NOT CHANGE
#           owner@:rw-p--aARWcCos:-------:allow
#           group@:r-----a-R-c--s:-------:allow
#        everyone@:r-----a-R-c--s:-------:allow

# MODIFY INHERITED ACEs TO MATCH MODIFIED INHERITING ACE
setfacl -m g:staff:full_set:fdI:allow test_dir/child_dir
setfacl -m g:staff:full_set:I:allow test_dir/child_file

所以,回答你的问题:

  1. setfacl不会对现有继承的 ACE 进行任何更改。
  2. FreeBSD 不会即时重新计算任何内容。
  3. 只有手动设置后,权限才会生效。
  4. 不,您不必将它们明确化。在您的场景中,您可能希望使用I对继承 ACE 所做的相同修改来更新现有的继承 ACE(设置了标志的 ACE )。

您可能想关注的两个相关的 FreeBSD 问题:

相关内容