一、ACL权限简介与开启
ACL权限是一种为某个或某些用户特殊设置的权限,这种权限不收到所有者、所属组、其他用户这三种权限设置的限制,即可以脱离它们而单独设置权限。ACL权限就是为了解决这三种权限不能实现的一些特殊情况而出现的。
ACL权限不是某个目录上支持的特性,而是分区(即文件系统)所支持的特性。使用dumpe2fs命令查看某个分区是否支持ACL权限。dumpe2fs是查询指定分区详细的文件系统信息的命令,-h选项是显式超级块的信息,而不是磁盘块组的信息,例如:
dumpe2fs -h /dev/sda3 查看sda3分区是否支持ACL权限,如果有以下显式表示支持:
其实在Linux中所有分区挂在的时候默认都是支持了ACL权限的。如果不支持则需要重新挂在文件系统(即分区)并在挂载的时候设置挂载参数让其支持ACL权限,
例如:mount–o remount,acl /dev/sda3
这种方式是不用卸载分区即可开启,因为有些程序正在该分区上运行,也就是使用在联机状态下开启。但是这方式是临时开启ACL权限支持,重启系统之后就不生效了。如果要永久生效,那么和挂在分区一样需要编辑/etc/fstab文件,并在相应的分区上加入ACL参数。
/etc/fstab文件中是不能配置可移动存储设置的挂载信息的,例如光盘的挂载信息就不能配置到该文件中。因为不能保证每次启动系统都插入了光盘,如果系统找不到光盘则无法启动,因为对文件系统的检测不通过。
因为Linux默认支持了ACL权限,所以fstab文件的最后一列如果是defaults则表示已经支持了ACL。如果不支持,那么可以在defaults后使用逗号分割并写入“acl”这个参数即可,例如:
修改之后还需要使用mount–o remount /dev/sda3 重新挂载该分区或重启系统之后配置才能生效。
【注意】因为fstab文件是系统启动时读取的对文件系统的挂在配置,如果编辑该文件错误则无法启动。
二、ACL权限的查看与设置
1.getfacl命令查看acl权限
使用“getfacl文件名或目录名”即可查看文件或目录上是否设置了acl权限。
2.setfacl命令设置acl权限
该命令即可设置一个文件或目录的acl权限
语法:setfacl 选项 文件/目录名
可用选项如下:
-m:设定acl权限
-x:删除指定的acl权限
-b:删除所有的acl权限
-d:设定默认的acl权限
-k:删除默认的acl权限
-R:递归设置acl权限
补充:gpasswd –axxx tgroup 即可将xxx这个用户添加到tgroup这个组中。chownroot:tgroup /abc 修改/abc目录的所有者为root,所属组为tgroup。
为某个用户设置某个目录的acl权限:
setfacl –m u:st:rx /abc 为st这个用户设置对/abc目录的rx权限,u表示用户,如果是为group设置则使用g即可,例如: setfacl –mg:tgroup:rx /abc。例如:
如果为某个文件或目录设置了acl权限,那么该文件或目录的权限信息末尾会有一个“+”,表示具有了acl权限。如果要查看具体的acl权限,则可以使用getfacl命令,例如:
可以看到第一个user后的::表示所有者的权限,第二个user之后就表示sunjiabo这个用户对该目录有acl权限,具体权限为r-x。
该命令的结果有一个报错:getfacl:Removing leading '/' from absolute path names 意思是该命令不支持绝对路径的写法,但是并不影响最终结果。
三、最大有效权限
在getfacl命令结果中还有一个mask的行,mask是用来设置最大的acl有效权限的。如果我们给用户赋予了acl权限,是需要和mask的权限进行“与”之后才能得到用户最终的权限。mask默认就是rwx,所以默认给用户设置了什么权限,最终其得到的就是什么权限。
可以通过修改mask权限来修改分配acl权限时用户或组最终得到的权限。不过一般不用这么麻烦,直接让其默认rwx即可。
例如mask:rw-,那么即使为用户分配了acl权限的rwx,最终用户得到的也只有rw权限,因为-和x进行与运算之后就是假,所以最终为-。其实就是可以修改mask来决定最大给用户分配的acl权限。例如mask设置为r-x,那么为用户或组分配acl权限时其最大得到的权限就是r-x。有时候mask也是非常有用的。
修改mask权限还是使用setfacl命令,但是参数不是u或g,而是m,例如:
【注意】mask是对某个文件或目录设置的,就是该目录可以分配给用户或组的最大acl权限,而同同于系统对文件或目录的权限掩码,权限掩码是全局的,对所有文件和目录生效。
四、删除acl权限
有两种方式删除文件或目录上的acl权限。使用u或g指定删除某个用户或组对该文件或目录的acl权限,使用-b选项删除某个文件或目录上的所有用户和组的acl权限。
1.删除指定用户对某个文件或目录的acl权限
setfacl–x u:dog /abc 删除dog用户对/abc目录的acl权限。 u该为g就是删除组的acl权限
2.删除指定文件或目录上的所有用户和组的acl权限
setfacl–b /abc 删除了/abc目录上所有用户和组对该目录的acl权限
删除之后可以看到该目录上已经没有了acl权限。其实即使该文件或目录已经没有了哪个用户或组的acl权限,该文件或目录还是有acl权限被设置了这个特点,除非使用-b选项删除所有的acl权限,例如:
可以看到即使上面已经删除了/home/dog目录上唯一一个有acl权限用户对该目录的acl权限,但是权限信息最后一个还是“+”,表示该目录还具有acl权限(实质已经没有了),必须使用-b完全删除才可以。
通过上面删除acl权限再查看acl权限发现,删除acl权限之后mask变为---,使用-b删除所有acl权限之后mask行就消失了。
五、递归ACL权限
递归acl权限是针对目录的,也就是设置父目录的acl权限之后,其中的所有文件以及子目录都应用父目录的设置。命令如下:
setfacl -m u:用户名:权限–R 目录名
setfacl–m u:dog:rwx –R /abc 为dog用户设置/abc目录的acl权限为rwx,并且递归设置。
但是之后在该目录中新创建的文件或目录就不会应用到此设置。为了解决这个问题还需要使用到默认acl权限,也就是为父目录设置了acl权限之后,不仅当前的文件和子目录都具有了父目录上设置的acl权限,并且以后新增的文件或目录也自动继承父目录上的acl权限。只需要在设置命令上增加一个“d:”即可,例如:
setfacl –m d:u:dog:rw –R /abc 该命令为dog用户设置/abc目录的acl权限,并且以后在该目录中新增的文件和子目录都会继承对/abc目录的设置。即dog用户对/abc目录中新增的文件和目录也具有了rw权限。
注意此时还需要有-R,如果没有那么/abc的子目录中新增的文件和目录貌似就不会再继承默认acl权限?
并且在使用d选项设置默认acl权限之前,目录中有文件和子目录,那么执行该命令之后这些文件和子目录并不会应用上所设置的acl权限。因为增加了d选项之后,是针对/abc目录中未来出现的文件和目录进行设置默认的acl权限,而不是针对当前的文件和目录设置,所以为了保险期间,可以执行如下两条命令:
setfacl–m u:dog:rx –R /abc 先设置/abc目录中现有的文件和子目录的acl权限
setfacl–m u:dog:rx –R /abc 再设置/abc目录中未来出现的文件和子目录的默认acl权限