Linux-文件ACL访问控制列表的使用

ACL访问控制列表

1、开启acl功能(可能某些情况下需要自己手动开启acl)

  • 在 CentOS 6.x 系统中 ACL 权限默认是开启的,不需要手工开启。不过,如果你的操作系统不是 CentOS 6.x,那该如何查看 ACL 权限是否开启了呢?可以这样查看:
    [root@localhost ~]# mount
    /dev/sda1 on /boot type ext4 (rw)
    /dev/sda3 on I type ext4 (rw)
    …省略部分输出…
    // 使用mount命令可以看到系统中已经挂载的分区,但是并没有看到ACL权限的设置

  • [root@localhost ~]# dumpe2fs -h /dev/sda3
    // dumpe2fs是查询指定分区文件系统详细信息的命令
    …省略部分输出…
    Default mount options: user_xattr acl
    …省略部分输出…
    // 其中,dumpe2fs 命令可选的选项及其含义如下:
    -h:仅显示超级块中的信息,而不显示磁盘块组的详细信息;
    // 使用 mount 命令可以査看到系统中已经挂载的分区,而使用 dumpe2fs 命令可以査看到这个分区文件系统的详细信息。大家可以看到,我们的 ACL 权限是 /dev/sda3 分区的默认挂载选项,所以不需要手工挂载。

  • 不过当 Linux 系统没有默认挂载时怎么办呢,可以手工挂载吗?当然可以,执行如下命令:
    [root@localhost ~]# mount -o remount, acl /
    // 重新挂载根分区,并加入ACL权限
    // 使用 mount 命令重新挂载,并加入 ACL 权限。不过使用此命令是临时生效的。要想永久生效,需要修改 /etc/fstab 文件,命令如下:
    [root@localhost ~]#vi /etc/fstab
    UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 /ext4 defaults, acl 1 1
    // 加入ACL权限
    [root@localhost ~]# mount -o remount /
    // 重新挂载文件系统或重启系统,使修改生效
    // 在你需要开启 ACL 权限的分区行上(也就是说 ACL 权限针对的是分区),手工在 defaults 后面加入",acl"即可永久在此分区中开启 ACL 权限。

2、acl功能使用

(1)、ACL权限管理命令
  • 我们知道了 ACL 权限的作用,也知道了如何开启 ACL 权限,接下来学习如何査看和设定 ACL 权限。命令如下:
    [root@localhost ~]# getfacle 文件名
    // 查看ACL权限
    [root@localhost ~]# setfacl 选项 文件名
    // 设定ACL权限
    选项:
    (1) -m:设定 ACL 权限。如果是给予用户 ACL 权限,则使用"u:用户名:权限"格式赋予;如果是给予组 ACL 权限,则使用"g:组名:权限" 格式赋予;
    (2) -x:删除指定的 ACL 权限;
    (3) -b:删除所有的 ACL 权限;
    (4) -d:设定默认 ACL 权限。只对目录生效,指目录中新建立的文件拥有此默认权限;
    (5) -k:删除默认 ACL 权限;
    (6) -R:递归设定 ACL 权限。指设定的 ACL 权限会对目录下的所有子文件生效;
(2)给用户和用户组添加ACL权限
  • 看下面例子,就来看看图 1 中的权限怎么分配。我们要求 root 是 /project 目录的属主,权限是 rwx;tgroup 是此目录的属组,tgroup 组中拥有班级学员 zhangsan 和 lisi,权限是 rwx;其他人的权限是 0。这时,试听学员 st 来了,她的权限是 r-x。我们来看具体的分配命令。
    [root@localhost ~]# useradd zhangsan
    [root@localhost ~]# useradd lisi
    [root@localhost ~]# useradd st
    [root@localhost ~]# groupadd tgroup
    // 添加需要试验的用户和用户组,省略设定密码的过程
    [root@localhost ~]# mkdir /project #建立需要分配权限的目录
    [root@localhost ~]# chown root:tgroup /project/
    // 改变/project目录的属主和属组
    [root@localhost ~]# chmod 770 /project/
    // 指定/project目录的权限
    [root@localhost ~]# ll -d /project/
    drwxrwx— 2 root tgroup 4096 1月19 04:21 /project/
    // 查看一下权限,已经符合要求了
    // 这时st学员来试听了,如何给她分配权限
    [root@localhost ~]# setfacl -m u:st:rx /project/
    // 给用户st赋予r-x权限,使用"u:用户名:权限" 格式
    [root@localhost /]# cd /
    [root@localhost /]# ll -d project/
    drwxrwx—+ 3 root tgroup 4096 1月19 05:20 project/
    // 使用ls-l査询时会发现,在权限位后面多了一个"+",表示此目录拥有ACL权限
    [root@localhost /]# getfacl project
    // 查看/prpject目录的ACL权限
    // file: project <-文件名
    // owner: root <-文件的属主
    // group: tgroup <-文件的属组
    user::rwx <-用户名栏是空的,说明是属主的权限
    user:st:r-x <-用户st的权限
    group::rwx <-组名栏是空的,说明是属组的权限
    mask::rwx <-mask权限
    other::— <-其他人的权限
    大家可以看到,st 用户既不是 /prpject 目录的属主、属组,也不是其他人,我们单独给 st 用户分配了 r-x 权限。这样分配权限太方便了,完全不用先辛苦地规划用户身份了。
  • 我想给用户组赋予 ACL 权限可以吗?当然可以,命令如下:
    [root@localhost /]# groupadd tgroup2
    // 添加测试组
    [root@localhost /]# setfacl -m g:tgroup2:rwx project/
    // 为组tgroup2纷配ACL权限,使用"g:组名:权限"格式
    [root@localhost /]# ll -d project/
    drwxrwx—+ 2 root tgroup 4096 1月19 04:21 project/
    // 属组并没有更改
    [root@localhost /]# getfacl project/
    // file: project/
    // owner: root
    // group: tgroup
    user::rwx
    user:st:r-x
    group::rwx
    group:tgroup2:rwx 【用户组tgroup2拥有了rwx权限】
    mask::rwx
    other::–
(3)最大有效权限mask
  • mask 是用来指定最大有效权限的。mask 的默认权限是 rwx,如果我给 st 用户赋予了 r-x 的 ACL 权限,mj 需要和 mask 的 rwx 权限"相与"才能得到 st 的真正权限,也就是 r-x "相与"rwxtj 出的值是 r-x,所以 st 用户拥有 r-x 权限。
  • 如果把 mask 的权限改为 r–,和 st 用户的权限相与,也就是 r–"相与"r-x 得出的值是 r–,st 用户的权限就会变为只读。大家可以这么理解:用户和用户组所设定的权限必须在 mask 权限设定的范围之内才能生效,mask权限就是最大有效权限。
  • 不过我们一般不更改 mask 权限,只要给予 mask 最大权限 rwx,那么任何权限和 mask 权限相与,得出的值都是权限本身。也就是说,我们通过给用户和用户组直接赋予权限,就可以生效,这样做更直观。
    补充:逻辑与运算的运算符是"and"。可以理解为生活中所说的"并且"。也就是相与的两个值都为真,结果才为真;有一个值为假,与的结果就为假。比如 A 相与 B,结果入表 2 所示。
    在这里插入图片描述
    ** 那么两个权限相与和上面的结果类似,我们以读(r)权限为例,结果如表 3 所示。**
    在这里插入图片描述
    所以,“rwx"相与"r-x”,结果是"r-x";“r–“相与"r-x”,结果是"r–”。
  • 修改最大有效权限的命令如下:
    [root@localhost /]# setfacl -m m:rx project/
    // 设定mask权限为r-x,使用"m:权限"格式
    [root@localhost /]# getfacl project/
    // file:project/
    // owner:root
    // group:tgroup
    user::rwx
    group::rwx #effective:r-x
    mask::r-x
    // mask权限变为r-x
    other::–
(4)默认ACL权限和递归ACL权限
  • 我们已经给 /project 目录设定了 ACL 权限,那么,在这个目录中新建一些子文件和子目录,这些文件是否会继承父目录的 ACL 权限呢?下面来看。
    [root@localhost /]# cd /project/
    [root@localhost prq’ect]# touch abc
    [root@localhost prq’ect]# mkdir d1
    // 在/project目录中新建了abc文件和d1目录
    [root@localhost project]#ll
    总用量4
    -rw-r–r-- 1 root root 01月19 05:20 abc
    drwxr-xr-x 2 root root 4096 1月19 05:20 d1
    // 这两个新建立的文件权限位后面并没有"+",表示它们没有继承ACL权限
    // 子文件 abc 和子目录 d1 因为是后建立的,所以并没有继承父目录的 ACL 权限。当然,我们可以手工给这两个文件分配 ACL 权限,但是如果在目录中再新建文件,都要手工指定,则显得过于麻烦。这时就需要用到默认 ACL 权限。

  • 默认 ACL 权限的作用是:如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限。默认 ACL 权限只对目录生效。命令如下:
    [root@localhost /]# setfacl -m d:u:st:rx /project/
    #使用"d:u:用户名:权限"格式设定默认ACL权限
    [root@localhost project]# getfacl project/
    // file: project/
    // owner: root
    // group: tgroup
    user:: rwx
    user:st:r-x
    group::rwx
    group:tgroup2:rwx
    mask::rwx
    other::–
    default:user::rwx <-多出了default字段
    default:user:st:r-x
    default:group::rwx
    default: mask::rwx
    default:other::–
    [root@localhost /]# cd project/
    [root@localhost project]# touch bcd
    [root@localhost project]# mkdir d2
    // 新建子文件和子目录
    [root@localhost project]# ll 总用量8
    -rw-r–r-- 1 root root 01月19 05:20 abc
    -rw-rw----+ 1 root root 01月19 05:33 bcd
    drwxr-xr-x 2 root root 4096 1月19 05:20 d1
    drwxrwx—+ 2 root root 4096 1月19 05:33 d2
    // 新建的bcd和d2已经继承了父目录的ACL权限
    // 那么这里可以看出,原先的 abc 和 d1 还是没有 ACL 权限,因为默认 ACL 权限是针对新建立的文件生效的。

  • 再看看递归 ACL 权限。递归是指父目录在设定 ACL 权限时,所有的子文件和子目录也会拥有相同的 ACL 权限。
    [root@localhost project]# setfacl -m u:st:rx -R/project/
    #-R递归
    [root@localhost project]# ll
    总用量8
    -rw-r-xr–+ 1 root root 01月19 05:20 abc
    -rw-rwx–+ 1 root root 01月19 05:33 bcd
    drwxr-xr-x+ 2 root root 4096 1月19 05:20 d1
    drwxrwx–+ 2 root root 4096 1月19 05:33 d2
    // abc和d1也拥有了ACL权限
    // 总结下来:默认 ACL 权限指的是针对父目录中新建立的文件和目录会继承父目录的 ACL 权限,格式是"setfacl -m d:u:用户名:权限 文件名";递归 ACL 权限指的是针对父目录中已经存在的所有子文件和子目录继承父目录的 ACL 权限,格式是"setfacl -m u:用户名: 权限 -R 文件名"。

(5)删除ACL权限

删除ACL权限分为两种情况,一为删除指定ACL权限,二为删除所有ACL权限。

  • 删除指定的ACL权限
    [root@localhost /]# setfacl -x u:st /project/
    // #删除指定用户和用户组的ACL权限
    [root@localhost /]# getfacl project/
    // file:project/
    // owner: root
    // group: tgroup
    user::rwx
    group::rwx
    group:tgroup2:rwx
    mask::rwx
    other::–
    // st用户的权限已被删除
    删除所有ACL权限:
    [root@localhost /]# setfacl -b project/
    #会删除文件的所有ACL权限
    [root@localhost /]# getfacl project/
    #file: project/
    #owner: root
    // group: tgroup
    user::rwx
    group::rwx
    other::–
    // 所有ACL权限已被删除
    ----------------------------------------武汉艾迪时代IT教育----------------------------------------------------
    在这里插入图片描述
发布了24 篇原创文章 · 获赞 20 · 访问量 3770

猜你喜欢

转载自blog.csdn.net/Dreamsi_zhang/article/details/104628110