文件 ACL 掩码计算:为什么?

文件 ACL 掩码计算:为什么?

我正在尝试使用 ACL 在共享目录上设置适当的 ACL 权限模型,但遇到了问题。尽管我设置了默认的“user:user1:rwx”,但由于掩码计算,user2 创建的文件无法被 user1 写入。它显示有效值为“r--”。

根据手册页,掩码是通过对拥有组、其他命名组和命名用户进行合并来计算的。只有所有这些权限都具有的权限才会在掩码(合并部分)中启用。

但为什么呢?如果是这样,我怎么能只说“用户 user1 始终可以读写”呢?

另外,用户 1 无法写入用户 2 创建的文件,但可以删除它们......

编辑:澄清:

这是所讨论目录的当前 acl:

# file: NNHD/
# owner: user1
# group: user1
user::rwx
user:user1:rwx
user:user2:rwx
group::r-x
mask::rwx
other::---
default:user::rwx
default:user:user1:rwx
default:user:user2:rwx
default:group::rwx
default:mask::rwx
default:other::---

这有合适的面具。

当 user2 在该目录中创建一个文件时,会得到以下内容:

# file: test
# owner: user2
# group: user2
user::rw-
user:user1:rwx                  #effective:r--
user:user2:rwx                  #effective:r--
group::rwx                      #effective:r--
mask::r--
other::---

我不明白为什么会发生这种情况...我必须做什么才能使用户1可写?

答案1

我对 unix 上的 ACL 还不太熟悉,但我认为你犯了一个逻辑错误。你陈述了以下内容:“根据手册页,掩码是通过对所属组进行合并来计算的”,但在你的 ACL 设置中,你有一个规则“group::rx”和“mask::rwx”,这使得在该目录中创建的新文件上的掩码为“rx”&&“rwx”=“rx”。

以上还解释了为什么它只影响 user1,因为“group::rx”是所有者(user1)的组。在 linux 中删除文件时,您只需要对文件夹(而不是文件)具有写权限。

Linux 中的大多数应用程序都会创建具有“rw-”权限的文件,例如 touch。所以最终的结果可能是“rx”&&“rw-”=“r--”。

因此,显而易见的是,如果您希望用户对文件夹中的文件具有读写权限,则必须将组和掩码都设置为 rw

我之所以访问这个网站,是因为在谷歌上搜索如何禁用 ACL 中的掩码自动计算,但我想我运气不好。这个答案可能对其他谷歌用户有用 :)

答案2

(我假设你使用的是 Linux)

您可以使用 ACL 明确设置掩码,其方式与使用以下命令设置 ACL 本身类似setfacl m::mask

例如:

jim@abox:/tmp$ getfacl temp/
# file: temp/
# owner: jim
# group: jim
user::rwx
user:admin:rwx
group::r-x
mask::rwx
other::r-x

jim@abox:/tmp$ setfacl -R -m m::rx temp/
jim@abox:/tmp$ getfacl temp/
# file: temp/
# owner: jim
# group: jim
user::rwx
user:admin:rwx                #effective:r-x
group::r-x
mask::r-x
other::r-x

答案3

我测试了您的示例并得到了不同的结果。以下是我执行的命令和输出。

sudo adduser user1
sudo adduser user2
sudo -i -u user1 #basically the same thing as sudo su user1
mkdir /tmp/NNHD
setfacl --set user::rwx,user:user1:rwx,user:user2:rwx,group::r-x,mask:rwx,other::---,default:user::rwx,default:user:user1:rwx,default:user:user2:rwx,default:group::rwx,default:mask::rwx,default:other::--- /tmp/NNHD

getfacl /tmp/NNHD

Output:

getfacl: Removing leading '/' from absolute path names
# file: tmp/NNHD
# owner: user1
# group: user1
user::rwx
user:user1:rwx
user:user2:rwx
group::r-x
mask::rwx
other::---
default:user::rwx
default:user:user1:rwx
default:user:user2:rwx
default:group::rwx
default:mask::rwx
default:other::---


exit
sudo -i -u user2 #basically the same thing as sudo su user2
touch /tmp/NNHD/test
getfacl /tmp/NNHD/test

Output:

getfacl: Removing leading '/' from absolute path names
# file: tmp/NNHD/test
# owner: user2
# group: user2
user::rw-
user:user1:rwx          #effective:rw-
user:user2:rwx          #effective:rw-
group::rwx          #effective:rw-
mask::rw-
other::---


ls -l /tmp/NNHD/test

Output:

-rw-rw----+ 1 user2 user2 0 Sep  6 15:14 /tmp/NNHD/test

---- 开始代码清理并撤消我们的更改 ----

exit
sudo deluser --remove-home user1
#sudo groupdel user1 #Despite getting a warning about group user1 has no more members, the group seems to get deleted on its own when removing the user, so deleting the group manually is unnecessary.

sudo deluser --remove-home user2
#sudo groupdel user1 #Despite getting a warning about group user2 has no more members, the group seems to get deleted on its own when removing the user, so deleting the group manually is unnecessary.

sudo rm -r /tmp/NNHD

---- 结束代码以清理并撤消我们的更改 ----

执行 /getfacl /tmp/NNHD/test 时得到的输出对我来说更有意义,因为https://linux.die.net/man/5/acl表示在具有默认 ACL 的目录中创建文件时,新文件的 ACL 生成方式如下:

  1. 新对象继承包含目录的默认 ACL 作为其访问 ACL。
  2. 修改与文件权限位相对应的访问 ACL 条目,使得它们不包含模式参数指定的权限中未包含的权限。

因此,在步骤 1 之后,NNHD/test 上的每个权限都将是 rwx,除了其他权限将是 ---。Touch 默认将新文件设置为 rw-rw-rw 权限,因此在步骤 2 之后,user::rw- 是有意义的,因为用户不能拥有超过 rw- 的权限。我对访问控制列表还很陌生(所以也许我说的一切都错了),我不确定 group::rwx 到底是什么。我本以为步骤 2 会将 group:: 更改为 rw-,就像步骤 2 将 user:: 设置为 rw- 一样。我猜步骤 2 只是修改掩码而不是修改 group::,但我不确定。

相关内容