引入
-
前一篇所说的基础权限 u, g, o 以及特殊权限都是针对一类用户设置的
-
但如果咱们想要自定义用户分配,也就是更精细化的控制权限分配
-
比如 :让某一个用户对某个文件具有某种权限
-
这时咱们就可以使用到文件的访问控制列表 ACL(Access Control List)
⛅"u g o"只能设置一个用户, 一个组或者other
⛅"ACL" 可以对 "r w x" 进行用户设置(允许谁和不允许谁)
⛅"ACL"只能是 "root" 来设置
⛅相关命令: getfacl(查看), setfacl(设置)
一.ACL 的基本使用方式
- 命令
getfacl | 查看权限 |
---|---|
setfacl | 设置权限 |
- 选项
-m | 设定ACL的权限 |
---|---|
-x | 删除某一用户或组的ACL权限 |
-b | 删除所有的ACL权限 |
-R | 递归的设定ACL权限 |
d:(default) | 继承,设定默认的ACL权限,在父目录下新建的文件都会继承此权限 |
mask: | 决定用户的最高权限 |
- 语法
修改属主的权限 | setfacl -m u: :[权限] [文件] |
---|---|
修改属组的权限 | setfacl -m g: :[权限] [文件] |
修改其他人权限 | setfacl -m o: :[权限] [文件] |
修改某一用户的权限 | setfacl -m u:[用户名]:[权限] [文件] |
修改具体某一个组的权限 | setfacl -m g:[组名]:[权限] [文件] |
继承 | setfacl -m d:u:[用户名]:[权限] [父目录] |
修改最大权限mask | setfacl -m mask::[权限] [文件] |
1.让咱们先设置好一个实验环境,让使用方式更易懂
⛅先创建一个目录和文件作为演示对象
[root@shawn ~]# mkdir /cccc/
[root@shawn ~]# touch /cccc/a.txt
[root@shawn ~]# echo 123 > /cccc/a.txt
⛅创建三个用户和一个组
[root@shawn ~]# useradd song1
[root@shawn ~]# useradd song2
[root@shawn ~]# useradd song3
[root@shawn ~]# groupadd ggg1
1.getfacl
: 查看权限
⛅使用"getfacl"命令查看ACL权限
[root@shawn ~]# getfacl /cccc/a.txt
getfacl /cccc/a.txt
getfacl: Removing leading '/' from absolute path names
# file: cccc/a.txt
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
2.setfacl
: 设置权限
注意: 当使用 setfacl
设置权限时就不要再使用 chmod
设置了,会影响 mask
- setfacl设置权限置空
⛅置空属主的权限
[root@shawn ~]# setfacl -m u::- !$
setfacl -m u::- /cccc/a.txt
⛅置空属组的权限
[root@shawn ~]# setfacl -m g::- !$
setfacl -m g::- /cccc/a.txt
⛅置空其他人的权限
[root@shawn ~]# setfacl -m o::- !$
setfacl -m o::- /cccc/a.txt
⛅再次查看ACL权限,已经全部置空
[root@shawn ~]# getfacl !$
getfacl /cccc/a.txt
getfacl: Removing leading '/' from absolute path names
# file: cccc/a.txt
# owner: root
# group: root
user::---
group::---
other::---
- 需求: 用户 "song1" 只能对 "a.txt" 进行 "r" 操作
⛅对"song1"没有设置"ACL"权限时
[song1@shawn root]$ cat /cccc/a.txt
cat: /cccc/a.txt: 权限不够
[song1@shawn root]$ echo 123 > /cccc/a.txt
bash: /cccc/a.txt: 权限不够
⛅使用"root"进行设置"r"权限
[root@shawn ~]# setfacl -m u:song1:r /cccc/a.txt
[root@shawn ~]# su song1
⛅切到"song1"可读但不可写
[song1@shawn root]$ cat /cccc/a.txt
123
[song1@shawn root]$ echo 333 > !$
echo 333 > /cccc/a.txt
bash: /cccc/a.txt: 权限不够
- 用户 "song2" 只能对 "a.txt" 可以 "w" 操作
⛅对"song2"没有设置"ACL"权限时
[song2@shawn root]$ cat /cccc/a.txt
cat: /cccc/a.txt: 权限不够
[song2@shawn root]$ echo 123 > /cccc/a.txt
bash: /cccc/a.txt: 权限不够
⛅使用"root"进行设置"w"权限
[root@shawn ~]# setfacl -m u:song2:w /cccc/a.txt
[root@shawn ~]# su song2
⛅切到"song2"可写但不可读
[song2@shawn root]$ echo 3333 > /cccc/a.txt
[song2@shawn root]$ cat /cccc/a.txt
cat: /cccc/a.txt: 权限不够
⛅咱们使用"root"查看是否写进去了
[root@shawn ~]# cat /cccc/a.txt
3333
-
组 "ggg1" 对 "a.txt" 具有 "rw" 操作
-
用户 "song3" 为其他人,当其加入组 "ggg1" 后
⛅"song3"作为其他人时没有任何权限
[song3@shawn root]$ cat /cccc/a.txt
cat: /cccc/a.txt: 权限不够
[song3@shawn root]$ echo 4444 > !$
echo 4444 > /cccc/a.txt
bash: /cccc/a.txt: 权限不够
⛅使用"root"将组"ggg1"设置"rw"权限
[root@shawn ~]# setfacl -m g:ggg1:rw /cccc/a.txt
⛅将"song3"加入到组"ggg1"中
[root@shawn ~]# gpasswd -a song3 ggg1
正在将用户“song3”加入到“ggg1”组中
[root@shawn ~]# id song3
uid=1002(song3) gid=1002(song3) 组=1002(song3),1003(ggg1)
⛅再次使用"song3"对"a.txt"发现可读可写
[song3@shawn root]$ echo 1234 > /cccc/a.txt
[song3@shawn root]$ cat !$
cat /cccc/a.txt
1234
- 经过以上步骤"getfacl"看看ACL权限
⛅再次查看"ACL"权限咱们可以发现多出了个"mask",??这是什么??
[root@shawn ~]# getfacl /cccc/a.txt
getfacl: Removing leading '/' from absolute path names
# file: cccc/a.txt
# owner: root
# group: root
user::---
user:song1:r--
user:song2:-w-
group::---
group:ggg1:rw-
mask::rw-
other::---
3.最大有效权限mask
mask
相当于一个权限筛子, 用户和组的权限受它的影响, 不包括文件所有者和 other
mask
最主要的作用就是用来决定用户和组的最高权限
- 与
mask
权限进行按位与运算得到最终权限 - 以 "r" 为例, 有权限 : 1 无 : 0
用户/组权限 | mask权限 | 最终权限 |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
- 举例
song1权限 : rwx r-- rw- -wx ....
mask权限 : rw- rw- -w- rwx ....
最终权限 : rw- r- -w- -wx ....
- 演示 : mask 为空效果
⛅设置"mask"权限为空
[root@shawn ~]# setfacl -m mask::- /cccc/a.txt
⛅查看"ACL"权限
[root@shawn ~]# getfacl !$
getfacl /cccc/a.txt
getfacl: Removing leading '/' from absolute path names
# file: cccc/a.txt
# owner: root
# group: root
user::---
user:song1:r-- #effective:---
user:song2:-w- #effective:---
group::---
group:ggg1:rw- #effective:---
mask::---
other::---
- 分别使用三个用户来试试自己的权限
⛅"song1"失败
[root@shawn ~]# su song1
[song1@shawn root]$ cat /cccc/a.txt
cat: /cccc/a.txt: 权限不够
[song1@shawn root]$ echo 222 >!$
echo 222 >/cccc/a.txt
bash: /cccc/a.txt: 权限不够
⛅"song2"失败
[root@shawn ~]# su song2
[song2@shawn root]$ cat /cccc/a.txt
cat: /cccc/a.txt: 权限不够
[song2@shawn root]$ echo 444>/cccc/a.txt
bash: /cccc/a.txt: 权限不够
⛅"song2"失败
[root@shawn ~]# su song3
[song3@shawn root]$ cat /cccc/a.txt
cat: /cccc/a.txt: 权限不够
[song3@shawn root]$ echo 1234 > /cccc/a.txt
bash: /cccc/a.txt: 权限不够
- 小结
mask
会影响除了文件所有者和other之外的人mask
权限决定了用户访问文件时的最高权限mask
用于临时降低用户访问文件的权限
4.继承权限 :default
-
想要对一个目录以及对这个目录以后创建的文件具有指定的权限, 就需要设置
default
了 -
注意 : 对当前目录下已经存在的文件没有相应权限
-
-R
是对当前已存在的文件及目录生效, 对后面创建的不生效
⛅咱们先创一个"/cccc/bbbb"
[root@shawn ~]# mkdir /cccc/bbbb/
⛅分别对"song1"做递归权限,对"song2"做继承权限
[root@shawn ~]# setfacl -R -m u:song1:rwx /cccc/
[root@shawn ~]# setfacl -m d:u:song2:- /cccc/
⛅来看看当前已存在文件和目录的"ACL"权限
⛅可以发现这个父目录对"song1"权限生效,也对"song2"设置了继承
[root@shawn ~]# getfacl /cccc/
getfacl: Removing leading '/' from absolute path names
# file: cccc/
# owner: root
# group: root
user::rwx
user:song1:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:song2:---
default:group::r-x
default:mask::r-x
default:other::r-x
⛅来看"/cccc/bbbb",发现对已存在的文件递归设置生效,继承不生效
[root@shawn ~]# getfacl /cccc/bbbb/
getfacl: Removing leading '/' from absolute path names
# file: cccc/bbbb/
# owner: root
# group: root
user::rwx
user:song1:rwx
group::r-x
mask::rwx
other::r-x
⛅我们再来创建新的文件
[root@shawn ~]# mkdir /cccc/dddd
⛅发现对后创建的文件递归无效了,继承生效了(继承了"song2"对父目录的权限)
[root@shawn ~]# getfacl /cccc/dddd
getfacl: Removing leading '/' from absolute path names
# file: cccc/dddd
# owner: root
# group: root
user::rwx
user:song2:---
group::r-x
mask::r-x
other::r-x
default:user::rwx
default:user:song2:---
default:group::r-x
default:mask::r-x
default:other::r-x