如何为目录和文件设置不同的 Linux 默认 ACL

如何为目录和文件设置不同的 Linux 默认 ACL

我在目录上定义了一些 ACL,如下所示:

# owner: root
# group: root
user::rwx
group::r--
mask::r-x
other::r--
default:user::r--
default:group::r--
default:mask::r-x
default:other::r--

我希望在该文件夹中创建的任何新文件都是 u:apache:r--,任何新目录都是 u:apache:rx。如何使用 ACL 指定该意图?

我已经尝试过了-dm u:apache:rX,它似乎和rx

overt htdocs # getfacl .
# file: .
# owner: root
# group: root
user::rwx
user:apache:r--
group::r--
mask::r-x
other::r--
default:user::r--
default:user:apache:r--
default:group::r--
default:mask::r--
default:other::r--

overt htdocs # setfacl -dm u:apache:rx .
overt htdocs # touch blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
user:apache:r-x                 #effective:r--
group::r--
mask::r--
other::r--

overt htdocs # rm blah.txt
overt htdocs # setfacl -dm u:apache:rX .
overt htdocs # touch blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
user:apache:r-x                 #effective:r--
group::r--
mask::r--
other::r--

大写 X 权限似乎仅对设置当前权限有用,对设置默认权限没有用:

overt htdocs # setfacl -x u:apache blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
group::r--
mask::r--
other::r--

overt htdocs # setfacl -m u:apache:rX blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
user:apache:r--
group::r--
mask::r--
other::r--

答案1

好吧,但是你的例子正是你想要的;)

再看第二个:

公开的 htdocs # setfacl -dm u:apache:rx 。
公开的 htdocs # touch blah.txt
公开的 htdocs # getfacl blah.txt
# 文件:blah.txt
# 所有者:root
# 组:root
用户::r--
用户:apache:rx #effective:r--
组::r--
掩码::r--
其他::r--

重要的一行是:

user:apache:r-x #effective:r--

尽管 acl 设置为 rx,但对于文件来说,它实际上是 r--。这是因为掩码。

如果用户使用用户的 rw- 权限创建文件,则掩码将始终仅为 rw-。(我不是 100% 确定,但掩码的限制不能低于基本权限)。

因此,实际上您可以获得文件的 r-- 和目录的 rx。
因为创建的目录将具有 user:rx -> mask 将为 rx -> 有效权限将为 rx。
对于文件:它们将具有 r--,因此 mask 将为 r--,并且 ACL 的有效权限也将为 r--。(如果您创建一个文件并为其赋予 user::rx 权限,则 mask 将被修改,并且来自 acl 的用户也将获得 x)

答案2

不幸的是,Linux ACL 根本无法做到这一点。就有效权限而言,掩码确实似乎完全符合您的要求。但下次您执行重新计算权限掩码的操作时,bam,您的所有文件都将变为可执行文件。

您不妨就此放弃,期望 ACL 中的所有文件都是可执行的。这实际上只是一种便利,而不是安全功能,只要您不将这些文件夹放入 $PATH 中,就不会有问题。如果这仍然困扰您,唯一的选择是将 ACL 控制的文件夹放在没有执行选项的文件系统上。

答案3

-d(或--default)用于设置目录的默认值,以便在其中创建的内容继承权限(正如您正在做的那样)。

以下是简要概述。 http://www.vanemery.com/Linux/ACL/linux-acl.html#default

不可能文件有一个默认值而目录有不同的默认值。

您可以运行一个 cron 脚本,每分钟对所有目录执行一次 setfacl - 尽管这不是一个理想的解决方案。

查找 /path/to/top/dir -type d -exec setfacl -dm u:apache:rx {} \;

或者

查找 /path/to/top/dir -type d |xargs setfacl -dm u:apache:rx

答案4

关于 ACL 和 Masks 的帖子确实帮助我理解了如何做我想做的事,以及为什么。

我的理解中缺少的部分是,当创建文件时,内核使用默认权限集 0666,对于新目录则使用默认权限集 0777。因此,默认情况下目录将设置执行(遍历)位。

umaskACL 掩码基本上是在目录/文件/用户级别设置的一种方法。

相关内容