当我在目录中应用默认 ACL 时,我会看到default:mask
或仅mask
出现以下两种情况。
场景1
-bash-4.2$ ls -ld test/
drwxr-x---. 2 test test 4096 Oct 15 19:12 test/
-bash-4.2$ setfacl -d -m u:arif:rwx test/
-bash-4.2$ getfacl --omit-header test
user::rwx
group::r-x
other::---
default:user::rwx
default:user:arif:rwx
default:group::r-x
default:mask::rwx
default:other::---
场景2
-bash-4.2$ ls -dl dir/
drwxr-x---. 2 test test 4096 Oct 15 18:17 dir/
-bash-4.2$ getfacl dir
# file: dir
# owner: test
# group: test
user::rwx
group::r-x
other::---
-bash-4.2$ setfacl -m user:arif:rwx dir
-bash-4.2$ getfacl --omit-header dir
user::rwx
user:arif:rwx
group::r-x
mask::rwx
other::---
那么这里的目的是什么呢mask
?
答案1
什么
这个 3 位 ACL 系统源于 TRUSIX。其他 ACL 系统(例如 FreeBSD、MacOS、AIX、Illumos 和 Solaris 中的 NFS4 风格的系统)的工作方式有所不同,并且这种 ACL 概念面具不存在访问控制条目。
这面具顾名思义,是一个应用于掩蔽访问控制条目授予用户和组的权限。它是除文件所有者或“其他”条目之外的任何访问控制条目可以授予的最大权限。它的 3 位and
与这些其他条目的 3 位相匹配。
因此,例如,如果用户被授予rw-
访问控制条目,但掩码为r--
,则该用户实际上只有r--
访问权限。相反,如果用户仅被授予--x
访问控制条目,则掩码rwx
不会授予额外的权限,并且用户仅具有--x
访问权限。
这默认掩码父目录上是应用于在其中创建的内容的掩码设置。这是一种继承形式。
为什么
令人遗憾的是,IEEE 1003.1e 从未成为标准,并于 1998 年被撤销。实际上,19 年过去了,它是一个广泛的操作系统(从Linux通过自由BSD到索拉里斯(在后一种情况下与 NFS4 样式的 ACL 一起)——实际实现。
IEEE 1003.1e 工作草案 #17阅读起来很有趣,我推荐它。在附录 B § 23.3 中,工作组提供了 8 页的详细原理,说明 POSIX ACL 相对于旧组权限标志的工作方式有些复杂S_IRWXG
。 (值得注意的是,TRUSIX 的人在十年前就提供了大致相同的分析。)这涵盖了该面具存在的理由,我将在这里仅简要介绍一下。
- 传统的 Unix 应用程序希望能够拒绝对文件、命名管道、设备或目录的所有访问
chmod(…,000)
。在存在 ACL 的情况下,这只会关闭全部用户和组权限(如果有掩码且旧S_IRWXG
映射到它)。如果没有这个,将旧文件权限设置为000
不会影响任何非所有者user
或group
条目,并且令人惊讶的是,其他用户仍然可以访问该对象。暂时将文件的权限位更改为无访问权限
chmod 000
,然后再次将其更改回来是一种旧的文件锁定机制,在 Unix 获得咨询锁定机制之前使用,该机制- 正如你所看到的 - 即使在 21 世纪人们仍然使用。 (setlock
自 20 世纪 90 年代末以来,建议锁定已可以通过带有便携式知名工具的脚本轻松使用。) - 传统的 Unix 脚本期望能够运行
chmod go-rwx
并最终只有对象的所有者能够访问该对象。同样,除非有掩码并且旧S_IRWXG
权限映射到它,否则这不起作用;因为否则该chmod
命令不会关闭任何非所有者user
或group
访问控制条目,从而导致所有者和非拥有组以外的用户保留对某些内容的访问权限是期待易于访问仅有的给业主。然后再次- 正如你所看到的 - 这种
chmod
命令仍然是公认的智慧十二年后。这个道理仍然成立。 - 其他没有掩码机制的方法也有缺陷。
- 在大多数情况下,权限位与 ACL 分开并
and
与 ACL 一起使用的替代系统将要求文件权限标志在rwxrwxrwx
大多数情况下,这会让许多 Unix 应用程序感到困惑,这些应用程序在看到他们认为的世界时会抱怨 -可写的东西。 - 如果另一种系统中的权限位与 ACL 分开并
or
与 ACL 一起使用,则会出现chmod(…,000)
前面提到的问题。
因此,ACL 系统带有掩码。
进一步阅读
- 克雷格·鲁宾(1989-08-18)。 为 Unix 系统选择访问控制列表功能的基本原理。 NCSC-TG-020-A。黛安出版。国际标准书号 9780788105548。
- IEEE 计算机协会便携式应用标准委员会(1997 年 10 月)。 信息技术标准草案 — 便携式操作系统接口 (POSIX) — 第 1 部分:系统应用程序接口 (API) — 修正案 #:保护、审计和控制接口 [C 语言] IEEE 1003.1e。草案 17。
- 温弗里德·特鲁姆珀 (1999-02-28)。 关于 Posix.1e 的总结
- https://unix.stackexchange.com/a/406545/5132
- https://unix.stackexchange.com/a/235284/5132
- 应用 POSIX ACL 时如何授予所属组权限?
- 在 bash 中的文件中执行原子写入操作