Linux权限管理之ACL权限

一、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命令,例如:

        Linux权限管理之ACL权限_第1张图片

        可以看到第一个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,例如:

        Linux权限管理之ACL权限_第2张图片

        【注意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权限

        Linux权限管理之ACL权限_第3张图片

        删除之后可以看到该目录上已经没有了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权限



你可能感兴趣的:(系统运维)