我们之前学习的权限控制,基本都是对某一类用户来进行访问控制,那么我们能否针对某个特定用户或者特定组做出权限放通或者限制呢?
这就是今天要给大家介绍的文件访问控制列表(ACL)。
各个文件可以通过ACL对指定的用户和组进行权限控制,而不是宽泛的把所有用户都分为user、group、other;ACL结合我们之前介绍的权限知识可以提供非常精细的权限管理。
此外,ACL作用于目录时,在此目录下创建的文佳或子目录,默认都遵循母目录的ACL,除非对本文件额外创建了ACL。
接下来介绍如何设置文件ACL,并举例帮助你理解其作用。
setfacl [options] [{-m|-x} acl参数] 目标文件名
选项与参数:
-m :设置后续的acl 参数给文件使用,不可与-x 合用;
-x :删除后续的acl 参数,不可与-m 合用;
-b :移除“所有的” ACL 设置参数;
-k :移除“默认的” ACL 参数,关于所谓的“默认”参数于后续范例中介绍;
-R :递回设置acl ,亦即包括次目录都会被设置起来;
-d :设置“默认acl 参数”的意思!只对目录有效,在该目录新建的数据会引用此默认值
赋权给用户:
setfacl -m u:USERNAME:MODE FILE...
赋权给组:
setfacl -m g:GROUPNAME:MODE FILE...
撤销赋权:
setfacl -x u:USERNAME FILE...
setfacl -x g:GROUPNAME FILE...
getfacl:查看ACL
getfacl FILE...
user:USERNAME:MODE
group:GROUPNAME:MODE
举例:
对root用户的家目录设置facl使得test用户能够切换为工作目录(这里只是在举例,事实上这样是很不安全的)
[root@localhost ~]# ll -d /root/
dr-xr-x---. 4 root root 204 Aug 15 13:10/root/
注解:如上,对于test而言,他对/root目录的权限是---
[root@localhost ~]# setfacl -m u:test:--x/root
[root@localhost ~]# su - test
Last login: Mon Aug 13 21:45:30 EDT 2018 onpts/1
[test@localhost ~]$ cd /root
[test@localhost root]$
[test@localhost root]$ ls
ls: cannot open directory .: Permissiondenied
[test@localhost root]$ ll -d /root
dr-xr-x---+ 4 root root 204 Aug 15 13:10/root
注解:看到了么,可以将工作目录切换至/root。不过因为没有读权限,无法获知目录下的内容,此时我们看/root的权限,你会发现原本九位权限之后的小点.变成了+,这就是设置了facl的标志。
使用getfacl查看该目录的访问控制列表,可以看到关于test的特别设置:
[root@localhost ~]# getfacl /root
getfacl: Removing leading '/' from absolutepath names
# file: root
# owner: root
# group: root
user::r-x
user:test:--x
group::r-x
mask::r-x
other::---
好了,我们把/root目录的权限改回来
[test@localhost root]$ su - root
Password:
Last login: Thu Aug 16 00:35:17 EDT 2018from 192.168.0.102 on pts/0
[root@localhost ~]#
[root@localhost ~]# setfacl -x u:test /root
[root@localhost ~]# ll -d /root
dr-xr-x---+ 4 root root 204 Aug 15 13:10/root
[root@localhost ~]# getfacl /root
getfacl: Removing leading '/' from absolutepath names
# file: root
# owner: root
# group: root
user::r-x
group::r-x
mask::r-x
other::---
你会发现,及时取消了test用户的acl,仍然显示有acl存在(ll文件时权限末尾还是+而不是.)
这是因为设置acl时,默认还会设置一个默认权限(mask),你可以选择再用:
[root@localhost ~]# setfacl -x mask /root
当有多条facl要删除的时候,使用-x一条一条删可能比较麻烦,你可以使用-b清空
[root@localhost ~]# setfacl -m user:test:--x/root
[root@localhost ~]# ll -d /root
dr-xr-x---+ 4 root root 204 Aug 15 13:10/root
[root@localhost ~]# setfacl -b /root
[root@localhost ~]# ll -d /root
dr-xr-x---. 4 root root 204 Aug 15 13:10/root
我们已经知晓了linux文件的权限访问机制。执行命令时,其实也是看是否对该命令的二进制文件具有执行权限的。很多时候管理性的命令又只有root有权去下达,那么每用到管理指令的时候都要切换到root用户吗?如果有多个权限不同的管理员,如何更好的去分配每个管理员的执行权限?下一节为大家解答