为什么组上的chmod(1)影响ACL掩码?


17

我试图了解这种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--

请注意,chmod(1)命令已更新ACL掩码。为什么会这样?

SunOS的联机帮助有以下说:

如果使用chmod(1)命令更改具有ACL条目的文件的文件组所有者权限,则文件组所有者权限和ACL掩码都将更改为新权限。请注意,新的ACL掩码权限可能会更改文件上具有ACL条目的其他用户和组的有效权限。

我问,因为如果chmod(1)没有这种行为,这对我来说很方便。我希望通过了解为什么会这样做,可以更好地设计如何设置文件系统权限。


2
现在我想知道是否应该在unix.stackexchange.com上问这个问题。尝试选择正确的站点始终具有挑战性。
Michael Kropat 2012年

Answers:


24

这将便于你,如果chmod()没有这种行为。

这将带来极大的不便,因为人们通常希望在Unix上工作的事情会中断。这种行为对您有好处,您知道吗?

令人遗憾的是,IEEE 1003.1e从未成为标准,并于1998年被撤销。实际上,十四年来,它是各种操作系统(从LinuxFreeBSDSolaris)的实际实现标准。

IEEE 1003.1e 17号工作草案引起了有趣的阅读,我建议这样做。在附录B§23.3中,工作组提供了详细的八页理由,说明了POSIX ACL相对于旧S_IRWXG组许可标志的工作方式有些复杂。(值得注意的是,十年前TRUSIX的人员提供了几乎相同的分析。)我不打算在这里复制所有内容。详细阅读标准草案中的基本原理。这是一个非常简短的原则

  • SunOS手册是错误的。它应该

    如果您使用的chmod(1)命令来更改文件的组所有者的权限与ACL条目的文件,或者文件组所有者权限将ACL掩码都将更改为新权限。

    尽管您的问题中有当前手册页所说的,但您仍可以看到这种行为正在发生。这也是POSIX标准草案指定的行为。如果存在CLASS_OBJ(Sun和TRUSIX的术语ACL_MASK)访问控制项,则将其的组位chmod()设置为1,否则,它们将设置GROUP_OBJ访问控制项。

  • 如果不是这种情况,则使用`chmod()`执行各种标准操作并希望其能像`chmod()`那样工作的应用程序传统上已在旧的非ACL Unix上运行,它们将留下巨大的安全漏洞或看到什么他们认为这是安全漏洞:

    • 传统的Unix应用程序期望能够拒绝使用来访问文件,命名管道,设备或目录chmod(…,000)。在存在ACL的情况下,如果旧的映射到,这只会关闭所有用户和组权限。否则,将旧文件的权限设置为不会影响任何条目或条目,其他用户仍然可以访问该对象。S_IRWXGCLASS_OBJ000USERGROUP

      暂时将文件的权限位更改为无法访问,chmod 000然后再将其更改回是一种旧的文件锁定机制,该机制在Unix获得咨询性锁定机制之前就使用了,正如您所看到的那样,今天人们仍在使用

    • 传统的Unix脚本期望能够运行chmod go-rwx并最终只能由对象的所有者访问该对象。再次-如您所见-十二年后,这仍然是人们所接受的智慧。再说一次,除非存在旧的S_IRWXG映射CLASS_OBJ,否则这chmod是行不通的,因为否则该命令将不会关闭任何命令USERGROUP访问控制项,从而导致除所有者和非所有者组之外的其他用户保留对正在访问的内容的访问权预计只能由所有者访问。

    • 在其他情况下,将权限位and与ACL 分开并与ACL一起使用的系统rwxrwxrwx在大多数情况下都需要文件权限标志,这会使许多Unix应用程序在看到自己认为可写的内容时抱怨不已东西。

      否则将权限位or与ACL 分开并 与ACL一起使用的系统将遇到chmod(…,000)前面提到的问题。

进一步阅读


太棒了,这一切都很有道理。您在手册页上所作的澄清证实了我对该行为的怀疑,而您的三个解释正是我需要对此事有所启发的。我很高兴知道设计的原因,并且很高兴您发布您的规范,这使我不必花所有的时间来回答一个问题。
Michael Kropat 2012年

@hopeseekr您总是可以派生Linux,上百个GNU实用程序和上千个第三方软件,以使它们不再使用S_IRWXG权限。完成后给我打电话。
托比亚

0

此行为仅适用于POSIX ACL条目。这是因为如果您有一个文件夹,并且该文件夹中存在一个文件,则可以将rcl和acl命名为rwx(例如)。如果文件的组权限是rw-(在典型情况下可能是典型情况),那么即使ACL明确表示rwx,掩码也会为acl提供rw-的有效权限。

另一方面,几乎总是+ x的目录具有有效的ACL掩码权限,也允许+ x。

总而言之,此掩码基本上用于区分POSIX ACL集的文件和文件夹之间的权限,以便在正常情况下文件不应该成为可执行文件。


万一有人最终读了这个,这个答案是完全错误的。
pgoetz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.