不知道大家是否发现,前文讲解的一般权限、特殊权限、隐藏权限其实有一个共性——权限是针对某一类用户设置的,能够对很多人同时生效。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(FACL,File Access Control Lists)了。通俗来讲,基于普通文件或目录设置ACL访问控制其实就是针对指定的用户或用户组设置文件或目录的操作权限,更加精准的派发权限。另外,如果针对某个目录设置了ACL,则目录中的文件会继承其权限;若针对文件设置了ACL,则文件不再继承其所在目录的权限。
为了更直观地看到ACL对文件权限控制的强大效果,我们先切换到普通用户,然后尝试进入root管理员的家目录中。在没有针对普通用户对root管理员的家目录设置ACL之前,其执行结果如下所示:
[root@linuxprobe ~]# su - linuxprobe [linuxprobe@linuxprobe ~]$ cd /root -bash: cd: /root: Permission denied [linuxprobe@linuxprobe root]$ exit
1. setfacl命令
setfacl命令用于管理文件的ACL权限规则,英文全称为:“set files ACL”,语法格式为:“ setfacl [参数] 文件名称”。
ACL权限提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数。setfacl命令的常用参数如表5-9所示:
表5-9 setfacl命令中的参数以及作用
参数 | 作用 |
-m | 修改权限 |
-M | 从文件中读取权限 |
-x | 删除某个权限 |
-b | 删除全部权限 |
-R | 递归子目录 |
例如我们原本是无法进入到/root目录中的,现在给这位普通用户单独设置下权限吧:
[root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root
随后再切换到这位普通用户的身份下,就能正常进入了呢:
[root@linuxprobe ~]# su - linuxprobe [linuxprobe@linuxprobe ~]$ cd /root [linuxprobe@linuxprobe root]$ ls anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates Desktop Downloads Music Public Videos [linuxprobe@linuxprobe root]$ exit
是不是觉得效果很酷呢?但是现在有这样一个小问题—怎么去查看文件上有那些ACL呢?常用的ls命令是看不到ACL表信息的,但是却可以看到文件的权限最后一个点(.)变成了加号(+),这就意味着该文件已经设置了ACL了。现在大家是不是感觉学得越多,越不敢说自己精通Linux系统了吧?就这么一个不起眼的点(.),竟然还表示这么一种重要的权限。
[root@linuxprobe ~]# ls -ld /root dr-xrwx---+ 14 root root 4096 May 4 2020 /root
2. getfacl命令
getfacl命令用于查看文件的ACL权限规则,英文全称为:“get files ACL”,语法格式为:“ getfacl [参数] 文件名称”。
getfacl命令用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”。Linux系统中的命令就是这么又可爱又好记。想要设置ACL,用的是setfacl命令;要想查看ACL,则用的是getfacl命令。下面使用getfacl命令显示在root管理员家目录上设置的所有ACL信息。
[root@linuxprobe ~]# getfacl /root ggetfacl: Removing leading '/' from absolute path names # file: root # owner: root # group: root user::r-x user:linuxprobe:rwx group::r-x mask::rwx other::---
ACL权限还可以针对某个用户组来设置,例如允许某个组的用户都可以读写/etc/fstab个文件:
[root@linuxprobe ~]# setfacl -m g:linuxprobe:rw /etc/fstab [root@linuxprobe ~]# getfacl /etc/fstab getfacl: Removing leading '/' from absolute path names # file: etc/fstab # owner: root # group: root user::rw- group::r-- group:linuxprobe:rw- mask::rw- other::r--
设置错了想删除?没问题!清空所有ACL权限用-b参数,指定删除某一条权限就用-x参数:
[root@linuxprobe ~]# setfacl -x g:linuxprobe /etc/fstab [root@linuxprobe ~]# getfacl /etc/fstab getfacl: Removing leading '/' from absolute path names # file: etc/fstab # owner: root # group: root user::rw- group::r-- mask::r-- other::r--
对于ACL权限的设置都是立即且永久生效的,不需要再编辑什么配置文件,这点特别方便~但是也有个安全隐患,如果我们不小心设置错了权限怎么办?就会覆盖掉文件原始的权限信息,并且永远都找不回来了。
操作前备份一下,总是好的习惯。
例如将/home目录上的ACL权限备份一份,要用-R递归参数,这样不仅能够把目录本身的权限备份了,里面的文件权限也都能自动备份,另再外加上第3章节学习过的输出重定向操作就可以实现:
[root@linuxprobe ~]# getfacl -R /home > backup.acl getfacl: Removing leading '/' from absolute path names [root@linuxprobe ~]# ls anaconda-ks.cfg Desktop Downloads Music Public Videos backup.acl Documents initial-setup-ks.cfg Pictures Templates
ACL权限的恢复也很简单,使用的是“--restore”参数,由于备份时已经指定了是对/home目录进行的操作,所以不需要写对应的目录名称,它能够自动找到要恢复的对象:
[root@linuxprobe /]# setfacl --restore backup.acl