一、什么是ACL
ACL是linux系统中一种被称为访问控制列表的权限控制方法,它是一种权限分配之外的普遍范式。在一般情况下,要确认三个权限组:owner、group和other。而使用ACL则可以增加权限给其他用户或组别,不再仅仅是在“other”中定义权限,可以允许指定的用户拥有不同于其所属组的权限。
ACL支持多种Linux文件系统,包括ext2, ext3, ext4, XFS,
Btfrs, 等。CentOS6及之前的版本,仅操作系统安装时创建的文件系统才会默认开启ACL,手工创建的文件系统,需要手工开启ACL功能。
二、启动ACL的方法
mount -o acl /dev/sda7 取消的方式,重新挂载时不指定即可
tune2fs -o acl /dev/sda7 取消的方式 tune2fs -o ^acl /dev/sda7
以上两种方式开启的ACL可以通过mount查看是否开启ACL。
三、ACL权限判断的顺序
先判断是否是文件的OWNER,如果是,则执行OWNER的权限后结束,如果不是OWNER,则判断是否是ACL的USER,如果是则执行USER权限后结束,如果不是ACL的USER, 则判断是否属于GROUP或ACL GROUP,如果是,则取最大权限(即两者权限的合集)。如果不属于任何GROUP,则执行OTHER。
四、命令示例
基础ACL通过两条命令管理:setfacl用于增加或者修改ACL,getfacl用于显示分配完的ACL。
命令语法:1、setfacl -m u:username:—[, u:username:—]file[direct](中括号表示可选择)作用:设置ACL USER
2、getfacl file[direct] 作用:查看指定文件的ACL设置
示例:首先在/app目录下创建testdir目录,并在该目录下分别创建目录dir和文件file(便于区分),新创建的文件其用户和用户组均为root,先要将testdir目录分享给sky用户,并为其分配rx权限,结果如下图所示。
命令语法:setfacl -m g:groupname:— file[direct] 作用:设置ACL GROUP
示例:设置用户组big对于testdir具有写的权限,big用户组中的辅助组成员有mu用户,结果如下图所示。
命令语法:setfacl –Rm u:username:— direct/direct[file] 作用:递归设置
示例:设置用户wind对于testdir及其目录下的文件具有读写以及执行的权限,结果如下图所示。
命令语法:setfacl -m d: u:username:— direct/direct[file] 作用:设置ACL默认权限,仅影响新创建的文件及目录,不影响当前。
示例:要求guanyu用户对testdir目录及所有用户在其下创建的新文件新目录均有rwx权限,结果如下图所示:
命令语法:getfacl -R /direct > filetxt 作用:将目录下的所有文件的ACL属性备份到文件(-R在此处仍是递归的作用)
示例:将testdir/dir的ACL属性备份到acltxt文件中,结果如下图所示。
命令语法:setfacl -x u:username direct[file] 作用:单独去除一条ACL权限
示例:删除guanyu用户的ACL权限
结果显示删除成功。
命令语法:setfacl -X aclrm.txt direct[file]
aclrm.txt 内容如下
u:username
g:groupname
结果显示删除成功。
命令语法:setfacl -b file 作用:去除该文件上ACL属性。
结果显示删除成功。
命令语法:setfacl -x d:name direct[file] 作用:删除一条默认权限
setfacl -x g:groupname direct[file] 删除一条非默认组的权限(不加d即可)
结果显示删除成功。
命令语法:setfacl -k direct[file] 作用:删除全部默认权限
结果显示删除成功。
命令语法:setfacl -b direct[file] 作用:删除ACL属性
结果显示删除成功。
命令语法:
setfacl -R
–set-file=acl.txt direct[file] 作用:通过文件还原ACL属性的方法1
setfacl –restore
acl.txt 通过文件还原ACL属性的方法2
结果显示还原成功。
从以上的结果显示中,我们会发现有一个mask的值,那么mask的作用是什么呢?让我们来做一个实验:首先在之前设置的基础上将testdir的所有者改为mu用户,所有组同样改为mu,因为root用户是超级管理员,其权限最大,为避免因为root用户权限过大而出现影响实验结果的现象所以将文件所有者改为普通用户。然后我们设置mask的值为wx,其语法命令格式与上述的设置用户的权限类似:setfacl -m mask:—
file[direct],然后查看不同用户对于testdir的权限变化,结果如下图所示。
显而易见,之前的mask值为rwx,在将mask值修改为wx之后我们看到方框标志的两部分出现了明显的不同,sky、wind以及group的权限后面均产生新的权限,而big用户组因为其之前的权限与mask相同,所以没有发生变化。那么不同用户的真正权限是保持之前的还是与#effective的提示相同呢,我们可以来具体的测试一下:
首先使用测试文件所有者的权限是否变化,结果如下图所示。
由此可见,mask的值并未影响到文件所有者的权限。
接下来我们来验证sky用户的权限,结果如下图所示。
结果显示,sky用户仅仅可以进入testdir目录,读写权限均没有,仅有执行权限。这样是不是验证#effective显示的权限就是用户或用户组的实际权限,我想我们还是需要一一验证一下。
此结果显示的是wind用户对于testdir的权限,由结果显示可知,wind用户对于testdir的权限是wx。最后我们来验证一下文件所属组的权限,首先我们将新建一个用户使其成为用户组mu的辅助成员,但对于testdir并没有其他权限,从而完全继承mu用户组的权限以便于验证,结果如下图所示。
由结果可以看出用户xm的权限仅有执行权限,读写权限均没有。
现在,我们已经将受mask值影响的用户及用户组的权限一一验证过,由此可以得出以下结论:
1、mask值对于文件所有者的权限并不产生影响;
2、mask对除了文件所有者之外的用户或者用户组产生权限的影响;
3、被影响的用户或用户组的最大权限不能超过mask设置的权限,即其真正权限为自身原设置的权限与mask值的交集。
【补充】1、ACL MASK随着新的ACL设置会被重置,重置的标准是让该文件上的所有ACL及文件原GROUP上的权限都有效,所以一般情况下都是将所有的ACL设置完成之后再最后设置mask的值。
2、修改mask值的方法有两种,除了上述提到过的setfacl -m mask:—
file[direct],还有chmod g=rwx file[direct]这种方法,因为一旦设置了ACL权限后,原有的文件GROUP不可再更改,但权限并没有失效,使用chmod即修改ACL MASK,且在使用ll命令查看文件的权限时,在原来group的权限位置上显示的也是mask的权限值,只有当取消ACL之后才会显示真正的group权限。
总结:虽然增加了很多示例,但是希望读者可以自己也做一些相关的实验,编者的角度毕竟也是仅仅从个人的学习角度出发,并不能涵盖所有的方面,有些问题可能解释的并不完美,同时也存在一些暂时没有发现的问题。Linux的学习需要学习他人的经验,但更需要个人的练习以及个人的思考,加油每一个学习linux的朋友!