![为什么我没有修改 ACL 的文件的读取权限?](https://linux22.com/image/46294/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E6%B2%A1%E6%9C%89%E4%BF%AE%E6%94%B9%20ACL%20%E7%9A%84%E6%96%87%E4%BB%B6%E7%9A%84%E8%AF%BB%E5%8F%96%E6%9D%83%E9%99%90%EF%BC%9F.png)
我的目标是仅允许/var/www/mysite/
使用默认值的 www-data 组中的用户对文件夹进行读取访问前交叉韧带。
这适用于常规 ACL,但不适用于默认 ACL。为什么?
我就是这样做的:
我以用户身份登录www-数据谁在组里www-数据。我在目录中/var/www
。
我创建了一个目录我的网站并给它权限 0。然后我添加了 ACL 权限,以便组中的任何人www-数据具有对目录的读取访问权限我的网站/。
$ mkdir mysite
$ chmod 0 mysite
$ setfacl -m g:www-data:r-x mysite
$ ls -la
d---------+ 2 root root 4096 Sep 6 11:16 mysite
$ getfacl mysite/
# file: mysite/
# owner: root
# group: root
user::---
group::---
group:www-data:r-x
mask::r-x
other::---
此时用户www-数据有权访问该文件夹。但是,如果我添加默认 ACL,访问将被拒绝!
$ setfacl -m d:g:www-data:r-x mysite # <---- NOTE the default acl rule.
$ ls -la
d---------+ 2 root root 4096 Sep 6 11:16 mysite
$ getfacl mysite/
# file: mysite/
# owner: root
# group: root
user::---
group::---
other::---
default:user::---
default:group::---
default:group:www-data:r-x
default:mask::r-x
default:other::---
答案1
默认 ACL 是应用于该目录中新创建的文件的 ACL。它还会被复制为在该目录下创建的子目录的默认 ACL,因此除非您执行某些操作来覆盖它,否则它会递归应用。
默认 ACL 对目录本身没有影响,也对更改默认 ACL 时存在的任何文件没有影响。
因此,在您的情况下,您需要在目录上设置 ACL(对于目录本身)并设置默认 ACL(对于您将在目录中创建的文件)。
答案2
访问控制列表的语义很复杂,这里摘录自man -s 5 acl
1. If the effective user ID of the process matches the user ID of the
file object owner, then
if the ACL_USER_OBJ entry contains the requested permissions,
access is granted,
else access is denied.
2. else if the effective user ID of the process matches the qualifier
of any entry of type ACL_USER, then
if the matching ACL_USER entry and the ACL_MASK entry contain
the requested permissions, access is granted,
else access is denied.
3. else if the effective group ID or any of the supplementary group IDs
of the process match the file group or the qualifier of any entry of
type ACL_GROUP, then
if the ACL contains an ACL_MASK entry, then
if the ACL_MASK entry and any of the matching ACL_GROUP_OBJ
or ACL_GROUP entries contain the requested permissions,
access is granted,
else access is denied.
else (note that there can be no ACL_GROUP entries without an
ACL_MASK entry)
if the ACL_GROUP_OBJ entry contains the requested permis‐
sions, access is granted,
else access is denied.
4. else if the ACL_OTHER entry contains the requested permissions,
access is granted.
5. else access is denied.
我知道我很难理解哪条规则适用于您的特定问题。如果你完全理解它们,你就不会在这里问问题。特别是,很难确定用户、组或其他是否适用,以及默认值是否优先于特定值。以下是使用 ACL 的示例:
$ ls -ld mysite
drwxr-x---+ 2 www-data www-data 4096 Sep 6 08:22 mysite
$ getfacl mysite
# file: mysite
# owner: www-data
# group: www-data
user::rwx
group::r-x
other::---
default:user::rwx
default:group::rwx
default:group:www-data:r-x
default:mask::rwx
default:other::r-x
$ ls -l mysite
total 4
-rw-rw-r--+ 1 www-data www-data 56 Sep 6 08:15 example.html
使用您的 ACL 参数一切都很好,因为我在组中使用 www-data 运行。但是,如果我更改模式,mysite/
我将禁用我的访问权限:
$ sudo chmod 000 mysite
$ ls -ld mysite
d---------+ 2 www-data www-data 4096 Sep 6 08:22 mysite
$ ls mysite
ls: cannot open directory mysite: Permission denied
请注意,我根本没有更改 acl。
与此相关的是,root 永远、永远、永远不应该拥有将成为 Web 服务一部分的目录。曾经。真的。这就是为什么存在非特权帐户和组(例如www-data
.
您应该怎样做才能让事情按照您希望的方式进行?我不知道。