1. ACL访问控制概述
基础权限UGO, 特殊权限, 是针对一个用户, 一个组和其他人.
ACL访问控制列表: 对文件进行自定义权限控制.
2. ACL基本使用
ACL设置基本权限: r、w、x
设定acl只能是root管理员用户.
查看acl权限命令: getfacl
设置acl权限命令: setfacl
2.1 环境准备
# 复制passwd文件
[root@kid ~]# cp /etc/passwd /root/passwd
# 文件在没有设定llacl, 看到的和传统权限是一样
[root@kid ~]# ll passwd
-rw-r--r--. 1 root root 1532 Sep 2 14:17 passwd
2.2 查看文件的acl权限
# 使用getacl查看权限
[root@kid ~]# getfacl passwd
# file: passwd # 文件名
# owner: root # 文件属主
# group: root # 文件属组
user::rw- # 文件属主(owner)权限
group::r-- # 文件属组权限
other::r-- # 其他人权限
2.3 设置文件的acl权限
要求如下:
a1 用户拥有读写权限 rw
a1 组拥有读权限 r
a2 用户没有任何权限 -
其他用户拥有读写权限 rw
设置格式: setfacl 选项 (u/g/o):(用户/组/空):权限 文件名
u:空 表示属主, 可以省略不写.
o:空 标签其它所有用户.
* 连续设置使用,隔开(不要有多余的空格)
选项:
-m 修改acl策略
-x 移除acl权限
-b 移除所有acl权限(保留默认的acl权限)
-k 移除目录下新建文件继承父目录的acl权限
-R 递归设置acl参数
# 建立相关用户
[root@kid ~]# useradd a1
[root@kid ~]# useradd a2
# 增加用户 a1 权限
[root@kid ~]# setfacl -m u:a1:rw passwd
# 增加组权限
[root@kid ~]# setfacl -m g:a1:r passwd
# 增加用户 a2 权限
[root@kid ~]# setfacl -m u:a2:- passwd
# 增加其他用户权限
[root@kid ~]# setfacl -m o::rw passwd
注意: 如果用户同时属于不同的两个组,并且两个组设定了acl访问控制
1. 根据acl访问控制优先级进行匹配规则
2. 如有用户拥有多个组的权限不同的权限,优先使用最高权限(模糊匹配)
# 查看基本权限
[root@kid ~]# ll passwd
-rw-rw-rw-+ 1 root root 1532 Sep 2 14:17 passwd
# 查看acl权限
[root@kid ~]# getfacl passwd
# file: passwd # 文件名
# owner: root # 文件属主
# group: root # 文件属组
user::rw- # 文件属主
user:a1:rw- # a1用户权限
user:a2:--- # a2用户权限
group::r-- # 文件属组权限
group:a1:r-- # a1组权限
mask::rw- # 所有用户最大权限
other::rw- # 其他用户权限
2.4 移除文件的acl权限
# 移除jack组的acl权限
[root@kid ~]# setfacl -x g:a1 passwd
# 移除a1用户的acl权限
[root@kid ~]# setfacl -x u:a1 passwd
# 移除文件和目录所有acl权限
[root@kid ~]# setfacl -b passwd
2.5 复制acl权限
# 复制 file1 的 ACL 权限给 file2
[root@kid ~]# touch file1 file2
[root@kid ~]# setfacl -m u:a1:rwx file1
[root@kid ~]# getfacl file1 |setfacl --set-file=- file2
[root@kid ~]# getfacl file2
# file: file2
# owner: root
# group: root
user::rw-
user:a1:rwx
group::r--
mask::rwx
other::r--
3. ACL高级特性
3.1 MASK
mask权限: 指的是用户或群组能拥有的最大 ACL 权限,
也就是说, 给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,
超出部分做无效处理.
# 临时降低所有用户或组权限 只能读写
[root@kid ~]# setfacl -m mask::rw filename
总结:
1 .mask会影响所有用户,但不会影响属主以及匿名用户(掐头去尾)
mask默认不会对匿名用户降低权限, 所以为了便于管理文件的访问控制,
建议匿名用户的权限置为空.
2. mask权限决定了用户访问文件时的最高权限.
3. 可以使用mask临时降低用户访问文件的权限.
4. 任何重新设置acl访问控制会清理mask所设定的权限.
3.2 Default
default: 继承(默认)
用户a1能够对/opt目录以及以后在/opt目录下新建的文件有读、写、执行权限
新建文件继承: 选项 d(u/g/o):(用户/组/空):权限 文件名
# 赋予 a1 对/home 读写执行权限
[root@kid ~]# setfacl -R -m u:a1:rwX /opt
# 赋予 a1 对以后在/home 下新建的文件有读写执行权限(使 a1 的权限继承)
[root@kid ~]# setfacl -m d:u:a1:rwX /opt
# 检查对应的权限
[root@kid ~]# getfacl /opt/
getfacl: Removing leading '/' from absolute path names
# file: opt/ # 目录
# owner: root # 属主
# group: root # 属组
user::rwx # 属主权限
user:a1:rwx # 用户a1的权限
group::r-x # root组的权限
mask::rwx # 所有用户最大权限
other::r-x # 其他用户权限
default:user::rwx # 继承, 属主权限
default:user:a1:rwx # 继承, 用a1的权限
default:group::r-x # 继承, root组的权限
default:mask::rwx # 继承, 所有用户最大权限
default:other::r-x # 继承, 其他用户权限
# 新建文件
[root@kid opt]# touch 1.txt
# 查看文件acl权限(新建的文件继承了opt目录的acl权限)
[root@kid opt]# getfacl 1.txt
# file: 1.txt
# owner: root
# group: root
user::rw-
user:a1:rwx #effective:rw-
group::r-x #effective:r--
mask::rw- # 所有用户最大权限
other::r--
# 清除目录的继承权限(之后创建的文件不再继承ops的acl权限)
[root@kid opt]# setfacl -k /opt
[root@kid opt]# touch 2.txt
[root@kid opt]# getfacl 2.txt
# file: 2.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
4. ACL访问控制实例
4.1 实例1
1. 新建文件
2. 文件属性修改tom(属主):admin(属组), 权限默认为644.
3. tom对该文件有所有的权限, admin组可以读写执行该文件
4. 用户z1 可以读写该文件
5. 用户z2 只读该文件
6. 其他人一律不能访问该文件
# 创建环境, 新建用户 tom, z1, z2, xx
[root@kid ~]# useradd tom
[root@kid ~]# useradd z1
[root@kid ~]# useradd z2
[root@kid ~]# useradd xx
# 添加分组admin
[root@kid ~]# groupadd admin
# gpasswd -a 将用户添加到用户组
[root@kid ~]# gpasswd -a z1 admin
[root@kid ~]# gpasswd -a z2 admin
# 检查用户属性
[root@kid ~]# id tom
uid=1021(tom) gid=1029(tom) groups=1029(tom)
[root@kid ~]# id z1
uid=1022(z1) gid=1030(z1) groups=1030(z1),1033(admin)
[root@kid ~]# id z2
uid=1023(z2) gid=1031(z2) groups=1031(z2),1033(admin)
[root@kid ~]# id xx
uid=1024(xx) gid=1032(xx) groups=1032(xx)
# 准备测试文件
[root@kid ~]# cp /etc/passwd /root/
[root@kid ~]# ll passwd
-rw-r--r--. 1 root root 1779 Sep 2 16:42 passwd
# 修改文件的属主与属组
[root@kid ~]# chown tom:admin passwd
# 修改文件的权限
[root@kid ~]# chmod 644 passwd
# 查看文件的属性
[root@kid ~]# ll passwd
-rw-r--r--. 1 tom admin 1779 Sep 2 16:42 passwd
# 检查设定前的acl列表
[root@kid ~]# getfacl passwd
# file: passwd
# owner: tom
# group: admin
user::rw-
group::r--
other::r--
# 设定acl权限
[root@kid ~]# setfacl -m u::rwx,u:z1:rw,u:z2:r,g:admin:rwx,o::- passwd
# 检查文件的acl列表
[root@kid ~]# getfacl passwd
# file: passwd
# owner: tom
# group: admin
user::rwx # 属主tom
user:z1:rw-
user:z2:r--
group::r-- # 属组是tom
group:admin:rwx
mask::rwx # 所有用户最大权限
other::---
acl的控制规则: 从上往下匹配.
1. tom由于是文件的拥有者, 所以直接按照user::rwx指定的权限去操作
2. z1用户从上往下寻找匹配规则, 发现user:z1:rw-能够精确匹配z1用户,
尽管mary属于admin组, 同时admin组有rwx的权限,
但是由于mary用户的规则在前面, 所有优先生效.
3. z2用户从上往下寻找匹配规则, 发现user:z2:r--能够精确匹配z2用户.
4. tom组的用户, 按照group::r--指定的权限去操作.
5. admin组的用户(排查已经被用户规则匹配的用户), 按照group:admin:rwx的权限去操作.
* z1,z2 属于这个组, 可他们能够被用户规则精准匹配就不会走组的规则.
6. xx用户找不到精确匹配的user定义规则, 也找不到相关组的定义规则, 最后属于other.
4.2 实例2
controller 控制组成员有: k1
test 测试组成员有: t1, t2
shares(公共) steamies(蒸汽机)
目录: /shares/steamies
文件: /shares/steamies/file
脚本: /shares/steamies/test.sh 权限744
controller 属于该目录的所属组, 新建文件必须属于controller组
test 组的成员对该目录拥有rwx权限
test 组成员t2对该目录及子目录(包括以后新建立的文件)没有任何权限
# 准备环境
# 建立管理组
[root@kid ~]# groupadd controller
# 建立测试组
[root@kid ~]# groupadd test
# 新建用户k1分配到管理组
[root@kid ~]# useradd k1 -G controller
# 新建用户t1到测试组
[root@kid ~]# useradd t1 -G test
[root@kid ~]# useradd t2 -G test
# 创建目录
[root@kid ~]# mkdir /shares/steamies -p
# 创建文件
[root@kid ~]# echo "file" >> /shares/steamies/file
# 创建脚本
[root@kid ~]# echo "echo 123" >> /shares/steamies/test.sh
# 修改权限
[root@kid ~]# chmod 755 /shares/steamies/test.sh
# 修改属组
[root@kid ~]# chown -R :controller /shares/steamies/
# 设定权限(X表示, 如果原本有执行权限就保留, 如果没有则不添加)
[root@kid ~]# setfacl -R -m g:test:rwX,u:t2:- /shares/steamies/
# 设定继承规则
[root@kid ~]# setfacl -R -m d:g:controller:rwX,d:u:t2:- /shares/steamies/
[root@kid steamies]# getfacl /shares/steamies/
getfacl: Removing leading '/' from absolute path names
# file: shares/steamies/ # 目录
# owner: root # 属主root
# group: controller # 属组
user::rwx # 属主权限
user:t2:--- # 用户t2没有任何权限
group::r-x # root组权限
group:test:rwx # test组权限
mask::rwx # 所有用户最大权限
other::r-x # 其他用户权限
default:user::rwx # 继承, 新建文件属主的权限
default:user:t2:--- # 继承, 新建文件用户t2的权限
default:group::r-x # 继承, root组的权限
default:group:controller:rwx # 继承, controller组的权限
default:mask::rwx # 继承, 所有用户最大权限
default:other::r-x # 继承, 其他用户的权限
————————————————
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
————————————————