什么是 ACL 权限 ?
场景带入 :
# 某大牛在QQ群内直播讲解Linux系统的权限管理,讲解完之后,他在Linux系统中创
建了一个 /project 目录,里面存放的是课后参考资料。那么 /project 目录对于大牛
而言是所有者(那自然是了,人家创建的啊)拥有读写可执行(rwx)权限。
# 对于 QQ群内的所有用户他们都被 大牛 分配在一个所属组里面,也都拥有读写可执
行(rwx)权限。 QQ 群里的所有用户 就相当于来上 大牛老师的课的学生 。
# 而对于 QQ 群外的其他人,那么我们不给他访问/project 目录的任何权限,
你们这些 QQ 群外的人 肯定不能有权限啊,你们都不是 大牛老师的学生,当然不能
有对 资料的权限了!!
# 综上 : / project 目录的所有者和所属组权限都是(rwx),其他人自然没有权限!!
当你理解了上述场景后,问题来了 :
现在呢,由于 大牛老师讲的太好了,就会有不少学生想要 听课,就是想来试听试听,当
个旁听生,那么对于这些旁听生我们应该怎么理解呢 ?
===>>>
首先,这些旁听生 肯定先不是 QQ 群内的学生,就是 不是 大牛老师的学生,
不然就不叫 旁听了,那也就是说 是属于 其他人 的那一项, 而 旁听生前来听
课肯定也得需要学习资料 ( 也就是说需要对资料的权限 : r-x )
你个旁听生 当然不能 有 w 权限了( 你不能对老师的学习资料 改来改去呀 )
===>>>
那我们说 旁听生 是势必属于 其他人的那一项的,那也就意味着 旁听生肯定
是和 其他人的权限是一样的,但是 其他人的权限是 ---- 是没有权限啊!!!
而现在我们却想要 旁听生 拥有 r-x 的权限!!!
这不就是 冲突 !!
意味着我们要给 旁听生 分配 r-x 权限 并且 除了 旁听生的其他人权限是 无!
那么,为了解决这一冲突,我们就得开始 引入 ACL 权限了!!!
ACL 权限 :
官方 : 我们给指定的用户指定目录分配指定的权限,也就是 ACL 权限分配
模拟场景 :
# 模拟学习资料
[root@bogon ~]# mkdir /project
[root@bogon /]# ls -ld project
drwxr-xr-x. 2 root root 6 Nov 6 16:44 project
[root@bogon ~]# chmod 770 /project
[root@bogon ~]# ls -ld /project
drwxrwx---. 2 root root 6 Nov 6 16:44 /project
[root@bogon ~]# chown rhcsa:rhcsa /project
[root@bogon ~]# ls -ld /project
drwxrwx---. 2 rhcsa rhcsa 6 Nov 6 16:44 /project
/ project 就相当于 学习资料
我们创建了 学习资料 , 并且 修改了权限为 770 ( 让其他用户的权限为 0 )
暂时把 所属主和所属组 切换为 rhcsa : rhcsa ( 暂时的)
# 模拟 人员
[root@bogon ~]# useradd teacher
[root@bogon ~]# groupadd csagroup
[root@bogon ~]# useradd zhangsan
[root@bogon ~]# useradd lisi
[root@bogon ~]# useradd pangting
teacher : 大牛 ( 老师 )
zhangsan , lisi : 课堂里的学生( 也是 QQ 群里的学生 )
csagroup : QQ 群 -- 组
pangting : 旁听生
# 模拟 实际关系 :
[root@bogon ~]# chown teacher:csagroup /project
[root@bogon ~]# ls -ld /project
drwxrwx---. 2 teacher csagroup 6 Nov 6 16:44 /project
[root@bogon ~]# gpasswd -a zhangsan csagroup
Adding user zhangsan to group csagroup
[root@bogon ~]# gpasswd -a lisi csagroup
Adding user lisi to group csagroup
刚才不是说了 rhcsa : rhcsa ( 只是暂时的 ,暂时也没啥用,就只是不想看见root 罢了)
现在 对于 /project 的所属主 和 所属组 正式为 teacher 和 csagroup
把 学生 zhangsan lisi 加入到 csagroup 里 !
# 测验下场景 :
[root@bogon ~]# su - pangting
[pangting@bogon ~]$ cd /project
-bash: cd: /project: Permission denied
我们不是有个 旁听生嘛,现在让他看看能不能进入到我们的学习资料里去!!
===>>>
在没有进行 ACL 之前 显然是不能的 !!
没有权限访问 !!
至此,这个模拟场景就是彻底实现了!!
然后就是 关于我们的正题 ----- ACL 对于上述场景 的应用了 !!!
设置 ACL 权限 :
查看 ACL 权限 :
===>>> getfacl 文件名
展示出来的 就是 ACL 权限 !!!
待会儿操作的时候 就可以看到 其效果( 现在这个是 我们什么还没操作呢 ,可以作为对比)
设置 ACL 权限 :
===>>> setfacl 文件名
选项 :
-m:设定 ACL 权限。
如果是给予用户 ACL 权限,则使用 "u:用户名:权限" 格式赋予;
如果是给予组 ACL 权限,则使用 "g:组名:权限" 格式赋予;
-x: 删除指定的 ACL 权限;
-b: 删除所有的 ACL 权限;
-d: 设定默认 ACL 权限。只对目录生效,指目录中新建立的文件拥有此默认权限;
-k: 删除默认 ACL 权限;
-R: 递归设定 ACL 权限。指设定的 ACL 权限会对目录下的所有子文件生效
场景实操 :
[root@bogon project]# setfacl -m u:pangting:r-x /project
上示 即是 我们使用 setfacl 命令 来对 旁听生 进行 ACL 权限操作 !
# 使用了 - m 选项 用户名 : pangting 设置的 权限是 r-x
这一操作就完完全全解决了 我们前面 举例的 场景问题 !!!!
这就是 ACL 权限的作用 !!!!
# 注意如下所示,如果某个目录或文件下有 + 标志,说明其具有 acl 权限。
我们刚才设定了 ACL 权限,现在再 查看下 ACL 权限 看看有哪些变化 :
那查看 ACL 权限 是要用 什么命令呢 ??
===>>> 自然是 gatfacl
现在看上示内容,再和之前的 gatfacl 做对比 ,就明显可以看到 当我们设置了 针对用户的
ACL 权限后 就会 在 user 那一栏 里 多了 pangting 用户 和其所对应的 权限 r-x
# 我们在使用 pangting 用户 验证一下 :
[root@bogon project]# su - pangting
[pangting@bogon ~]$ cd /project
[pangting@bogon project]$
显然,当给 pangting 用户 设置了 ACL 权限分配 r-x 后 那么 pangting 用户即可以访问
到 / project 目录 !
# 来试下 - x 选项 : 删除指定的权限
[root@bogon project]# setfacl -x u:pangting /project
[root@bogon project]# su - pangting
[pangting@bogon ~]$ cd /project
-bash: cd: /project: Permission denied
那么这个时候,当 删除掉了 pangting 的 ACL 权限分配 后,此时就明显可以看到
pangting 用户已经无法再对 / project 访问了 !!!
# 来看下 -b 选项 : 删除所有的 ACL 权限 !!
我们再把刚才删除的 pangting 用户重新设置 ACL 权限 ;
我们再创建一个 新用户 pangting2 并且给它 设置 好 ACL 权限 ;
[root@bogon ~]# setfacl -m u:pangting:r-x /project
[root@bogon ~]# useradd pangting2
[root@bogon ~]# setfacl -m u:pangting2:r-x /project
查看下 ACL 权限 :
[root@bogon ~]# getfacl /project
getfacl: Removing leading '/' from absolute path names
# file: project
# owner: teacher
# group: csagroup
user::rwx
user:pangting:r-x
user:pangting2:r-x
group::rwx
mask::rwx
other::---
- b 选项 :
[root@bogon ~]# setfacl -b /project
删除所有 就不需要指定了,直接删除 目录 / project 就行
查看 ACL 权限 :
[root@bogon ~]# getfacl /project
getfacl: Removing leading '/' from absolute path names
# file: project
# owner: teacher
# group: csagroup
user::rwx
group::rwx
other::---
# -d选项 :设定默认 ACL 权限。
只对目录生效,指目录中新建立的文件拥有此默认权限。
就是说如果对 目录设定了 默认权限,那也就意味着 这个目录中的 文件 也就拥
有了此默认权限 !!
我们先看看没有对目录设定默认权限之前,目录 和 其下的文件的权限是什么样子?
===>>>
在目录 / project 里创建文件
[root@bogon ~]# cd /project
[root@bogon project]# touch file1
查看 / project 的权限 :
===>>>
再查看 file 1 的 文件权限 :
===>>>
通过对比 :
===>>
目录 和 文件 的所属主 所属主 不一样; 权限也不一样 !!!
那现在,我们就用下 这个 -d 选项 ,就会使得 目录里新建的文件也会拥有此默认权限
那怎么设置默认权限呢 ??
===>>>
setfacl -d -m u: xxx( 用户名) xxx(一般权限) 目录名 (文件)
===>>>
可以看到,设置默认权限成功后,使用 getfacl 查看的时候,下面就出现了 default !!
然后,我们再在该目录下再新建一个文件,再查看下它的 ACL 权限 :
直接可以看到的是,当目录设置了默认权限后,该目录再新建文件的时候,该文件会自动就
和目录的权限保持一致!!
并且 你可以看到的是 出现了 # effective !!
由此,我们再 引出 # effective
# effective : 这个指的是 有效权限 !!!
那它咋来的呢 ??
===>>>
是根据 mask 来的!! 在上示结果中 : mask 是 rw-
effective : 是和 mask 与 过之后的权限 !!
以上示 : mask 是 rw- 也即是 110
又由于 user 权限是 101
所以其有效权限是 110( mask ) & 101 ( user ) == 100
所以,user 那一行的有效权限为 100 就是 r--
同理,又由于 group 权限为 rwx 也就是 111
所以其有效权限为 : 110(mask) & 111 ( group ) == 110
所以 ,group 那一行的有效权限就是 110 即 rw-
# -k 选项 : 删除默认权限
我们删除了 默认权限后,再查看其权限,可以看到 已经没有 default 了 !!
我们再在目录下创个文件 ,来看看这个文件还有没有 # effective 有效权限 !
显然,再在 目录下创建新文件,已经没有了 有效权限!!!
mask : 最大有效权限
怎么设置 mask 的权限呢 ?
===>>>
setfacl -m m:权限 文件名
示例 :
[root@bogon project]# setfacl -m m:rwx file2
上示我们把 mask 的权限就设置成了 rwx 也就是 111
注 :
需要清楚的是,当你把 mask 设置成 rwx 的时候也就是 111 的时候,那就意味
着 该文件不会再出现 # effective 有限权限 !!
因为 任何权限和 mask ( 当被设置为 111 ) 都会是本身 !
所以不会显示 # effective
拓展 :
我可以根据一个文件的 ACL 信息去设置 另一个文件的 ACL 信息
===>>>
使用 getfacl 的输出 作为 setfacl 的输入 ( 管道符 )
getfacl file-A | setacl --set-file=- file-B
示例 :
这是 file1 的 ACL 信息
[root@bogon project]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::r--
other::r--
这是 file2 的ACL 信息
[root@bogon project]# getfacl file2
# file: file2
# owner: root
# group: root
user::rw-
user:pangting:r-x #effective:r--
group::rwx #effective:rw-
mask::rw-
other::---
现在我们使用 命令 使得 file1 可以变为 file2 的ACL 信息
===>>>
[root@bogon project]# getfacl file2 | setfacl --set-file=- file1
然后查看 file1 的ACL 信息有没有变化
===>>>
[root@bogon project]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:pangting:r-x #effective:r--
group::rwx #effective:rw-
mask::rw-
other::---
显然,此时的 file 1 的 ACL 全新变的 和 file2 的一模一样了 !!!!