第398集用户权限-Linux系统ACL控制
用户权限 - Linux系统ACL控制
1. ACL访问控制概述
上一章节我们学习了一般权限、特殊权限,但所有的权限是针对某一类用户设置的, 如果希望对某个指定的用户进行单独的权限控制, 就需要用到文件的访问控制列表ACL。
1.1 ACL基本概念
ACL (Access Control List): 访问控制列表,可以对单个用户或组设置独立的权限。
特点:
- 设定acl只能是root管理员用户
- 相关命令:
getfacl,setfacl - 可以对单个用户、单个组设置独立权限
- 比传统权限更灵活
1.2 ACL基本使用方式
环境准备
1 | # 环境准备 |
使用getfacl查看权限
1 | # 使用getfacl查看权限 |
1.3 设定ACL权限案例
需求:
1 | -rw-r--r-- 1 root root 1380 Feb 27 11:25 passwd |
步骤1: 建立相关用户
1 | [root@liyanzhao ~]# useradd alice |
步骤2: 设置ACL权限
1 | # 增加用户 alice 权限 |
注意: 如果用户同时属于不同的两个组,并且两个组设定了acl访问控制
- 根据acl访问控制优先级进行匹配规则
- 如有用户拥有多个组的权限不同的权限,优先使用最高权限(模糊匹配)
1.4 查看ACL权限
1 | # 查看文件权限(注意+号表示有ACL权限) |
1.5 移除ACL权限
1 | # 移除jack组的acl权限 |
1.6 查看ACL帮助
1 | # EXAMPLES 示例文档 |
1.7 setfacl常用选项
| 选项 | 功能 |
|---|---|
-m |
修改ACL权限 |
-x |
删除指定的ACL权限 |
-b |
删除所有ACL权限 |
-k |
删除默认ACL权限 |
-R |
递归设置 |
-d |
设置默认ACL权限 |
2. ACL高级特性MASK
2.1 MASK说明
MASK: 用于临时降低用户或组的权限,但不包括文件的属主和匿名用户,那么mask最主要的作用是用来决定他们的最高权限。
特点:
- mask默认不会对匿名用户降低权限
- 为了便于管理文件的访问控制,建议匿名用户的权限置为空
2.2 MASK使用示例
1 | # 临时降低用户或组权限 |
2.3 MASK提示
- mask会影响所有用户,但不会影响属主属组以及匿名用户
- mask权限决定了用户访问文件时的最高权限
- mask用于临时降低用户访问文件的权限
- 任何重新设置acl访问控制会清理mask所设定的权限
2.4 MASK示例
1 | # 设置文件ACL权限 |
3. ACL高级特性Default
3.1 Default说明
Default: 继承(默认),可以让新创建的文件或目录自动继承父目录的ACL权限。
应用场景: alice能够对/opt目录以及以后在/opt目录下新建的文件有读、写、执行权限
3.2 Default使用示例
1 | # 赋予 alice 对/opt 读写执行权限(递归) |
说明:
-R: 递归设置现有文件d:: 设置默认ACL权限(继承)X: 表示如果原本有执行权限就保留,如果没有则不添加
3.3 检查对应的权限
1 | # 检查对应的权限 |
3.4 Default权限说明
default权限项:
default:user::rwx- 默认文件所有者权限default:user:alice:rwx- 默认alice用户权限default:group::rwx- 默认组权限default:mask::rwx- 默认mask权限default:other::rwx- 默认其他用户权限
继承规则:
- 在设置了default权限的目录下新建的文件和目录会自动继承default权限
- 只对新建的文件和目录生效,不影响已存在的文件
4. ACL访问控制实践案例
4.1 案例1: 复杂权限控制
需求
将新建文件的属性修改tom:admin, 权限默认为644
要求:
- tom对该文件有所有的权限
- mary可以读写该文件
- admin组可以读写执行该文件
- jack只读该文件
- 其他人一律不能访问该文件
步骤1: 建立用户和组
1 | # 实验前, 建立几个普通用户 |
步骤2: 检查用户属性
1 | # 检查用户属性 |
步骤3: 准备相关文件
1 | # 准备相关文件 |
步骤4: 设定ACL权限
1 | # 设定acl权限 |
权限说明:
u::rwx- 文件所有者(tom)有rwx权限u:mary:rw- mary用户有rw权限u:jack:r- jack用户有r权限g:admin:rwx- admin组有rwx权限o::-- 其他用户无权限
步骤5: 检查ACL权限
1 | # 检查acl权限 |
ACL控制规则说明
ACL的控制规则是从上往下匹配:
tom: 由于是文件的拥有者,所以直接按照
user::rwx指定的权限去操作mary: 用户从上往下寻找匹配规则,发现
user:mary:rw-能够精确匹配mary用户,尽管mary属于admin组,同时admin组有rwx的权限,但是由于mary用户的规则在前面,所有优先生效。bean: 由于找不到精确匹配的规则,而bean是属于admin组,根据文件的定义,该文件是属于admin组,所以bean的权限是按照
group:admin:rwx的权限去操作。jack: 用户从上往下寻找匹配规则,发现
user:jack:r--能够精确匹配jack用户。student: 用户找不到精确匹配的user定义规则, 也找不到相关组的定义规则,最后属于other。
4.2 案例2: lab acl setup
需求
controller组成员有: student
sodor组成员有: thomas, james
目录: /shares/steamies
文件: /shares/steamies/file
脚本: /shares/steamies/test.sh
要求:
- controller属于该目录的所属组, 新建文件必须属于controller组
- sodor组的成员对该目录拥有rwx权限
- sodor组成员james对该目录及子目录(包括以后新建立的文件)没有任何权限
步骤1: 准备用户
1 | # 准备用户 |
步骤2: 准备目录
1 | # 准备目录 |
步骤3: 设定权限
1 | # 设定权限(X表示,如果原本有执行权限就保留,如果没有则不添加) |
权限说明:
g:sodor:rwX- sodor组有rwX权限(X表示保留执行权限)u:james:-- james用户无权限
步骤4: 设定继承规则
1 | # 设定继承规则 |
继承规则说明:
d:g:sodor:rwX- 默认sodor组有rwX权限d:u:james:-- 默认james用户无权限
步骤5: 检查权限
1 | [root@linux-node1 steamies]# getfacl /shares/steamies/ |
步骤6: 验证测试
测试1: thomas用户访问
1 | # 切换到thomas用户 |
测试2: james用户访问
1 | # 切换到james用户 |
测试3: student用户访问
1 | # 切换到student用户 |
4.3 完整实验脚本
1 |
|
5. ACL权限匹配规则
5.1 匹配优先级
ACL权限匹配按照以下优先级:
- 文件所有者 (
user::) - 最高优先级 - 指定用户 (
user:username:) - 精确匹配 - 文件属组 (
group::) - 如果用户属于该组 - 指定组 (
group:groupname:) - 如果用户属于该组 - 其他用户 (
other::) - 最低优先级
5.2 匹配规则说明
| 规则类型 | 匹配方式 | 优先级 |
|---|---|---|
| 文件所有者 | 精确匹配 | 最高 |
| 指定用户 | 精确匹配 | 高 |
| 文件属组 | 组匹配 | 中 |
| 指定组 | 组匹配 | 中 |
| 其他用户 | 默认 | 最低 |
5.3 权限冲突处理
- 用户权限优先于组权限: 如果用户有明确的ACL权限,优先使用用户权限
- 多个组权限: 如果用户属于多个组,使用最高权限
- 精确匹配优先: 指定用户/组的权限优先于通用组权限
6. ACL最佳实践
6.1 使用建议
- 合理使用ACL: 只在需要精细权限控制时使用ACL
- 使用Default继承: 对于需要统一权限的目录,使用default权限
- 定期检查ACL: 使用
getfacl定期检查ACL权限 - 清理无用ACL: 及时清理不再需要的ACL权限
- 配合SGID使用: 在共享目录中配合SGID使用,确保文件属组正确
6.2 安全建议
- 最小权限原则: 只授予必要的权限
- 定期审计: 定期检查ACL权限设置
- 文档记录: 记录ACL权限设置的原因和用途
- 测试验证: 设置ACL后,使用不同用户测试验证
6.3 常见问题
问题1: ACL权限不生效
1 | # 检查文件系统是否支持ACL |
问题2: Default权限不继承
1 | # 确保使用d:前缀设置默认权限 |
问题3: MASK限制权限
1 | # 检查mask权限 |
7. 命令总结
7.1 ACL管理命令
| 命令 | 功能 | 示例 |
|---|---|---|
setfacl -m u:user:rw file |
设置用户ACL权限 | |
setfacl -m g:group:rx file |
设置组ACL权限 | |
setfacl -m o::rw file |
设置其他用户ACL权限 | |
setfacl -x u:user file |
删除用户ACL权限 | |
setfacl -b file |
删除所有ACL权限 | |
setfacl -R -m ... dir |
递归设置ACL权限 | |
setfacl -m d:u:user:rwX dir |
设置默认ACL权限 | |
getfacl file |
查看ACL权限 |
7.2 ACL权限格式
| 格式 | 说明 | 示例 |
|---|---|---|
u:username:rwx |
指定用户权限 | u:alice:rw |
g:groupname:rwx |
指定组权限 | g:admin:rwx |
u::rwx |
文件所有者权限 | u::rwx |
g::rwx |
文件属组权限 | g::r-- |
o::rwx |
其他用户权限 | o::--- |
m::rwx |
mask权限 | m::rw- |
d:u:username:rwx |
默认用户权限 | d:u:alice:rwX |


