Mic*_*pat 17 unix filesystems access-control-list
我试图理解这种 Unix 行为(我碰巧在 Ubuntu 11.10 上测试):
$ touch foo
$ setfacl -m u:nobody:rwx foo
$ getfacl foo
# file: foo
# owner: michael
# group: michael
user::rw-
user:nobody:rwx
group::rw-
mask::rwx
other::r--
$ chmod g-rw foo
$ getfacl foo
# file: foo
# owner: michael
# group: michael
user::rw-
user:nobody:rwx #effective:--x
group::rw- #effective:---
mask::--x
other::r--
Run Code Online (Sandbox Code Playgroud)
请注意,chmod(1) 命令已更新了 ACL 掩码。为什么会发生这种情况?
在SunOS的联机帮助有以下说:
如果使用 chmod(1) 命令更改具有 ACL 条目的文件的文件组所有者权限,则文件组所有者权限和 ACL 掩码都将更改为新权限。请注意,新的 ACL 掩码权限可能会更改对文件具有 ACL 条目的其他用户和组的有效权限。
我问是因为如果 chmod(1) 没有这种行为对我来说会很方便。我希望通过了解它为什么会这样做,我可以更好地设计我设置文件系统权限的方式。
Jde*_*eBP 25
chmod()没有这种行为。这将非常不方便,因为人们传统上期望在 Unix 上工作的东西会被破坏。这种行为对你很有好处,你知道吗?
令人遗憾的是,IEEE 1003.1e 从未成为标准并于 1998 年撤回。实际上,14 年过去了,这是一个广泛的操作系统(从Linux到FreeBSD再到Solaris)实际实施的标准。
IEEE 1003.1e 工作草案 #17 读起来很有趣,我推荐它。在附录 B § 23.3 中,工作组为 POSIX ACL 相对于旧S_IRWXG组权限标志的工作方式有些复杂,提供了一个详细的 8 页基本原理。(值得注意的是,TRUSIX 的人在十年前提供了大致相同的分析。)我不打算在这里全部复制。有关详细信息,请阅读标准草案中的基本原理。这是一个非常简短的概要:
SunOS 手册是错误的。它应该读
如果您使用的chmod(1)命令来更改文件的组所有者的权限与ACL条目的文件,或者文件组所有者权限或将ACL掩码都将更改为新权限。尽管当前手册页在您的问题中说了什么,但这是您可以看到的行为。这也是 POSIX 标准草案指定的行为。如果存在CLASS_OBJ(Sun 和 TRUSIX 的术语ACL_MASK)访问控制条目,则 a 的组位chmod()设置它,否则它们设置GROUP_OBJ访问控制条目。
如果不是这种情况,使用 `chmod()` 做各种标准事情的应用程序,期望它像 `chmod()` 一样工作,传统上可以在旧的非 ACL Unix 上工作,要么留下巨大的安全漏洞,要么看看他们认为存在巨大的安全漏洞:
传统的 Unix 应用程序希望能够拒绝对文件、命名管道、设备或目录的所有访问chmod(…,000)。在ACL的存在,这只是关闭所有的用户和组权限如果旧S_IRWXG映射到CLASS_OBJ。如果没有这个,将旧文件权限设置为000不会影响任何USER或GROUP条目,令人惊讶的是,其他用户仍然可以访问该对象。
暂时将文件的权限位更改为无访问权限,chmod 000然后再将它们更改回来是一种旧的文件锁定机制,在 Unix 获得咨询锁定机制之前使用,正如您所见,人们今天仍在使用.
传统的 Unix 脚本希望能够运行chmod go-rwx并最终只有对象的所有者能够访问该对象。同样——如你所见——十二年后这仍然是公认的智慧。再次,这不,除非旧的工作S_IRWXG地图,CLASS_OBJ如果它存在,否则该chmod命令不会关闭任何USER或GROUP访问控制项,导致比业主和非所属组保留访问的东西,其他用户是预计只有所有者才能访问。
在大多数情况下,权限位and与 ACL分开并与 ACL分开的系统将需要文件权限标志rwxrwxrwx,这会使许多 Unix 应用程序在看到他们认为是世界可写的内容时抱怨东西。
权限位or与 ACL分开并 与 ACL 一起编辑的系统会遇到chmod(…,000)前面提到的问题。
| 归档时间: |
|
| 查看次数: |
11209 次 |
| 最近记录: |