🍖权限管理之高级权限 ACL

引入

  • 前一篇所说的基础权限 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: 权限不够
  • 小结
  1. mask会影响除了文件所有者和other之外的人
  2. mask权限决定了用户访问文件时的最高权限
  3. 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

无了

原文地址:https://www.cnblogs.com/songhaixing/p/13908235.html