• Linux学习-32-ACL访问控制权限


    9.7 Linux ACL访问控制权限(包含开启方式)
    • Linux 系统传统的权限控制方式,无非是利用 3 种身份(文件所有者,所属群组,其他用户),并分别搭配 3 种权限(读 r,写 w,访问 x)。比如,我们可以通过 ls -l 命令查看当前目录中所有文件的详细信息,其中就包含对各文件的权限设置:
    [root@CncLucZK test]# ll
    total 5280
    -rw-r--r-- 1 root root      38 Oct 12 23:10 add.sh
    -rw-r--r-- 1 root root      41 Oct 12 23:10 awk.sh
    -rw-r--r-- 1 root root 5324748 Oct 12 23:10 blog.docx
    drwxr-xr-x 3 root root    4096 Oct  9 21:11 config
    -rwxr-xr-x 1 zk   zk        90 Oct 13 18:56 demo2.txt
    -rw-r--r-- 1 root root      90 Oct 13 20:06 demonew.txt
    -rw-rw-rw- 1 zk   root    2612 Oct 15 23:01 demo.txt
    -rwxr-xr-x 1 root root     117 Oct 12 23:10 test.sh
    lrwxrwxrwx 1 root root       7 Oct 12 23:10 tmp_s.txt -> tmp.txt
    -rw-r--r-- 1 root root       6 Oct 12 23:10 tmp.txt
    drwx--x--x 4 root root    4096 Oct 12 23:10 user
    drwx--x--x 6 root root    4096 Oct 12 23:10 users
    -rw-r--r-- 1 root root     382 Oct 13 18:33 users.tar.gz
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 该输出信息中,“rwxr-xr-x”就指明了不同用户访问文件的权限,即文件所有者拥有对文件的读、写、访问权限(rwx),文件所属群组拥有对文件的读、访问权限(r-x),其他用户拥有对文件的读、访问权限(r-x)。

    权限前的字符,表示文件的具体类型,比如 d 表示目录,- 表示普通文件,l 表示链接文件,b 表示设备文件,等等。

    • 但在实际应用中,以上这 3 种身份根本不够用,如:一个只允许属组和属主访问修改的目录,外部用户无法访问修改,若临时安排一个外部的用户可以进行访问,那么它得有rx权限,可是如何分配它的身份呢?变为属主?当然不行,要不 root 该放哪里?加入 属组?也不行,因为属组的权限是 rwx,而我们要求这个临时外部用户的权限是 r-x。如果把其他人的权限改为 r-x 呢?这样一来,其他外部用户都可以访问该目录了。显然,普通权限的三种身份不够用了,无法实现对某个单独的用户设定访问权限,这种情况下,就需要使用 ACL 访问控制权限。

    • ACL,是 Access Control List(访问控制列表)的缩写,在 Linux 系统中, ACL 可实现对单一用户设定访问文件的权限。也可以这么说,设定文件的访问权限,除了用传统方式(3 种身份搭配 3 种权限),还可以使用 ACL 进行设定。拿该临时用户来说,既然赋予它传统的 3 种身份,无法解决问题,就可以考虑使用 ACL 权限控制的方式,直接对该用户设定访问文件的 r-x 权限。

    • 开启 ACL 权限:CentOS 系统中,ACL 权限默认处于开启状态,无需手工开启。但如果你的操作系统不是 CentOS,可以通过如下方式查看ACL权限是否开启:

    #使用mount命令可以看到系统中已经挂载的分区,但是并没有看到ACL权限的设置
    [root@CncLucZK /]# mount
    ...
    /dev/vda1 on / type ext4 (rw,relatime)
    ...
    #dumpe2fs是查询指定分区文件系统详细信息的命令
    [root@CncLucZK /]# dumpe2fs -h /dev/vda1
    dumpe2fs 1.45.6 (20-Mar-2020)
    Filesystem volume name:   
    Last mounted on:          /
    Filesystem UUID:          659e6f89-71fa-463d-842e-ccdf2c06e0fe
    Filesystem magic number:  0xEF53
    Filesystem revision #:    1 (dynamic)
    Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
    Filesystem flags:         signed_directory_hash 
    Default mount options:    user_xattr acl			#已经默认挂载ACL权限
    Filesystem state:         clean
    Errors behavior:          Continue
    Filesystem OS type:       Linux
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    其中,dumpe2fs 命令的 -h 选项表示仅显示超级块中的信息,而不显示磁盘块组的详细信息;

    使用 mount 命令可以查看到系统中已经挂载的分区,而使用 dumpe2fs 命令可以查看到这个分区文件系统的详细信息。大家可以看到,我们的 ACL 权限是 /dev/vda1分区的默认挂载选项,所以不需要手工挂载。

    • 如果 Linux 系统如果没有默认挂载,可以执行如下命令实现手动挂载:
    [root@CncLucZK ~]# mount -o remount,acl /
    #重新挂载根分区,并加入ACL权限
    
    • 1
    • 2
    • 使用 mount 命令重新挂载,并加入 ACL 权限。但使用此命令只是临时生效,要想永久生效,需要修改 /etc/fstab 文件,修改方法如下:
    [root@CncLucZK ~]#vi /etc/fstab
    UUID=c2ca6f6f89-71fa-463d-842e-ccdf2c06e0fe /ext4 defaults,acl 1 1
    #加入ACL权限
    [root@lCncLucZK ~]# mount -o remount /
    #重新挂载文件系统或重启系统,使修改生效
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 在你需要开启 ACL 权限的分区行上(也就是说 ACL 权限针对的是分区),手工在 defaults 后面加入 “,acl” 即可永久在此分区中开启 ACL 权限.
    9.8 ACL权限设置(setfacl和getfacl)
    • 设定 ACl 权限,常用命令有 2 个,分别是 setfacl 和 getfacl 命令,前者用于给指定文件或目录设定 ACL 权限,后者用于查看是否配置成功。getfacl 命令用于查看文件或目录当前设定的 ACL 权限信息。该命令的基本格式为:
    [root@CncLucZK ~]# getfacl 文件名
    
    • 1
    • getfacl 命令的使用非常简单,且常和 setfacl 命令一起搭配使用。setfacl 命令可直接设定用户或群组对指定文件的访问权限。此命令的基本格式为:
    [root@CncLucZK ~]# setfacl 选项 文件名
    
    • 1

    该命令可以使用的所用选项及功能。

    选项功能
    -m 参数设定 ACL 权限。如果是给予用户 ACL 权限,参数则使用 “u:用户名:权限” 的格式,例如 setfacl -m u:u1:rx /project 表示设定 u1 用户对 project 目录具有 rx 权限;如果是给予组 ACL 权限,参数则使用 “g:组名:权限” 格式,例如 setfacl -m g:tgroup:rx /project 表示设定群组 tgroup 对 project 目录具有 rx 权限。
    -x 参数删除指定用户(参数使用 u:用户名)或群组(参数使用 g:群组名)的 ACL 权限,例如 setfacl -x u:st /project 表示删除 st 用户对 project 目录的 ACL 权限。
    -b删除所有的 ACL 权限,例如 setfacl -b /project 表示删除有关 project 目录的所有 ACL 权限。
    -d设定默认 ACL 权限,命令格式为 “setfacl -m d:u:用户名:权限 文件名”(如果是群组,则使用 d:g:群组名:权限),只对目录生效,指目录中新建立的文件拥有此默认权限,例如 setfacl -m d:u:st:rx /project 表示 st 用户对 project 目录中新建立的文件拥有 rx 权限。
    -R递归设定 ACL 权限,指设定的 ACL 权限会对目录下的所有子文件生效,命令格式为 “setfacl -m u:用户名:权限 -R 文件名”(群组使用 g:群组名:权限),例如 setfacl -m u:st:rx -R /project 表示 st 用户对已存在于 project 目录中的子文件和子目录拥有 rx 权限。
    -k删除默认 ACL 权限。
    • 举例:
      • root用户建立一目录tproject,作为tproject 的所有者,对 tproject 目录拥有 rwx 权限;
      • 供tgroup组内人员使用,tgroup组作为 project 目录的所属组,拥有对 project 的 rwx 权限;
      • 新增一个其他用户ou1,访问tproject的权限为0(即:—),
      • 所以对于用户ou1来说,,我们对其设定 ACL 权限,令该用户对tproject拥有 rx 权限。
    [root@CncLucZK /]# cd test
    [root@CncLucZK test]# useradd ou1
    [root@CncLucZK test]# groupadd tgroup		#添加需要试验的用户和用户组,省略设定密码的过程
    [root@CncLucZK test]# mkdir tproject		#建立需要分配权限的目录
    [root@CncLucZK test]# ll -d tproject
    drwxr-xr-x 2 root root 4096 Oct 16 11:27 tproject
    [root@CncLucZK test]# chown root:tgroup tproject	#改变tproject目录的所有者和所属组
    [root@CncLucZK test]# ll -d tproject
    drwxr-xr-x 2 root tgroup 4096 Oct 16 11:27 tproject
    [root@CncLucZK test]# chmod 770 tproject	#指定tproject目录的权限
    [root@CncLucZK test]# ll -d tproject
    drwxrwx--- 2 root tgroup 4096 Oct 16 11:27 tproject
    #这时ou1用户来使用该目录了,分配权限
    [root@CncLucZK test]# setfacl -m u:ou1:rx tproject
    [root@CncLucZK test]# ll -d tproject
    drwxrwx---+ 2 root tgroup 4096 Oct 16 11:27 tproject
    #如果查询时会发现,在权限位后面多了一个"+",表示此目录拥有ACL权限
    [root@CncLucZK test]# getfacl tproject
    # file: tproject
    # owner: root
    # group: tgroup
    user::rwx		#用户名栏是空的,说明是所有者的权限
    user:ou1:r-x	#用户ou1的权限
    group::rwx		#组名栏是空的,说明是所属组的权限
    mask::rwx		#mask权限
    other::---		#其他人的权限
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    可以看到,通过设定 ACL 权限,我们可以单独给ou1用户分配 r-x 权限,而无需给 st 用户设定任何身份。

    • 同样也可以给用户组设定 ACL 权限,例如:
    #添加新群组
    [root@CncLucZK test]# groupadd tgroup2
    #为组tgroup2纷配ACL权限
    [root@CncLucZK test]# setfacl -m g:tgroup2:rwx tproject
    #属组并没有更改
    [root@CncLucZK test]# ll -d tproject
    drwxrwx---+ 2 root tgroup 4096 Oct 16 11:27 tproject
    [root@CncLucZK test]# getfacl tproject
    # file: tproject
    # owner: root
    # group: tgroup
    user::rwx
    user:ou1:r-x
    group::rwx
    group:tgroup2:rwx		#用户组tgroup2拥有了rwx权限
    mask::rwx
    other::---
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • setfacl -d:设定默认 ACL 权限:已经对 project 目录设定了 ACL 权限,那么,如果在这个目录中新建一些子文件和子目录,这些文件是否会继承父目录的 ACL 权限呢?执行以下命令进行验证:
    [root@CncLucZK test]# cd tproject
    #在/project目录中新建了file文件和dict目录
    [root@CncLucZK tproject]# touch file
    [root@CncLucZK tproject]# mkdir dict
    [root@CncLucZK tproject]# ll 
    total 4
    drwxr-xr-x 2 root root 4096 Oct 16 11:47 dict
    -rw-r--r-- 1 root root    0 Oct 16 11:47 file
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 可以看到,这两个新建立的文件权限位后面并没有 “+”,表示它们没有继承 ACL 权限。这说明,后建立的子文件或子目录,并不会继承父目录的 ACL 权限。当然,我们可以手工给这两个文件分配 ACL 权限,但是如果在目录中再新建文件,都要手工指定,则显得过于麻烦。这时就需要用到默认 ACL 权限。

    • 默认 ACL 权限的作用是,如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限。需要注意的是,默认 ACL 权限只对目录生效。

    • 给 tproject 文件设定 ou1 用户访问 rx 的默认 ACL 权限,可执行如下指令:

    [root@CncLucZK tproject]# cd ..
    [root@CncLucZK test]# setfacl -m d:u:ou1:rx tproject
    [root@CncLucZK test]# getfacl tproject
    # file: tproject
    # owner: root
    # group: tgroup
    user::rwx
    user:ou1:r-x
    group::rwx
    group:tgroup2:rwx
    mask::rwx
    other::---
    default:user::rwx	#多出了default字段
    default:user:ou1:r-x
    default:group::rwx
    default:mask::rwx
    default:other::---
    #新建子文件和子目录
    [root@CncLucZK test]# cd tproject
    [root@CncLucZK tproject]# touch file1
    [root@CncLucZK tproject]# mkdir dict1
    [root@CncLucZK tproject]# ll
    total 8
    drwxr-xr-x  2 root root 4096 Oct 16 11:47 dict
    drwxrwx---+ 2 root root 4096 Oct 16 11:54 dict1
    -rw-r--r--  1 root root    0 Oct 16 11:47 file
    -rw-rw----+ 1 root root    0 Oct 16 11:54 file1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 新建的dict1和file1已经继承了父目录的ACL权限,而原来的 dict和file还是没有继承了父目录的ACL权限

    • 对目录设定的默认 ACL 权限,可直接使用 setfacl -k 命令删除。例如:

    [root@CncLucZK /]# setfacl -k tproject
    
    • 1
    • 通过此命令,即可删除 project 目录的默认 ACL 权限,然后通过 getfacl 命令查看。

    • setfacl -R:设定递归 ACL 权限:递归 ACL 权限指的是父目录在设定 ACL 权限时,所有的子文件和子目录也会拥有相同的 ACL 权限。如:给 tproject 目录设定 ou1用户访问权限为 rx 的递归 ACL 权限,执行命令如下:

    [root@CncLucZK tproject]# cd ..
    [root@CncLucZK test]# setfacl -m u:ou1:rwx -R tproject
    [root@CncLucZK test]# ll tproject
    total 8
    drwxrwxr-x+ 2 root root 4096 Oct 16 11:47 dict
    drwxrwx---+ 2 root root 4096 Oct 16 11:54 dict1
    -rw-rwxr--+ 1 root root    0 Oct 16 11:47 file
    -rw-rwx---+ 1 root root    0 Oct 16 11:54 file1
    #dice和file也拥有了ACL权限
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    默认 ACL 权限指的是针对父目录中后续建立的文件和目录会继承父目录的 ACL 权限;递归 ACL 权限指的是针对父目录中已经存在的所有子文件和子目录会继承父目录的 ACL 权限。

    • setfacl -x:删除指定的 ACL 权限:使用 setfacl -x 命令,可以删除指定的 ACL 权限,例如,删除前面建立的 st 用户对 tproject 目录的 ACL 权限,执行命令如下:
    [root@CncLucZK test]# setfacl -x u:ou1 tproject
    [root@CncLucZK test]# getfacl tproject
    # file: tproject
    # owner: root
    # group: tgroup
    user::rwx
    group::rwx
    group:tgroup2:rwx
    mask::rwx
    other::---
    default:user::rwx
    default:user:ou1:r-x
    default:group::rwx
    default:mask::rwx
    default:other::---
    #ou1用户的权限已被删除
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • setfacl -b:删除指定文件的所有 ACL 权限:此命令可删除所有与指定文件或目录相关的 ACL 权限。例如,现在我们删除一切与 tproject 目录相关的 ACL 权限,执行命令如下:
    [root@CncLucZK test]# setfacl -b tproject
    [root@CncLucZK test]# getfacl tproject
    # file: tproject
    # owner: root
    # group: tgroup
    user::rwx
    group::rwx
    other::---
    #默认权限和tgroup2组的权限都删除了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    9.9 mask有效权限
    • 前面在使用 setfacl 和 getfacl 为用户或群组添加针对某目录或文件的 ACL 权限时,对比添加 ACL 权限前后 getfacl 命令的输出信息,后者多了 2 行信息,一行是我们对 st 用户设定的 r-x 权限,另一行就是 mask 权限。
    [root@CncLucZK test]# setfacl -m u:ou1:rx tproject
    [root@CncLucZK test]# ll -d tproject
    drwxrwx---+ 2 root tgroup 4096 Oct 16 11:27 tproject
    #如果查询时会发现,在权限位后面多了一个"+",表示此目录拥有ACL权限
    [root@CncLucZK test]# getfacl tproject
    # file: tproject
    # owner: root
    # group: tgroup
    user::rwx		#用户名栏是空的,说明是所有者的权限
    user:ou1:r-x	#用户ou1的权限
    group::rwx		#组名栏是空的,说明是所属组的权限
    mask::rwx		#mask权限
    other::---		#其他人的权限
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • mask 权限,指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理。

    • 如给ou1用户赋予访问 tproject 目录的 r-x 权限,此时并不能说明 ou1用户就拥有了对该目录的读和访问权限,还需要和 mask 权限对比,r-x 确实是在 rwx 范围内,这时才能说ou1用户拥有 r-x 权限。

    需要注意的是,这里将权限进行对比的过程,实则是将两权限做“按位相与”运算,最终得出的值,即为 st 用户有效的 ACL 权限。这里以读(r)权限为例,做相与操作的结果如下表 所示:

    ABand
    rrr
    r--
    -r-
    ---
    • 如果把 mask 权限改为 r–,再和 st 用户的权限 r-x 比对(r-- 和 r-w 做与运算),由于 r-w 超出 r-- 的权限范围,因此 st 用户最终只有 r 权限,手动赋予的 w 权限无效。这就是在设定 ACL 权限时 mask 权限的作用。

    • mask 权限可以使用 setfacl 命令手动更改,比如,更改 project 目录 mask 权限值为 r-x,可执行如下命令:

    [root@CncLucZK test]# setfacl -m m:rx tproject
    [root@CncLucZK test]# getfacl tproject
    # file: tproject
    # owner: root
    # group: tgroup
    user::rwx
    group::rwx			#effective:r-x
    mask::r-x			#mask权限变为r-x
    other::---
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    不过,我们一般不更改 mask 权限,只要赋予 mask 最大权限(也就是 rwx),则给用户或群组设定的 ACL 权限本身就是有效的。

    参考文献:
    ACL权限是什么,Linux ACL访问控制权限(包含开启方式)

    下一篇:Linux学习-33-SetUID、SetGID和SBIT文件特殊权限用法
  • 相关阅读:
    《QT实用小工具·十三》FlatUI辅助类之各种炫酷的控件集合
    Dummy estimators判别分析大比拼:性能、应用场景和可视化对比总结
    集群容器部署和管理(Docker&K8S)
    C编译器04-生成汇编代码
    Uber:Java中的不稳定单元测试处理
    6.SNMP报错-Error opening specified endpoint “udp6:[::1]:161“处理
    JVM(二十一)—— 垃圾回收器(一)
    gulp自动化构建
    深入探索时间复杂度:解锁算法性能的关键
    单片机硬件内部结构
  • 原文地址:https://blog.csdn.net/weixin_42045639/article/details/127786369