我在目录上定义了一些 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。因此,默认情况下目录将设置执行(遍历)位。
umask
ACL 掩码基本上是在目录/文件/用户级别设置的一种方法。