touch/mkdir 似乎忽略默认 ACL

touch/mkdir 似乎忽略默认 ACL

我很确定这是一个愚蠢的错误,但我自己似乎无法弄清楚,所以请看一下。

我为当前文件夹设置了 ACL,如下所示:

zigbee2mqtt@nuc:/tmp/folder$ getfacl .
# file: .
# owner: zigbee2mqtt
# group: zigbee2mqtt
user::rwx
user:stack:r-x
user:zigbee2mqtt:rwx
user:milkpirate:rwx
group::---
mask::rwx
other::---
default:user::rwx
default:user:stack:r-x
default:user:zigbee2mqtt:rwx
default:user:milkpirate:rwx
default:group::---
default:mask::rwx
default:other::---
zigbee2mqtt@nuc:/tmp/folder$ id
uid=978(zigbee2mqtt) gid=977(zigbee2mqtt) groups=977(zigbee2mqtt)

所以当我现在在该文件夹中创建一个文件夹/文件时,如下所示:

zigbee2mqtt@nuc:/tmp/folder$ touch foo; mkdir bar

它会导致该文件夹具有以下权限foo

zigbee2mqtt@nuc:/tmp/folder$ getfacl foo
# file: foo
# owner: zigbee2mqtt
# group: zigbee2mqtt
user::rwx
user:stack:r-x
user:zigbee2mqtt:rwx
user:milkpirate:rwx
group::---
mask::rwx
other::---
default:user::rwx
default:user:stack:r-x
default:user:zigbee2mqtt:rwx
default:user:milkpirate:rwx
default:group::---
default:mask::rwx
default:other::---

到目前为止看起来还不错。

但该文件的 ACL 看起来却消失了:

# file: bar
# owner: zigbee2mqtt
# group: zigbee2mqtt
user::rw-
user:stack:r-x                  #effective:r--
user:zigbee2mqtt:rwx            #effective:rw-
user:milkpirate:rwx             #effective:rw-
group::---
mask::rw-
other::---
  1. 我希望maskrwx(期望的)。
  2. 因为groupother是(期望的)相同的---许可,但它们是:ls -la
zigbee2mqtt@nuc:/tmp/folder$ ls -la
total 20
drwxrwx---+  3 zigbee2mqtt zigbee2mqtt 4096 Jan 15 17:55 .
drwxrwxrwt  16 root        root        4096 Jan 15 17:59 ..
-rw-rw----+  1 zigbee2mqtt zigbee2mqtt    0 Jan 15 17:55 bar
drwxrwx---+  2 zigbee2mqtt zigbee2mqtt 4096 Jan 15 17:55 foo

但我期望(并且渴望):

zigbee2mqtt@nuc:/tmp/folder$ ls -la
total 20
drwxrwx---+  3 zigbee2mqtt zigbee2mqtt 4096 Jan 15 17:55 .
drwxrwxrwt  16 root        root        4096 Jan 15 17:59 ..
-rw-------+  1 zigbee2mqtt zigbee2mqtt    0 Jan 15 17:55 bar
drwx------+  2 zigbee2mqtt zigbee2mqtt 4096 Jan 15 17:55 foo

编辑: 好的,做了一些测试,一切似乎都按预期工作,结果ls -la似乎没有反映正确的权利:

zigbee2mqtt@nuc:/tmp/folder$ sudo -u nginx -g zigbee2mqtt bash
nginx@nuc:/tmp/folder$ ls
ls: cannot open directory '.': Permission denied

答案1

您在列表中看到的ls是“传统”权限位,这是您在不支持 ACL 的系统中所拥有的所有权限,并且所有这些权限都可以由不支持 ACL 的工具(或用户!)使用。

“传统”组权限位对应于所属组 ACL,但对应于 ACL 掩码(acl(5)手册页):

ACL 条目和文件权限位之间的对应关系

ACL 定义的权限是文件权限位指定的权限的超集。

文件所有者、组和其他权限与特定 ACL 条目之间存在对应关系:所有者权限对应于 ACL_USER_OBJ 条目的权限。如果ACL中有ACL_MASK条目,则组权限对应于ACL_MASK条目的权限。 否则,如果 ACL 没有 ACL_MASK 条目,则组权限对应于 ACL_GROUP_OBJ 条目的权限。其他权限对应于ACL_OTHER条目的权限。

掩码的作用是限制 ACL 条目可以为命名用户、命名组或所属组授予的权限。在某种程度上,您可以将三组“传统”权限位视为适用于 1) 拥有用户,2) 其他显式定义的用户(没有 ACL:拥有组的成员;有 ACL:加上其他指定的用户)用户或其他命名组的成员),以及 3)其他所有人。

实际的推理是,如果用户或程序想要确保只有所有者对文件具有写权限,类似的操作chmod go-w仍然可以做到这一点,即使参与者不知道 ACL

因此,让它rwx在列表中为组显示ls是设计使然,因为那里有user:zigbee2mqtt:rwxuser:stack:r-xACL 条目。输出ls只是暗示除了拥有用户之外还有其他一些用户对该文件具有读取、写入和/或执行权限。将掩码设置为000(使用例如chmod g-rwx或适当的setfacl命令)将使这些 ACL 条目user:zigbee2mqtt无效user:stack


当您使用 , 创建文件touch并查看mask::rw-它时,这是因为touch大多数其他工具创建具有权限 的常规文件0666,而不是0777,从而保留了这些x位。大多数文件不应该是可执行的。无论 ACL 如何,传递给open()系统调用的权限仍然有效,就像使用 更改权限一样chmod()。除了关闭这些x位之外,这还允许程序通过将权限位设置为 来创建私有文件0600

相关内容