用户的特殊权限

       我们在之前的课程中已经讲过了基本权限。所谓的基本权限指得是,用户对文件拥有所有者所属组和其他人每个身份都有三个权限分别是读、写、执行,今天我们将介绍特殊权限ACL权限。

       所谓了ACL权限指的针对一个目录或文件指定一个用户,为这个用户分配指定的权限。

       这个ACL权限一般用在需要指定的用户拥有一定的权限的时候才会使用,就相当于windows的文件夹或文件的权限一样的,需要哪个用户有哪些权限就分配就可以了。

       举一个例子

wKioL1YiVwbw40SrAACyLj736No054.jpg

1

       上图为一个班级的共享目录,老师属于这个目录的所属主,拥有rwx权限,同学属于所属组,拥有rwx权限,其他人无权限,这时来了一个试听的学员,他需要的权限为5因为他也需要浏览这个目录获取一些资料,但是学校有规定,班级之间的目录不能互相查看。这时应该如何安排试听学员的身份呢?

       我们看一下,将它加入到所属组里那么他的权限为7了,对于试听学员来说权限过大,将其加入到其他人里给其他人设置4权限,但是这时其他班级的同学也能进行访问了,也不行,让他当所属主,那就需要将老师赶出去了,也不行,那怎么办呢?这时就需要我们今天要讲的ACL权限。

       当需要使用ACL权限时,分区必须支持ACL我们来看一下

       首先我们需要看一下分区的结构

       root@pc-benet~]# df -h

       Filesystem                      Size  Used Avail Use%     Mounted on

       /dev/mapper/vg_pcbenet-lv_root   18G 7.2G  9.3G  44% /

       tmpfs                           931M     0 931M   0%      /dev/shm

       /dev/sda1                       485M   39M 421M   9%     /boot

       [root@pc-benet~]# dumpe2fs -h /dev/mapper/vg_pcbenet-lv_root

       查看根根分区是否支持ACL    

       省略部分内容……

       Defaultmount options:    user_xattr acl    

       默认就已经支持ACL  这里我们看一下是为了以防万一,如果不支持怎么办,我们可以有两种临时挂在,永久挂载

       临时挂载: mount -o remount,acl  /  重新挂在根分区重启失效

       永久修改:vim /etc/fstab

       修改/结束的行 default后面加上,acl   //注意字符输入错误,会导致系统无法启动。需要重新启动。或者重新挂载根分区 

       mount  -o remount /   

       好了我们的系统已经可以支持acl这个特殊权限了,我们来看一下设定命令的格式。

       [root@pc-benet~]#    setfacl 选项  文件名

       -m         设定ACL权限

       -x           删除指定的ACL权限

       -b          删除所有ACL权限

       -d          设定默认ACL权限

       -k          删除默认ACL权限

       -R          递归设定ACL权限   

       下面我来演示这些选项,以及输出信息。

       我们根据上面的图来进行创建

       [root@pc-benet~]# mkdir /project

       [root@pc-benet~]# useradd  zhangsan  && passwd  zhansgan

       [root@pc-benet~]# useradd       lisi           && passwd  zhangsan

       [root@pc-benet~]# groupadd  tgroup

       [root@pc-benet~]# gpasswd  -a zhangsan tgroup

       Addinguser zhangsan to group tgroup

       [root@pc-benet~]# gpasswd  -a lisi tgroup

       Addinguser lisi to group tgroup

       [root@pc-benet~]# tail -1 /etc/group

       tgroup:x:502:zhangsan,lisi

       以上就是我们今天所用到的目录,用户,组。并且将用户加入到了组里。可以看到,我们已经成功的将用户加入到了tgroup组中

       我们还是与上图一样设置权限。

       [root@pc-benet~]# chown -R   root:tgroup /project/

       [root@pc-benet~]# chmod  -R 770 /project/

       [root@pc-benet~]# ls /project/ -ld

       drwxrwx---.2 root tgroup 4096 10 17 21:01 /project/

       我们这个目录的权限就已经设置完成了。

       现在我们为试听用户设置权限

       [root@pc-benet~]# useradd  st && passwd  st   //建立试听用户

       [root@pc-benet~]# setfacl  -m user:st:rx /project/

       -m  设定ACL

       -R递归子目录

       user:指定用户

       st:系统用户

       rw为权限列表  //即将分配的权限 

       /project  目录名

       [root@pc-benet~]# ls /project/ -ld

       drwxrwx---+ 2 root tgroup 4096 10 17 21:01 /project/

       可以看见这个目录除了普通权限还有了特殊权限ACL

       如果相查看具体的acl可以使用  getfacl  文件名的方式

       [root@pc-benet~]# getfacl  /project/

       省略部分信息……

       user::rwx

       user:st:r-x

       group::rwx

       mask::rwx

       other::---

       我们可以看见userstrx  已经有了读和执行。

       我们切换用户测试一下,使用我们之前学过的命令su - st 的方式进行切换。

      

       [root@pc-benet~]#

       [root@pc-benet~]# su - st

       [st@pc-benet~]$ cd /project/

       [st@pc-benetproject]$ ls

       [st@pc-benetproject]$ touch 123

       touch: 无法创建"123": 权限不够

       可以看到,进入、显示都没有问题但是创建就报错提示权限不足,因为没有写入的权限。

       我们还可以将一个组设置ACL权限

       [st@pc-benetproject]$ exit

       logout

       [root@pc-benet~]# groupadd  tgroup2

       [root@pc-benet~]# setfacl  -m group:tgroup2:rwx/project

       [root@pc-benet~]# getfacl  /project/

       省略部分内容……

       group:tgroup2:rwx

       好了这是属于这个组中的用户就拥有了读写执行的权限,不常用。

       这时我们使用root/project目录中touch 一个用户    

       [root@pc-benet~]# touch /project/123

       显示一下这个文件的具体权限。

       [root@pc-benet~]# ls /project/  -l

       总用量 0

       -rw-r--r--.1 root root 0 10 17 21:28 123

       可以看见新建的文件并没有acl权限,这是为什么啊?

       因为上面设置的是对已经存在的用户生效,新建的文件并不生效,我们可以这么来操作,将上面的命令稍微的改动一下就可以了。

       [root@pc-benet~]# setfacl   -m default:user:st:rx /project/

       [root@pc-benet~]# touch /project/456

       [root@pc-benet~]# ls /project/456  -l

       -rw-rw----+1 root root 0 10 17 21:32 /project/456

       就是在user前面加入了default

       上面讲了如何设置权限,查看权限,接下来我们讲解最大有效权限与删除ACL 权限。

       什么是最大有效权限。

       最大有效权限mask

       其实使用acl设置的权限并不是最终的权限,而是需要与mask权限进行相与得到的权限才是有效的权限。我们来看一张图

wKiom1YiVs6RVs3JAACUmy7cJlQ244.jpg

2

       我们来看一下AB两个权限列表

       AB相与如果ArB也有r得到的结果是A有读权限,如果ArB没有r则得到的结果就是A没有读的权限。

       默认的umask权限为rwx也就是最大值任何用户的权限与umask相与都等于用户权限本身。

       我们可以通过对umask权限进行修改。

       [root@pc-benet~]# setfacl  -m m:rx /project/ 

       将默认的umask权限改为rx

       这是umask权限就是读和执行了,这是就算你的用户的ACL权限为rwx但是你的实际权限也是rw,通过umask可也有效的控制的用户的权限,以防给出太高的权限。好了接下来我们再来看下一下删除ACL权限。

       格式为   setfacl  -x  group:组名   /project

       [root@pc-benet~]# setfacl  -x group:tgroup2 /project

       删除用户就将group改为user  将组名改为用户名

       setfacl  -b 文件名    删除所有acl权限

       [root@pc-benet~]# setfacl  -b /project/

       [root@pc-benet~]# ls /project/ -ld

       drwxrwx---.2 root tgroup 4096 10 17 21:32 /project/

       可以看见前面的+号消失了。

       这就是删除ACL权限。

       接下来我们来看一下递归ACL权限

       递归我们应该不陌生了,我们很多命令都提到过。

       也就是子目录继承父母了的ACL权限

       我先在/project下建立三个文件名为test1 test2 test3

       之后为这个目录设置st用户拥有rx权限

       看一下子文件是否继承了父目录的权限。

       [root@pc-benetproject]# touch test1 test2 test3

       [root@pc-benetproject]# setfacl  -m user:st:rx -R  ../project/

       [root@pc-benetproject]# ls -l

       总用量 12

       -rw-r-xr--+1 root root 0 10 17 21:59 test1

       -rw-r-xr--+1 root root 0 10 17 21:59 test2

       -rw-r-xr--+1 root root 0 10 17 21:59 test3

       可以看见子文件的权限也已经更改了。

       到了这里ACL权限就到这里了,都是一些常用的选项。