Linux基础之权限管理ACL

来源:互联网 发布:大数据开发难学吗 编辑:程序博客网 时间:2024/06/08 10:47

今天我们来了解一下在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 查询。

 

 

 

原创粉丝点击