Linux的ACL是文件权限访问的一种手段。当拥有者所属组其他人(own,group,other)不能满足给一个单独的用户设置单独的权限时,ACL的出现就很好的解决了该问题。

比如其他用户own,不属于log文件的拥有者也不在log文件的所属组中,而log文件对于其他人无法访问,此时想单独给own用户开小灶,怎么办呢?acl就是用来开小灶的,单独给own用户设置对log文件的权限,使得仅仅own用户对于log文件有读、写或者执行的权限。

 

1、查看系统是否支持ACL?如何加载ACL属性

centos7 指定用户获取所有文件夹权限 centos7查看文件权限_系统启动

 我的系统根目录挂载在/dev/mapper/centos-root目录下,这时候我们就需要查看/dev/mapper/centos-root目录是否支持ACL

centos7 指定用户获取所有文件夹权限 centos7查看文件权限_yum源_02

 因为我使用的系统是CentOS 7,而CentOS 7默认创建分区并写入文件系统时附加上ACL属性,所以我通过dmesg系统启动信息,直接查到“SGI XFS with ACLs”。通过网上查找,可以使用dumpe2fs -h /dev/mapper/centos-root 来查看是否附加了ACL属性。

接下来mount -o remount,acl 临时开启ACL属性,vim /etc/fstab可以永久设置开机附加ACL属性。

centos7 指定用户获取所有文件夹权限 centos7查看文件权限_centos_03

  /etc/fstab文件用于在系统启动时,自动将指定的文件系统挂载到指定的目录。<file system> 表示要挂载的分区或者存储设备,如U盘  <dir>表示存储设备要挂载到哪个目录下  <type>表示要挂载的分区或者存储设备的文件系统类型,一般为ext2、ext3、ext4、xfs、ntfs......,其他的几个参数可以依葫芦画瓢,当然这里需要在default加上逗号,acl , reboot重启

 

2、如果没有ACL属性,需要手动安装ACL包

首先配置国内yum源或者配置本地yum源,如果已经配置请自动过滤。

https://mirrors.huaweicloud.com/  华为yum源配置地址

centos7 指定用户获取所有文件夹权限 centos7查看文件权限_系统启动_04

 yum install libacl acl -y 安装acl和libacl包,接着再安装上面的操作设置开机自启动ACL

 

3、ACL权限设置

Linux设置文件ACL权限是通过setfacl工具来设置的,通过getfacl工具来获取ACL访问控制列表

centos7 指定用户获取所有文件夹权限 centos7查看文件权限_yum源_05

ls -l工具可以查看到文件所属的九列权限,同时可以看到九列权限之后一位:如果是点(.)表示仅仅有九列权限,如果是+,表示除九列之外还有ACL权限,这时候就需要通过getfacl工具查看ACL权限

centos7 指定用户获取所有文件夹权限 centos7查看文件权限_yum源_06

如果文件或者目录存在ACL权限,那么通过九列权限来判断用户对文件是否有访问权就不能一概而论了。下面解释一下如何看这张表:

1> 表的前三列以#字号注释,表示该三行是解释说明的意思,不起作用

file:后面紧跟文件或者目录名称

owner:后面紧跟文件拥有者

group:后面紧跟文件所属组

2>#字之后的每一行代表一条ACL规则

user::rwx      user是用户的意思(关键字);冒号(:)起到分隔的作用,分隔域;第一个冒号之后是用户名;第二个冒号之后是熟悉的权限:r(读)、w(写)、x(执行)、-(无权限)

所以user:tel:rwx 表示用户tel对目录log有读写进入目录的权限,尽管从九列来看tel属于其他用户,它应该仅仅有读和进入目录的权限,但因为log目录设置了ACL规则,所以以ACL规则为主,而九列对tel用户不起作用,但是对除tel的其他用户(other列)还是有r-x的权限的

那么问题来了,user::rwx 两个冒号之间啥都没有事什么意思?缺省的是注释owner:root用户,所以全称应该是user:root:rwx,只是在这里缺省了而已。

 

然后goup::r-x   other::r-x 分别表示log目录对所属组root组有r-x权限,对其他用户有r-x权限

 

其实,user::rwx介绍的ACL权限有点差错!应该说只要文件或者目录设置ACL权限,那么就以ACL权限为唯一权限了,本质上可以将九列理解为ACL规则一部分,ACL规则执行的顺序是自上而下的执行,当tel用户从user::rwx执行到user:tel:rwx时,符合规则,对应权限为rwx,那么后面的group::r-x  other::r-x更本就没有执行,ACL规则执行到符合规则的行就不执行后面的规则。

 

3>setfacl 工具设置ACL规则

setfacl [选项...] filename....

centos7 指定用户获取所有文件夹权限 centos7查看文件权限_yum源_07

centos7 指定用户获取所有文件夹权限 centos7查看文件权限_centos_08

setfacl 命令之后你能说root组(假设root组为普通组,root在Linux中就是上帝,没有访问权限,root用户也可以读写执行)有rwx的权限吗?但实质上,这里的组rwx确是tel组的权限。你的第一眼看见+号,直接getfacl来查看权限,而不是依据九列权限来识别权限。(同时,这条命令看似有点多此一举,因为tel用户执行不到group:tel:rw-,但是tel组不一定只有tel用户)

--modify=acl        修改文件或目录的ACL规则          --modify的ACL规则可以设置多条,每条用逗号隔离开,setfacl文件也可以多个文件一起来修改

--modify-file=filename    从文件读取ACL规则,并以此为模板修改文件权限

centos7 指定用户获取所有文件夹权限 centos7查看文件权限_centos_09

 ACL规则的文件依据getfacl显示模板,一条规则一行, --modify-file后面可以用绝对路径也可以用的相对路径

 

-x, --remove=acl                从ACL规则列表中移除某项规则  

-X, --remove-file=filename             从文件读取ACL规则并以此为模板批量移除ACL规则  (注意:从文件删除ACL规则,需要对应到每条规则)

下面使用--remove=acl   --remove-file=filename将上面建立的规则清空

centos7 指定用户获取所有文件夹权限 centos7查看文件权限_系统启动_10

 

 

-b,--remove-all        移除文件所有扩展的ACL规则

centos7 指定用户获取所有文件夹权限 centos7查看文件权限_系统启动_11

只有使用--remove-all移除acl规则,才能使ls -l log2011..log文件九项权限列之后的+号去除。否则,+号会让你很慌。

 

最后一个setfacl参数是-R,--recursive    递归操作到所有的子目录和文件

至于getfacl工具参数,基本上就没啥好说的,getfacl filename...我想就够用了

 

END