1. ACL 基础认知:从权限混乱到精细管控

各位同学,咱们今天聊聊 ACL。说实话,我刚开始接触 Linux 权限时,觉得 chmod 777 就是万能钥匙。直到有一次线上事故——一个普通用户不小心删了团队共享的配置文件,整个服务挂了半小时。从那以后,我才真正开始研究 ACL。

ACL 全称是 Access Control List,翻译过来就是「访问控制列表」。它不是什么新概念,早在 POSIX 标准里就有定义。但很多人用了好几年 Linux,都没碰过它。嗯,今天咱们就把它彻底搞明白。

1.1 什么是 ACL?

简单说,ACL 就是给文件或目录附加的「额外权限规则表」。标准 Unix 权限只有三组:owner、group、others。但 ACL 允许你给任意用户或用户组单独设置权限。

核心思想:ACL 是在标准权限之上叠加的「细粒度控制层」。它不取代 chmod,而是扩展它。

举个例子。你有个项目目录 /project,所有者是 alice,所属组是 dev-team。标准权限下,你只能控制:

  • alice 有什么权限
  • dev-team 所有成员有什么权限
  • 其他人有什么权限

但现实需求往往更复杂。比如:

  • bob 是测试组的,需要只读权限
  • carol 是运维组的,需要读写权限
  • dave 是实习生,只能看不能碰

标准权限搞不定这种场景。ACL 就是为这类需求设计的。

1.2 ACL 与标准 Unix 权限的区别

我整理了一张对比表,看完你就明白为什么需要 ACL 了。

对比维度 标准 Unix 权限 ACL
控制粒度 只有 3 个主体(owner/group/others) 可指定任意用户或用户组
权限继承 不支持目录继承 支持默认 ACL,子文件/目录自动继承
最大用户数 受限于系统用户组数量 理论上无限制
管理复杂度 低,chmod/chown 搞定 中等,需要 getfacl/setfacl
兼容性 所有 Unix/Linux 都支持 需要文件系统支持(ext4/xfs/btrfs 等)
查看方式 ls -l getfacl

你看,标准权限就像一把三档螺丝刀——只有大、中、小三个尺寸。ACL 则是一整套精密螺丝批组,什么规格都有。

我的习惯:能用标准权限解决的,绝不用 ACL。只有遇到「多个用户/组需要不同权限」的场景,我才掏出 ACL。别为了炫技而滥用。

1.3 ACL 的应用场景

这些年我在项目中遇到的 ACL 典型场景,大概有这么几类:

场景一:共享目录权限隔离

我记得有个项目,团队 20 多人共用一台开发服务器。每个项目组都有自己的共享目录。标准权限根本管不过来——有人需要只读,有人需要读写,还有外部顾问需要临时访问。

用 ACL 后,每个目录可以这样配置:

# 给开发组读写权限
setfacl -m g:dev-team:rwx /shared/project-a

# 给测试组只读权限
setfacl -m g:qa-team:rx /shared/project-a

# 给外部顾问 bob 临时读写权限
setfacl -m u:bob:rwx /shared/project-a

你看,一行命令搞定一个角色。不用再折腾用户组了。

场景二:Web 服务器文件权限

另一个常见场景是 Web 服务器。Nginx 或 Apache 通常以 www-data 用户运行,但网站文件的所有者可能是 deploy 用户。标准权限下,要么给 www-data 加入 deploy 组,要么给 others 开放权限——都不安全。

ACL 可以精确控制:

# 给 www-data 用户只读权限
setfacl -m u:www-data:rx /var/www/html

# 给 deploy 用户读写权限
setfacl -m u:deploy:rwx /var/www/html

这样既保证了 Web 服务能读取文件,又限制了它不能写。安全多了。

场景三:备份与审计

备份用户通常需要读取所有文件,但又不应该拥有写权限。用 ACL 可以做到:

# 给 backup 用户递归只读权限
setfacl -R -m u:backup:rx /data

我曾经遇到过一个案例,备份脚本因为权限不足失败了好几天没人发现。用 ACL 明确指定备份用户的权限后,问题再没出现过。

场景四:多租户环境

在 SaaS 平台或共享主机上,不同租户的数据需要严格隔离。ACL 可以做到:

  • 租户 A 只能访问 /data/tenant-a/
  • 租户 B 只能访问 /data/tenant-b/
  • 管理员可以访问所有目录

这种场景下,ACL 比标准权限灵活得多。

避坑指南:我曾经在 ext3 文件系统上折腾 ACL 半天没生效,后来才发现 ext3 默认没开启 ACL 支持。现在主流发行版默认都开了,但如果你用老系统或嵌入式环境,记得先检查:mount | grep acl。没开启的话,需要重新挂载:mount -o remount,acl /。

1.4 ACL 的核心概念图解

说了这么多,咱们用一张图把 ACL 的整体结构理清楚。这张图我画了很多遍,每次讲课都用它。

ACL 核心概念结构图 ACL 权限控制核心结构 文件 / 目录 标准权限(owner/group/others) ACL 扩展权限 访问 ACL(针对文件) 默认 ACL(针对目录) 用户 ACL(u:用户名:权限) 用户组 ACL(g:组名:权限) 默认用户/组 ACL 关键理解 ACL 不取代标准权限,而是在其上叠加。 目录的默认 ACL 决定了其下新建文件/子目录的初始 ACL。

这张图展示了 ACL 的两大分支:

  • 访问 ACL:直接作用于文件或目录,控制谁可以怎么访问
  • 默认 ACL:只作用于目录,定义该目录下新建文件/子目录的初始 ACL

你想想看,有了默认 ACL,你就不用每次新建文件都手动设权限了。目录设一次,子文件自动继承。省心不少。

1.5 本章小结

咱们把今天的内容串一下:

  • ACL 是标准 Unix 权限的扩展,解决「多用户多角色」的细粒度控制问题
  • 标准权限管 3 个主体,ACL 可以管 N 个
  • ACL 分访问 ACL 和默认 ACL 两种
  • 典型场景:共享目录、Web 服务器、备份审计、多租户环境