如果一个文件有两个组的 ACL 条目,给他们不同的权限,如下所示:
group:admin:rw-
group:staff:r--
如果用户同时属于这两个组,那么他拥有什么权限?哪个条目优先?实验似乎表明最严格的权限适用。如果是这样,当我确实希望某个组的成员拥有更高的特权(即使他们也属于其他更受限制的组)时,处理这种情况的最佳方法是什么?
答案1
从标准:
换句话说,公共访问确定算法应解释如下(此描述是松散的释义常见访问确定算法的详细说明在 ACL 管理器中的伪代码中指定):
将传入的 PAC 与 ACL 的访问 ACLE 进行匹配(在 ACL 管理器中的伪代码中定义的意义上)(按所示从上到下的顺序,即:UO、U、FU、GO/G/FG、O、FO、 AO),在第一个这样的匹配处停止(除了在指定的类似组的 ACLE 的情况下,所有匹配都被视为“同时”),并记下匹配的 ACLE 授予的权限(或者,在组的情况下 -与 ACLE 类似,是所有匹配的 ACLE 授予的权限的并集)。
根据需要,根据 ACL 掩码 ACLE 中的权限掩码(即相交)获取的权限(即,如果匹配发生在中心列1中,则使用 MASK_OBJ 权限进行掩码,和/或如果 PAC 未经身份验证,则使用 UNAUTHENTICATED 权限进行掩码)。 (如果 ACL 管理器不支持这两个掩码 ACLE,则此步骤为空操作。)
(强调为原文,脚注已加)
也就是说,如果有一个名为的用户、组root
和权限的文件,包含单行,则:0600
acl-test
read possible
$ getfacl acl-test
# file acl-test
# owner: root
# group: root
user::rw-
group::---
other::---
现在,如果我(作为用户fox
)尝试cat
这样做:
$ cat acl-test
cat: acl-test: Permission denied
组权限联合
我恰好在 和 组中users
,wheel
因此我们可以为这些组添加特定的 ACL:
# setfacl -m g:users:--- -m g:wheel:r-- acl-test
$ cat acl-test
read possible
这是因为这些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
因此,现在我可以读取和写入该文件,即使允许这些权限的组不是同一组。
用户特定的权限覆盖所有组
由于用户规则先于组规则应用,因此我们仍然可以限制给定用户读取和/或写入内容:
# 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
如果设置了掩码,它将覆盖几乎所有内容
如果文件对于除所有者之外的任何人来说都是真正只读的:
# 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
有趣的是,掩码不会覆盖其他的权限,所以:
# 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
1 “中心柱”是指这个图片并且包含除 UO 和 O 之外的所有内容,因此拥有用户和其他人不会受到掩码的影响。具有已定义规则的所有组和非拥有用户是做作的。