我想了解这个Unix行为(我正好在Ubuntu 11.10上testing):
$ touch foo $ setfacl -mu: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--
请注意,chmod(1)命令更新了ACL掩码。 为什么会发生?
SunOS的manpage有如下的说法:
如果使用chmod(1)命令更改具有ACL条目的文件的文件组所有者权限,则文件组所有者权限和ACL掩码都将更改为新的权限。 请注意,新的ACL掩码权限可能会更改文件上具有ACL条目的其他用户和组的有效权限。
我问,因为如果chmod(1)没有这种行为对我来说很方便。 我希望通过理解为什么它能做到这一点,我可以更好地devise我如何设置文件系统权限。
chmod()没有这种行为,那对你来说就不方便了。 这将是非常不方便的,因为人们传统上希望在Unix上工作的东西会破坏。 这种行为对你很好,你是否知道。
IEEE 1003.1e从未成为标准,并于1998年被撤销,这真是一个耻辱。在实践中,十四年来,从Linux到FreeBSD到Solaris的广泛的操作系统实际上是一个标准。
IEEE 1003.1e工作草案#17使得有趣的阅读成为可能,我推荐它。 在附录B第23.3节中,工作组提供了一个详细的八页的基本原理,说明POSIX ACL与旧的S_IRWXG组权限标志相关的复杂方式。 (值得注意的是TRUSIX的人在十年前也提供了相同的分析。)我不打算在这里复制一切。 详细阅读标准草案的基本原理。 这是一个非常简短的介绍 :
SunOS手册是错误的。 它应该阅读
如果使用
chmod(1)命令更改具有ACL条目的文件的文件组所有者权限,则文件组所有者权限或 ACL掩码将更改为新的权限。
这是你可以看到发生的行为,尽pipe目前的手册页说,在你的问题。 这也是POSIX标准草案规定的行为。 如果存在CLASS_OBJ (Sun和TRUSIX的ACL_MASK的术语)访问控制条目,则chmod()的组位设置它,否则设置GROUP_OBJ访问控制条目。
如果情况并非如此,使用`chmod()`执行各种标准事务的应用程序,期望它作为`chmod()`工作在传统的非ACL的Unix Unix上,可能会留下空洞的安全漏洞或者看到什么他们认为是漏洞百出的安全漏洞:
传统的Unix应用程序希望能够使用chmod(…,000)拒绝对文件,命名pipe道,设备或目录的所有访问。 在存在ACL的情况下,如果旧的S_IRWXG映射到CLASS_OBJ ,则只会closures所有用户和组的权限。 如果不这样做,将旧文件权限设置为000不会影响任何USER或GROUP条目,而其他用户竟然仍然可以访问该对象。
暂时将文件的权限位更改为不允许访问chmod 000 ,然后再将其更改回来是一种旧的文件locking机制,在Unix获得咨询locking机制之前使用, 正如您所看到的,人们今天仍然使用该机制。
传统的Unix脚本希望能够运行chmod go-rwx ,只有对象的所有者才能访问该对象。 再次- 正如你所看到的那样 – 这仍然是十二年后收到的智慧 。 而且,除非旧的S_IRWXG映射到CLASS_OBJ如果存在),否则这CLASS_OBJ ,因为否则, chmod命令将不会closures任何USER或GROUP访问控制项,导致拥有者和非拥有组以外的用户保留访问预计 只能由所有者访问的内容。
一个权限位与ACL分离的系统需要在大多数情况下将文件权限标志设置为rwxrwxrwx ,这会混淆许多Unix应用程序,当他们看到他们认为是世界的时候就会抱怨可擦写的东西。
一个权限位与ACL分离的系统将会产生前面提到的chmod(…,000)问题。
此行为仅适用于POSIX ACL条目。 这里的原因是,如果你有一个文件夹,并在该文件夹内存在一个文件,你可以acl为rwx(例如)文件夹和文件。 如果文件的组权限是rw-(它们可能是一个典型的场景),那么掩码给了acl rw的有效权限 – 即使ACL明确地表示了rwx。
另一方面,几乎总是+ x的目录具有有效的ACL掩码权限,也允许+ x。
总而言之,这个掩码基本上用于区分POSIX ACL集的文件和文件夹之间的权限,以使文件在通常不应该变为可执行文件时不会变为可执行文件。