什么

什么

当我在目录中应用默认 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不会影响任何非所有者usergroup条目,并且令人惊讶的是,其他用户仍然可以访问该对象。

    暂时将文件的权限位更改为无访问权限chmod 000,然后再次将其更改回来是一种旧的文件锁定机制,在 Unix 获得咨询锁定机制之前使用,该机制- 正如你所看到的 - 即使在 21 世纪人们仍然使用。 (setlock自 20 世纪 90 年代末以来,建议锁定已可以通过带有便携式知名工具的脚本轻松使用。)

  • 传统的 Unix 脚本期望能够运行chmod go-rwx并最终只有对象的所有者能够访问该对象。同样,除非有掩码并且旧S_IRWXG权限映射到它,否则这不起作用;因为否则该chmod命令不会关闭任何非所有者usergroup访问控制条目,从而导致所有者和非拥有组以外的用户保留对某些内容的访问权限是期待易于访问仅有的给业主。

    然后再次- 正如你所看到的 - 这种chmod命令仍然是公认的智慧十二年后。这个道理仍然成立。

  • 其他没有掩码机制的方法也有缺陷。
  • 在大多数情况下,权限位与 ACL 分开并and与 ACL 一起使用的替代系统将要求文件权限标志在rwxrwxrwx大多数情况下,这会让许多 Unix 应用程序感到困惑,这些应用程序在看到他们认为的世界时会抱怨 -可写的东西。
  • 如果另一种系统中的权限位与 ACL 分开并 or与 ACL 一起使用,则会出现chmod(…,000)前面提到的问题。

因此,ACL 系统带有掩码。

进一步阅读

相关内容