用户属于多个组时ACLS的优先级

Bry*_*ght 5 acl permissions group

如果一个文件有两个组的 ACL 条目,则赋予它们不同的权限,如下所示:

group:admin:rw-
group:staff:r--
Run Code Online (Sandbox Code Playgroud)

如果用户同时属于这两个组,他有什么权限?哪个条目优先?实验似乎表明最严格的权限适用。如果是这样,如果我真的希望一个组的成员拥有更高的权限,即使他们也属于其他更受限制的组,处理这种情况的最佳方法是什么?

Fox*_*Fox 7

标准

换句话说,Common Access Determination Algorithm 应解释如下(此描述是ACL Managers 中详细伪代码中指定的公共访问确定算法的松散解释):

  • 匹配(在 ACL Managers 中的伪代码中定义的意义上)传入的 PAC 与 ACL 的访问 ACL(按从上到下的顺序显示,即:UO、U、FU、GO/G/FG、O、FO, AO),在第一个这样的匹配处停止(除了在指示的类似组的 ACLE 的情况下所有匹配都被视为“同时”),并注意匹配的 ACLE 授予的权限(或者,在组的情况下 -像 ACLE,所有匹配的 ACLE 授予的权限的联合)。

  • 根据需要,根据 ACL 的掩码 ACLE 中的权限屏蔽(即交叉)获取的权限(即,如果匹配发生在中心列1 中,则使用 MASK_OBJ 权限进行掩码,和/或如果 PAC 未经身份验证,则使用 UNAUTHENTICATED 权限进行掩码)。(如果ACL Manager 不支持这两个掩码ACLE,则此步骤为空操作。)

(强调原文,加脚注)

也就是说,如果有一个名为 的用户和组root以及权限的文件,包含单行,则:0600acl-testread possible

$ getfacl acl-test
# file acl-test
# owner: root
# group: root
user::rw-
group::---
other::---
Run Code Online (Sandbox Code Playgroud)

现在,如果我(作为用户fox)尝试cat这样做:

$ cat acl-test
cat: acl-test: Permission denied
Run Code Online (Sandbox Code Playgroud)

组权限是联合的

我碰巧在组userswheel,因此,我们可以为这些组添加特定的ACL:

# setfacl -m g:users:--- -m g:wheel:r-- acl-test
$ cat acl-test
read possible
Run Code Online (Sandbox Code Playgroud)

这是因为group条目(同时考虑)允许对我的组之一进行读取权限。这些可以组合:

# setfacl -m g:users:-w- acl-test
$ getfacl acl-test
# file: acl-test
# owner: root
# group: root
user::rw-
group::---
group:wheel:r--
group:users:-w-
mask::rw-
other::---
$ printf '%s\n' 'write possible' >> acl-test
$ cat acl-test
read possible
write possible
Run Code Online (Sandbox Code Playgroud)

所以现在我可以读取和写入文件,即使允许这些权限的组不是同一个组。

特定于用户的权限覆盖所有组

由于用户规则在组规则之前应用,我们仍然可以限制给定用户读取和/或写入内容:

# setfacl -m u:fox:--- acl-test
$ getfacl acl-test
# file: acl-test
# owner: root
# group: root
user::rw-
user:fox:---
group::---
group:wheel:r--
group:users:-w-
mask::rw-
other::---
$ cat acl-test
cat: acl-test: Permission denied
Run Code Online (Sandbox Code Playgroud)

如果设置了掩码,则几乎覆盖所有内容

如果文件对于除所有者之外的任何人来说都是真正只读的:

# setfacl -x u:fox -m g::rw- -m m:r-- acl-test
$ getfacl acl-test
# file: acl-test
# owner: root
# group: root
user::rw-
group::rw-          #effective:r--
group:wheel:r--
group:users:-w-     #effective:---
mask::r--
other::---
$ printf '%s\n' 'now writing is impossible' >> acl-test
bash: acl-test: Permission denied
# printf '%s\n' 'owner can still write' >> acl-test
Run Code Online (Sandbox Code Playgroud)

有趣的是,掩码不会覆盖其他权限,因此:

# setfacl -x g:users -x g:wheel -m o:rw- -n acl-test
$ getfacl acl-test
# file: acl-test
# owner: root
# group: root
user::rw-
group::rw-          #effective:r--
mask::r--
other::rw-
$ printf '%s\n' 'others can write now' >> acl-test
# chown :users acl-test
$ printf '%s\n' 'but not members of the owning group' >> acl-test
bash: acl-test: Permission denied
Run Code Online (Sandbox Code Playgroud)

1 “中心栏”指的是这个图像,包含除 UO 和 O 之外的所有内容,因此拥有用户和其他人不受掩码的影响。所有团体和非拥有用户定义的规则影响。