今天我们来了解一下在Linux下怎样实现灵活的权限管理——ACL。下图是本篇文章ACL的主要内容。
ACL是什么
Linux下的默认权限分为三种,即owner(所有者),group(所属组)和other(其它)。这样的话,就只能将用户分为三类权限,这三种文件权限一般情况下可以满足我们的需要,但是在有些情况下,当用户的权限需求超过三种,默认权限位是远远不够的。例如: 1、在/testdir/dir里创建的新文件自动属于g1组,组g2的成员如:alice能对这些新文件有读写权限,组g3的成员如:tom只能对新文件有读权限,其它用户(不属于g1,g2,g3)不能访问这个文件夹。这时,需要设置五种权限,默认的三种权限设置满足不了需求。因此,在有些情况下,就需要用到ACL(Access Control List访问控制列表)来实现更加灵活的权限管理。因此ACL可以简要概括为:除了文件的所有者,所属组和其它人,可以对更多的用户设置权限。
使用前提:
ACL需要文件系统的支持。Linux主要使用的文件系统有:ext2,ext3,ext4,xfs。在这些文件系统中都支持ACL功能。
CentOS7当中,无论是操作系统安装时还是之后手工创建的文件系统(xfs、ext4)均会开启ACL功能。
CentOS6及之前的版本,仅操作系统安装时创建的文件系统才会默认开启ACL,手工创建的文件系统,需要手工开启ACL功能。
开启的方式mount -o acl /dev/sda7 ; mount -o remount,acl /dev/sda7(在不卸载分区的情况下开启ACL),以上两种方式开启的ACL可以通过mount |grep sdaX查看(X是磁盘标号,例如sda7),取消的方式,重新挂载时不指定即可。
开启的方式tune2fs -o acl /dev/sda7,使用以上方式开启的ACL可以通过tune2fs -l /dev/sda7 |grep option查看,取消的方式 tune2fs -o ^acl /dev/sda7。
ACL权限生效顺序:
所有者-->自定义用户-->所属组或自定义组-->其他人
先判断是否是文件的OWNER,如果是,则执行OWNER的权限后结束,如果不是OWNER,则判断是否是ACL的USER,如果是则执行USER权限后结束,如果不是ACL的USER, 则判断是否属于GROUP或ACL GROUP,如果是,则取最大权限。如果不属于任何GROUP,则执行OTHER。
设置ACL权限:
getfacl file |directory 查看文件ACL权限(查询结果也包括传统权限)
setfacl -m u:username:rwx file|directory 给文件或目录设置ACL user
setfacl -m g:groupname:rwx file| directory给文件或目录设置ACL group
setfacl -m u/g:username/groupname:rwx [,u/g:....] file|directory 设置ACL USER/Group,以逗号为间隔,可以给一个文件设置多个ACL权限
setfacl -Rm g: groupname:rwX directory 递归设置ACL user权限(目录的权限是rwx,文件的权限为rw)
setfacl -Rm g: groupname:rwX directory 递归设置ACL group权限(目录的权限是rwx,文件的权限为rw)
setfacl -m d:u:username:rwx directory 设置ACL user默认权限,仅影响新创建的文件及目录,不影响当前。
setfacl -m d:g:groupname:rwx directory 设置ACL group默认权限,仅影响新创建的文件及目录,不影响当前。
setfacl -M file.acl file|directory 批量设置ACL或者基于一个文件的ACL设置另一个文件,可实现对一个文件或目录ACL备份和恢复的功能
setfacl -x u/g:username/groupname file |directory 删除一条ACL权限
setfacl -X file.acl file|directory 批量删除ACL权限
setfacl-k file|dir 删除默认ACL权限
setfacl–b file|dir 清除所有ACL权限
getfacl file1 | setfacl--set-file=- file2 复制file1的acl权限给file2
下面就各个命令就使用方法给出示例:
getfacl file |directory 查看文件ACL权限(查询结果也包括传统权限)
setfacl -m u:username:rwx file|directory 给文件或目录设置ACL user
setfacl -m g:groupname:rwx file| directory给文件或目录设置ACL group
示例:
在acltest目录下新建一个文件f1,执行ll长列出f1文件,此时还是默认的三种权限。执行setfacl -m u:alice:r命令w f1后,再ll长列出f1文件,可以观察到默认权限的最后一位由'.'变成了'+',代表设置了ACL权限,此时要查看f1文件的所有权限,需要执行getfacl f1,可以看到,查询结果包括了传统权限和ACL权限。
执行setfacl -m g:g2:rw f1,增加ACL组权限,给g2组设置rw权限,从下图中可以看出比上图多了一行group:g2:rw-,代表设置g2组的权限设置成功
setfacl -m u/g:username/groupname:rwx [,u/g:....] file|directory 设置ACL USER/Group,以逗号为间隔,可以给一个文件设置多个ACL权限
setfacl -Rm g: groupname:rwX directory 递归设置ACL user权限(目录的权限是rwx,文件的权限为rw)
setfacl -Rm g: groupname:rwX directory 递归设置ACL group权限(目录的权限是rwx,文件的权限为rw)
示例:
创建一个目录dir1,在dir1下新建一个文件f1,长列出dir1和f1,此时目录dir1的权限为755,f1文件的权限为644。执行setfacl -Rm g:g2:rwX dir1/,递归设置ACL权限。从图中可看出g2组在dir1目录的权限为rwx,g2组在f1目录的权限为rw-,递归设置ACL权限成功。但是,这样设置的权限只对已存在的文件有效,对未来创建的文件或目录无效。
要实现设置的ACL权限对目录内以后创建的文件或目录都有效,就需要下面的命令:
setfacl -m d:u:username:rwx directory 设置ACL user默认权限,仅影响新创建的文件及目录,不影响当前。
setfacl -m d:g:groupname:rwx directory 设置ACL group默认权限,仅影响新创建的文件及目录,不影响当前。
示例:
新建一个目录dir2,在dir2下新建一个文件f1,执行setfacl -Rm g:g2:rwx dir2 对dir2目录及其内的文件f1递归设置ACL权限 ,执行setfacl -m d:g:g2:rwx dir2,设置ACL默认权限,仅影响新创建的文件及目录,不影响当前,此时,再新建一个文件f2。执行getfacl -R dir2查看ACL权限。可以看到,和上图不同之处,f2文件设置ACL 权限成功。但是,需要注意:我设置给g2组的默认权限是rwx,但是组g2对f2的有效权限是rw,这和mask值有关,稍后会讲到这一点。需要记住的是:通过ACL赋予目录默认x权限,目录内文件也不会继承x权限
setfacl -M file.acl file|directory 批量设置ACL或者基于一个文件的ACL设置另一个文件,可实现对一个文件或目录ACL备份和恢复的功能
示例:
上面已经给dir1设置过ACL权限,执行getfacl dir1查看dir1的ACL权限。新建一个目录dir3,执行getfacl dir1 > acl.txt,将dir1的ACL权限导出到acl.txt文件中。执行setfacl -M acl.txt dir3,基于dir1的ACL权限设置dir3的ACL权限。查看dir3的ACL权限,和dir1的ACL权限完全相同。如果dir1的ACL权限被破坏也可以通过这种方式恢复自己的ACL权限。即setfacl的-M选项可以基于一个文件的ACL设置另一个文件,可实现对一个文件或目录ACL备份和恢复的功能。
除了直接导出一个文件的ACL权限,保存到acl.txt文件中,也可以在acl.txt文件中写好要设置的多条ACL权限,这样不用在命令行中每次都要输入。
setfacl -x u/g:username/groupname file |directory 删除一条ACL权限
setfacl -X file.acl file|directory 删除多条ACL权限
setfacl-k file|dir 删除默认ACL权限
setfacl–b file|dir 清除所有ACL权限
getfacl file1 | setfacl--set-file=- file2 复制file1的acl权限给file2
mask值
mask只影响除所有者和other的之外的人和组的最大权限,mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission),用户或组的设置必须存在于mask权限设定范围内才会生效。
设置mask值方法:
setfacl -m mask:rwx file|dir或 chmod g=rwx file|dir 一旦设置了ACL权限后,原有的文件GROUP不可再更改,使用chmod即修改ACL MASK
ACL MASK随着新的ACL设置会被重置,重置的标准是让该文件上的所有ACL及文件原GROUP上的权限都有效。
示例:
新建一个文件f1,执行setfacl -m u:alice:rwx,为f1设置ACL user权限为rwx,当执行f1setfacl -m mask:rw f1,设置mask值为rw后,有效权限为rw。
备份和恢复ACL
getfacl -R file|dir > acl.txt 将目录下的所有文件的ACL属性备份到文件
setfacl -R -b file|dir 清除目录下所有文件的ACL属性
通过文件还原ACL属性的方法1:setfacl -R --set-file=acl.txt file|dir
通过文件还原ACL属性的方法2:setfacl --restore acl.txt
习题小测
现在回到我们在文章开篇提到的问题,学了ACL权限设置,这个问题就能够解决了。
问题:
在/testdir/dir里创建的新文件自动属于g1组,组g2的成员如:alice能对这些新文件有读写权限,组g3的成员如:tom只能对新文件有读权限,其它用户(不属于g1,g2,g3)不能访问这个文件夹。
执行步骤和截图如下:
[root@centos7 ~]# mkdir -p /testdir/dir
[root@centos7 ~]# groupadd g1
[root@centos7 ~]# groupadd g2
[root@centos7 ~]# groupadd g3
[root@centos7 ~]# useradd -G g2 alice
[root@centos7 ~]# useradd -G g3 tom
[root@centos7 ~]# ls -ld /testdir/dir/
drwxr-xr-x. 2 root root 6 Jul 26 15:06 /testdir/dir/
[root@centos7 ~]# chgrp g1 /testdir/dir/
[root@centos7 ~]# chmod g+s /testdir/dir/
[root@centos7 ~]# ls -ld /testdir/dir/
drwxr-sr-x. 2 root g1 6 Jul 26 15:06 /testdir/dir/
[root@centos7 ~]# chmod o=- /testdir/dir/
[root@centos7 ~]# ls -ld /testdir/dir/
drwxr-s---. 2 root g1 6 Jul 26 15:06 /testdir/dir/
[root@centos7 ~]# setfacl -m g:g2:rx,g:g3:rx /testdir/dir/
[root@centos7 ~]# setfacl -m d:g:g2:rw,d:g:g3:r /testdir/dir/
这篇文章就到此结束了,更多内容请执行man acl 查询。