在Linux系统中,文件权限管理通常依赖所有者、所属组和其他人这三组基础权限位。然而当实际业务需要把同一个目录分别开放给多个不相关的用户,并且要求每个人拥有不同操作权限时,传统机制就显得力不从心。ACL(Access Control List,访问控制列表)正是为解决这类细粒度权限问题而存在的扩展机制。

一、Linux ACL的核心作用
ACL的最大价值在于打破了传统权限只能分配给“所有者、组、其他人”的限制。借助ACL,系统管理员可以为某一个具体的用户或者某一个具体的附属组单独设置针对某个文件或目录的访问规则,而不影响该文件原有的基础权限结构。
举例来说,假设目录/data/report原本属于用户admin和组admins,权限为750。现在希望临时让实习生user1拥有读取权限,但不想把他加入admins组,也不想放宽其他人的权限。使用ACL就可以只给user1发一张“只读通行证”,对系统其余部分毫无干扰。这种能力在团队协作、外包人员临时访问、多服务共用目录等场景中非常实用。
1.1 解决传统权限的盲区
传统权限模型的局限是“三类身份”和“三种操作”的正交组合,无法表达“除了属组之外,再单独给某人权限”的语义。ACL通过扩展属性把权限描述从三维升级为列表,每一条记录都可以指定一个主体(用户或组)和对应的权限集合。
从实现上看,ACL是建立在文件系统扩展属性之上的。常见的ext4、xfs等文件系统只要挂载时支持acl选项(多数现代发行版默认开启),就能存储额外的访问控制条目。内核在进行权限检查时,会先匹配ACL中的具体规则,再回退到基础权限,从而保证兼容性与灵活性并存。
二、ACL与普通权限的区别
普通权限是文件自身的元信息,通过ls -l就能看到,修改使用chmod和chown。ACL则是附加在文件上的扩展规则,需要用getfacl查看、setfacl设置,二者是互补关系而非替代关系。
最关键的区别体现在作用粒度上:普通权限对“其他人”只能给一套统一规则,ACL却可以针对每一个其他用户定制。另外,ACL还能设置默认规则(default ACL),让目录下新建的文件自动继承指定的访问策略,这是基础权限完全做不到的。
2.1 权限判断顺序差异
当一个进程访问带ACL的文件时,内核优先检查是否有匹配该用户的具体ACL条目;如果有,就以该条目为准。如果没有,再检查该用户是否属于某个带ACL的组,最后才落到传统的组和其他人权限位。这种顺序保证了ACL的优先级高于基础权限中的“其他人”位。
需要注意,ACL中的mask值会限制所有具名用户、具名组和所属组的最大有效权限。例如mask设为r-x,即便某用户被赋予了rwx,实际也只能拿到r-x。理解mask机制是避免“明明设了写权限却写不进”这类困惑的重点。
三、ACL常用命令与示例
下面通过具体命令展示如何查看和设置ACL。首先用getfacl观察现有规则:
# 查看目录的ACL信息 getfacl /data/report # 输出示例中包含如下条目 # user::rwx # group::r-x # other::--- # 若已设置过ACL,会出现 user:user1:r-x 这样的行
接着用setfacl为用户user1添加只读权限,并为目录设置默认ACL,使新建子文件自动继承:
# 给用户user1赋予读和执行权限 setfacl -m u:user1:rx /data/report # 设置默认ACL,让目录下新建内容继承指定权限 setfacl -d -m u:user1:rx /data/report setfacl -d -m g:admins:rwx /data/report # 再次查看确认 getfacl /data/report
上述代码中-m表示修改或添加规则,u:后面跟用户名,d:表示默认规则。执行后,user1可以进入并列出/data/report内容,但无法修改已有文件,而admins组的新建文件依旧保持预期权限。
如果要移除某条ACL,可使用-x参数,例如setfacl -x u:user1 /data/report。若想彻底清除所有ACL并回到纯基础权限状态,执行setfacl -b /data/report即可。掌握这几个操作,日常细粒度授权基本就能覆盖。
四、使用ACL的注意事项
虽然ACL很灵活,但也有成本。首先,并非所有备份工具默认都会保留ACL信息,像早期的tar需要加--acls参数,rsync也要显式开启-A选项,否则迁移后规则丢失会引发访问异常。其次,过多ACL条目会略微增加权限检查开销,但在普通业务量级下几乎感知不到。
另一个常见误区是以为设了ACL就可以不看基础权限。实际上若基础权限中“其他人”被设为无访问,而ACL又给了某用户权限,该用户依然可访问;但若基础权限里所有者都没权限,ACL也救不了,因为所有者规则优先且不受mask限制。理清这套层级,才能把ACL用在刀刃上。
| 对比维度 | 普通权限 | ACL |
|---|---|---|
| 作用对象 | 所有者、组、其他人 | 任意指定用户或组 |
| 查看命令 | ls -l | getfacl |
| 继承能力 | 无 | 支持默认ACL继承 |
| 粒度 | 粗(三类身份) | 细(逐用户/组) |
综合来看,Linux ACL填补了标准权限模型在复杂共享场景下的空白。它不是用来取代chmod,而是与之配合,让系统既保持简单默认行为,又能在必要时做到精确授权。理解其原理并熟练使用setfacl,是运维和开发人员管理多用户环境的一项实用技能。