Linux ACL权限策略详细介绍
1. 什么是ACL?
ACL,全称 Access Control List,是Linux 文件系统中一种比传统Unix权限模式(用户-组-其他的 rwx 权限)更细粒度的权限管理机制。通过ACL,可以为单个文件或目录设置多个用户或组的访问权限,实现更灵活的访问控制。
2. 传统权限的限制
Linux传统的权限模型只有三类用户:文件所有者(User)、所属组(Group)、其他用户(Others),每类可以设置读(r)、写(w)、执行(x)权限。这种模型简单但有限,不能满足复杂多变的权限需求,例如:
- 同一文件对不同用户需要不同的访问权限。
- 一个用户可能需要获得特殊权限但不属于文件所属组。
为了解决这些问题,Linux引入了ACL。
3. ACL的组成和结构
ACL分为两大类条目:
- 基本ACL条目(Base ACL) :包含了传统Unix权限的用户、组、其他用户权限,是ACL的基础部分。
- 扩展ACL条目(Extended ACL) :允许为指定用户或组独立设置权限。
每个ACL条目包含以下信息:
- 条目类型(用户、组或其他)
- 目标对象(指定用户名或组名,可为"mask")
- 权限掩码(读、写、执行权限的组合)
4. Linux ACL的主要条目类型
条目类型 | 含义 |
---|---|
user:: | 文件所有者的权限(基础ACL条目) |
user:用户名: | 为特定用户设置权限(扩展ACL条目) |
group:: | 文件所属组的权限(基础ACL条目) |
group:组名: | 为特定组设置权限(扩展ACL条目) |
mask:: | 访问权限掩码,限制扩展ACL条目和所属组的最大权限,生效范围包括 user:xxx 和 group:xxx 条目 |
other:: | 其他用户的权限(基础ACL条目) |
5. 查看ACL权限
使用命令:
getfacl <文件或目录路径>
示例输出:
# file: example.txt
# owner: alice
# group: staff
user::rw-
user:bob:r--
group::r--
mask::r--
other::---
- 表示所有者alice有读写权限
- 用户bob有只读权限
- 所属组staff有只读权限
- mask限制扩展ACL权限最大为读权限
- 其他用户没有权限
6. 设置和修改ACL权限
使用命令:
-
添加或修改权限
setfacl -m u:bob:rw- example.txt
为用户bob添加读写权限。
-
移除特定ACL权限
setfacl -x u:bob example.txt
移除用户bob的ACL权限。
-
给目录设置默认ACL
setfacl -d -m g:developers:rwx /project
为目录/project设置默认ACL,表示此目录下新创建的文件或目录继承该权限。
-
清除文件所有ACL
setfacl -b example.txt
7. mask的作用
mask
是一个重要条目,用于限制扩展ACL条目(具体用户和组)的最大权限。设置mask时,扩展条目的权限会与mask做"与"操作,实际权限可能会被限制。例如:
- 若给用户Bob设置 rwx 权限,但mask为 r-x,则Bob实际权限为 r-x。
8. ACL的实际应用场景
- 多用户共享文件时,灵活分配读写权限。
- 不改变文件所属组的情况下,给额外用户权限。
- 设置项目组成员对特定文件夹的特殊访问权限。
- 配合NFS共享中细粒度权限控制。
9. 常用ACL命令总结
命令 | 作用 |
---|---|
getfacl <文件/目录> |
显示当前文件或目录的ACL权限 |
setfacl -m u:<用户>:<权限> <文件> |
添加或修改用户权限 |
setfacl -m g:<组>:<权限> <文件> |
添加或修改组权限 |
setfacl -x u:<用户> <文件> |
删除指定用户的ACL权限 |
setfacl -b <文件> |
移除所有ACL,只保留基础权限 |
setfacl -d -m g:<组>:rwx <目录> |
设置目录的默认ACL权限 |
setfacl -R -m u:<用户>:rwx <目录> |
递归修改目录及其文件的ACL权限 |
10. 注意事项
- 不是所有文件系统都支持ACL,ext3/ext4等主流文件系统支持,但需确保挂载时启用了ACL选项。
- 过度使用ACL可能会使权限管理复杂,应合理规划权限策略。
- ACL权限与传统权限共存,ACL权限对传统权限的扩展,需要理解其交互关系
11. 权限优先级
- 文件拥有人>用户ACL>文件拥有组>组ACL>其他人