Linux ACL 是传统 ugo 权限的补充机制,解决单属主/属组限制,支持为任意用户或组单独授权,无需改动文件归属,避免开放“其他人”权限。

Linux 的 ACL(Access Control List,访问控制列表)机制,是传统 ugo(用户/组/其他)权限模型的必要补充,专为解决“一个文件只能归属一个组、一个所有者”的硬性限制而设计。它不替换原有权限,而是在其之上叠加更细粒度的规则,让管理员能直接为任意用户或组单独授权,无需调整属主、属组,也不用开放危险的“其他人”权限。
ACL 能解决哪些传统权限搞不定的问题
传统权限在多角色协作场景中容易失灵:
- 需要给某个临时成员(比如外部顾问)只读权限,但他既不是文件所有者,也不属于当前所属组
- 同一目录下,开发组要读写,测试组只要读+执行,实习生只读——但 Linux 目录只能设一个属组
- 希望新创建的文件自动继承特定权限(比如所有子文件默认对 qa_group 可读),而不是每次手动 chmod
- 某用户需对日志目录有读权限,但若把他加进 adm 组,就会获得整个组的写权限,存在越权风险
确认系统已就绪:ACL 支持检查与启用
绝大多数现代发行版(CentOS 7+/Ubuntu 18.04+)默认启用 ACL,但仍建议验证:
- 运行 mount | grep " / " | grep acl,若输出含 acl 字样,说明已启用
- 若无输出,可临时开启:sudo mount -o remount,acl /
- 永久生效需编辑 /etc/fstab,在根分区对应行的挂载选项中加入 acl(如 defaults,acl),再 sudo mount -o remount /
- ACL 工具(setfacl 和 getfacl)通常预装;未安装时:
— CentOS/RHEL:yum install -y acl
— Ubuntu/Debian:apt install -y acl
核心操作:两条命令搞定日常管理
getfacl 查看,setfacl 设置,二者配合即覆盖全部需求:
-
查看当前 ACL:
getfacl /path/to/file(单文件)
getfacl -R /path/to/dir(递归查看整个目录树)
输出末尾带 +(如 -rw-rw-r--+ )表示已启用 ACL -
添加或修改权限(-m):
setfacl -m u:alice:r-x /project(给用户 alice 读+执行)
setfacl -m g:dev:rwx /project(给组 dev 完全控制)
setfacl -m d:u:bob:r-- /shared(设置默认 ACL:新文件自动对 bob 可读) -
删除权限:
setfacl -x u:alice /project(移除 alice 的 ACL 条目)
setfacl -b /project(清空所有扩展 ACL,保留基础 ugo 权限)
实用技巧与注意事项
ACL 不是万能胶,用对才安全高效:
- mask 是关键:ACL 实际生效权限受 mask 限制。例如设置了 u:john:rw-,但 mask 是 r--,john 最终只有读权限。必要时用 setfacl -m m:rwx 扩大掩码
- 目录 vs 文件:默认 ACL(-d)仅对目录有效,且只影响后续新建项;已有文件需单独设置或配合 -R 递归应用
- 权限叠加逻辑:ACL 权限优先级高于传统 ugo;但最终能否访问,仍取决于所有匹配规则的交集(例如用户同时匹配 u: 和 g: 规则,取更严格者)
- 避免滥用:ACL 规则过多会增加维护成本。建议优先通过合理分组+ugo 管理,ACL 用于真正无法绕过的特例


















