
🖼️ 本章封面 · 由 NVIDIA AI 生成
3.3 ACL 与进阶权限控制
🎨 核心概念可视化 · AI 生成1. 为什么需要 ACL?
在传统的 Linux 权限模型(UGO - User, Group, Others)中,一个文件只能有一个所有者和一个所属组。这在简单的场景下足够,但在复杂的协作环境中会遇到瓶颈。
场景示例:
你有一个项目文件夹 /projects/alpha,需要:
- 用户 alice (所有者) 有完全权限 rwx。
- 组 devs 有读写权限 rw-。
- 用户 bob (不在 devs 组中) 仅需要读权限 r--。
- 其他所有人没有任何权限 ---。
使用传统权限无法实现(因为 bob 既不是所有者,也不在 devs 组中,他会被归类到 others),此时就需要 ACL (Access Control Lists,访问控制列表)。
2. 核心概念
2.1 Access ACL vs Default ACL
- Access ACL (访问 ACL):直接作用于文件或目录,决定了谁能读、写、执行该对象。
- Default ACL (默认 ACL):仅适用于目录。它定义了在该目录下新建的文件或子目录将自动继承的权限。
2.2 关键组成部分
- ACL 条目:包含
标签 (Tag)、限定符 (Qualifier)和权限 (Permissions)。user::(文件所有者)user:name(指定用户)group::(所属组)group:name(指定组)mask(掩码:定义了除所有者和 others 外的所有条目的最大权限)other::(其他用户)
2.3 Mask (掩码) 的作用
mask 是 ACL 中最容易被忽视但最关键的部分。它像一个“天花板”,限制了所有命名用户、命名组以及所属组的实际有效权限。
- 如果 user:bob 拥有 rwx,但 mask 是 r--,那么 bob 的有效权限仅为 r--。
- chmod 修改组权限时,实际上是在修改 mask。
3. 实操指南
3.1 查看权限:getfacl
# 查看文件详细 ACL
getfacl file.txt
# 递归查看目录及其下所有文件的 ACL
getfacl -R /path/to/dir
3.2 设置权限:setfacl
3.2.1 修改 (Modify) -m
- 给特定用户增加权限:
bash setfacl -m u:bob:r-- file.txt # 给 bob 读权限 - 给特定组增加权限:
bash setfacl -m g:testers:rx file.txt # 给 testers 组读和执行权限 - 修改掩码 (Mask):
bash setfacl -m m:r-- file.txt # 将所有非 owner/other 的最大权限限制为只读
3.2.2 删除 (Remove) -x
- 删除特定用户的 ACL 条目:
bash setfacl -x u:bob file.txt - 删除所有扩展 ACL 条目(还原到传统 UGO):
bash setfacl -b file.txt
3.2.3 设置默认 ACL (Default) -d
让以后在该目录下创建的文件自动继承权限:
# 让新创建的文件默认给 bob 读权限
setfacl -d -m u:bob:r-- /shared_folder
4. ACL 与传统权限的对应关系
| ACL 条目 | 对应传统权限位 | 备注 |
|---|---|---|
user:: |
u (User) |
所有者权限 |
mask |
g (Group) |
若存在 ACL,ls -l 看到的组权限实际上是 mask |
group:: |
g (Group) |
所属组权限 (受 mask 限制) |
other:: |
o (Others) |
其他人权限 |
注意:当你为文件设置了 ACL 后,执行 ls -l 会在权限位的末尾看到一个 + 号,例如 -rw-rwxr--+,这提示该文件使用了 ACL。
5. 避坑指南
- 权限覆盖:
setfacl -m是增量修改,而--set或--set-file会替换掉整个 ACL。 - Mask 陷阱:当你使用
chmod g+w时,如果文件有 ACL,Linux 会自动更新mask以允许写入,这可能会无意中提升了其他命名用户的权限。 - 文件系统支持:现代主流文件系统 (ext4, XFS, Btrfs) 默认都开启了 ACL。如果
setfacl报错,请检查/etc/fstab中是否包含acl挂载选项(虽然在 Ubuntu 22.04+ 中通常不再需要显式指定)。
6. 参考
发布于 2026-07-13 14:48 · 由 Hermes Agent 自动生成