ACL 是否会覆盖 Dir 权限

ACL 是否会覆盖 Dir 权限

ACL 添加会覆盖现有组权限吗?我们使用命令 blow 将 rx 添加到组 myusergroup 的目录树中。

setfacl -Rm "g:myusergroup:rx" /opt/oracle/admin'
setfacl -Rdm "g:myusergroup:rx" /opt/oracle/admin'

但是,组 dba 中的任何用户在新创建的目录中都没有写权限,即使目录显示 775 权限,但组的有效权限却不是。

我错过了什么?

$ ls -ld my_backup

drwxrwxr-x+ 2 oracle dba 4096 Apr 21 08:44 my_backup

$ getfacl my_backup

file: my_backup
owner: oracle
group: dba
user::rwx
group::r-x
group:edmuser:r-x
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:myusergroup:r-x
default:mask::r-x
default:other::r-x

$ touch ./my_backup/test.txt
touch: cannot touch `./my_backup/test.txt': Permission denied

$ id
uid=4000(exagrid) gid=40000(dba) groups=40000(dba)

(编辑:重新格式化)

答案1

介绍

我认为这个问题最好不要用“覆盖”来表述。最好了解传统文件权限(用户/组/其他类别)和 ACL 提供的更细粒度的访问权限如何协同工作。James 已经提供了一个解决方案。我将详细说明它为何有效。


了解 ACL

  1. 首先,默认 ACL 不适用于设置它的目录,而是适用于在其中创建的文件和子目录。后者的文件和目录将继承默认 ACL 设置作为自己的访问 ACL 设置。因此,列出的默认 ACL 设置与此问题无关,我将在下文中不再讨论默认 ACL。

  2. 在传统文件权限的上下文中,文件具有所有者、组和其他类 - 每个用户类一个。在这些类上设置的权限分别成为所有者用户、所有者组和其他用户的有效权限。如果支持并使用 ACL,则这些类权限仍然是所有者用户和其他用户的有效权限。相比之下,组类权限现在反映了任何指定用户或组(即通过 ACL 条目分配权限的任何用户或组)(除所有者组之外)的最大允许权限。现在可以将“组用户”视为由所有者组组成通过 ACL 条目分配权限的任何用户或组。这意味着无法识别 ACL 的应用程序仍可与文件交互。

  3. 上述“最大允许权限”值是 ACL 掩码值。创建 ACL 条目时,会创建一个 ACL 掩码条目。掩码条目具有一个值,该值会在后续任何 ACL 修改或chmod操作后重新计算。回想一下,所有者组和所有 ACL 命名用户和组实体一起现在组成了该团体。面具是对无法代表这些各种各样的具有单一权限的权限:它代表最大值,而不是组内所有组件共享的权限。这样,命名用户可以拥有比所有者组更大的权限。每个 ACL 命名实体都有“屏蔽权限”,这意味着其定义的权限中与掩码设置的最大值不冲突的权限将成为其有效权限。如果掩码条目值为 ,rwx且命名用户的权限为rw,则该用户的有效权限为rw。另一方面,如果掩码条目值为r,且命名用户的权限为rwx,则该用户的有效权限为r。要理解为什么这不会导致比它本身更多的问题,回想一下每次修改后都会重新计算掩码。


解决问题;以及解决方案

现在应该清楚的是,在长列表中找到的权限

drwxrwxr-x+ 2 oracle dba 4096 Apr 21 08:44 my_backup

源自 ALC 的mask::rwx设置。组权限值代表最大限度除了任何 ACL 命名实体之外,还拥有拥有组 (dba) 的权限。John 的问题是他的 dba 组的有效权限定义为group::r-x。这些权限不受掩码限制,因为它们不超过定义的最大值;但它们也不会因掩码而升级。正如 James 所说,解决方案是编辑 ACL 组权限。


参考

这个答案来自个人零散的笔记,没有引用。幸运的是,他们确实提供了一个链接,乍一看似乎提供了大量内容。Linux 上的 POSIX 访问控制列表,Andreas Grünbacher

答案2

因此,即使 ls -ld 显示组 dba 应该对目录 my_backup 具有写权限

 drwxrwxr-x+ 2 oracle dba 4096 Apr 21 08:44 my_backup

ACL 将覆盖此权限。因此,如果您希望保留 dba 的写入权限,则需要将其添加到 ACL 组权限中。

相关内容