ACL 如何计算文件的有效权限?

Bel*_*dez 13 linux acl permissions files

我运行以下命令以授予wheelrwx对创建的新文件和子目录的权限:

[belmin@server1]$ ls -la
total 24
drwxr-sr-x+   2 guards guards  4096 Aug 27 15:30 .
drwxr-xr-x  104 root   root   12288 Aug 27 15:19 ..

[belmin@server1]$ sudo setfacl -m d:g:wheel:rwX .

[belmin@server1]$ getfacl .
# file: .
# owner: guards
# group: guards
# flags: -s-
user::rwx
group::r-x
group:wheel:rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:wheel:rwx
default:mask::rwx
default:other::r-x
Run Code Online (Sandbox Code Playgroud)

但是,当我以 root 身份创建文件时,我并不完全清楚effective权限是如何计算的:

[belmin@server1]$ sudo touch foo

[belmin@server1]$ getfacl foo
# file: foo
# owner: root
# group: guards
user::rw-
group::r-x                      #effective:r--
group:wheel:rwx                 #effective:rw-
group:guards:rwx                #effective:rw-
mask::rw-
other::r--
Run Code Online (Sandbox Code Playgroud)

有人可以详细说明这是什么意思吗?

G-M*_*ca' 9

effective权限是通过将实际(真实?)权限与mask. 由于mask您的文件是rw-,因此所有effective权限都已x关闭。

  • 面具从哪里来? (5认同)

HiT*_*uch 8

简短回答:如果您想在执行位打开时进行掩码,则必须使用setfaclafter显式设置它touch。安全禁止其隐式设置。

setfacl -n -m m::rwx foo
Run Code Online (Sandbox Code Playgroud)

“-n”来抑制掩码的重新计算(可能不需要)。
"m::rwx" 将掩码值设置为 'rwx'。请注意,“m::x”将禁用所有读取和写入。


我无法说明为什么面具是“rw-”。我假设touch在整个 OP 示例中创建文件的默认目录保持不变。

  1. 'foo' 的目录条目应该显示所有者 'root'(因为 sudo 命令和组 'guards' 因为该目录设置了 SUID 位。权限将是默认的 '-rw-...r--' 与目录 '-...rx...' 的组权限(由于 SUID 位显示为小 s)。

  2. 接下来是 ACL,它应该是目录默认值。鉴于 ACL 是继承的,我不希望创建任何 ACLe,并且 ACLE 掩码是目录默认值“rwx”。

但是,如果它们被创建,我希望新的 ACLe 从默认值开始,再次将掩码保留在 'rwx'。如果它们不是从默认值开始的,这似乎会破坏默认 ACL 的想法——“默认”ACL 将只提供命名用户和命名组 ACL。

这现在回避了掩码 ACLe 应该是什么的问题。我希望它是默认掩码条目中的“rwx”。但它可以用空白掩码创建,然后各种法律术语都适用。

  1. 使用 user::rw-、group::rx、other::r--、group:wheel:rwx、group:guards:rwx 和 mask::: (unset) 的暂定 ACL,我们查阅文档setfacl,假设相同的规则适用于文件创建。

有一个条款:

如果ACL包含命名用户或命名组条目,并且不存在掩码条目,则创建一个包含与组条目相同权限的掩码条目。

这会将 ACL 掩码设置为“rx”,如果 ACL 组条目是从文件目录条目创建的,或者如果 ACL 组条目来自默认 ACL,则设置为“rx”。(以其他方式,对于这种情况,结果是相同的。)

还有一个条款:

如果默认 ACL 包含命名用户条目或命名组条目,并且不存在掩码条目,则会添加包含与默认默认 ACL 的组条目相同权限的掩码条目。...掩码条目的权限进一步调整以包括受掩码条目影响的所有权限的联合。

如果此规则适用,则掩码将以“rx”(与前一个子句相同的逻辑)开头),然后将其调整为“受掩码条目影响的所有权限的联合”。

setfacl命令文档中未定义“受掩码条目影响的权限” 。POSIX ACL 文档说:

掩码是所属组的所有访问权限以及所有用户和组条目的组合。

给出“联合”这个词,它是附加的,我会把“组合”读成一个合乎逻辑的 or-ing。换句话说,如果任何组或用户 ACLe 具有“x”权限,则掩码将包含“x”。

  1. 通过所有这些逻辑,OP 示例中的掩码值应该是“rwx”,无论遵循哪个逻辑路径。

上述推理肯定是有缺陷的,因为执行的 x 没有出现在掩码中。

因此,必须有一些关于如何计算掩码的规则,这些规则已从公共文档来源中“隐藏”(或者我们发现了一个错误)。

我的结论是 'x' 总是被无条件删除,而且文档是松散的。

这种更改可能是基于“安全”的理由进行的——任何文件都不应是隐式可执行的,但必须在创建后打开可执行位。