Linux权限管理 ACL权限

时间:2021-09-24 16:44:51

ACL权限简介

在普通权限中,用户对文件只有三种身份ugo,分别为属主(u)、属组(g)和其他人(o);每种用户身份拥有读(read)、写(write)和执行(execute)三种权限。但是在实际工作中,系统上chmod管理权限,有时不能满足需求,需要给个别用户(非所有者,非所属组)赋予权限,因此使用acl权限。

ACL可以设置特定用户或者用户组对于一个文件/文件夹的操作权限. 需要掌握的命令也只有三个: getfacl, setfacl, chacl。

ACL是Access Control List(访问控制列表)的缩写,不过在Linux系统中,ACL用于设定用户针对文件的权限。

ACL权限开启

谨记在Linux中 ACL权限针对的是分区,所以要给某个文件设置ACL权限时,首先要查看文件所在的分区是否开启了ACL权限。

查看 ACL 权限是否开启

使用mount 和 dumpe2fs 命令就可以查看ACL是否开启 

 1. 使用mount命令找到系统中已经挂载的分区

[root@localhost ~]# mount
 ......省略其他不相关的输出...........
/dev/sda1 on /boot type ext4 (rw,relatime,seclabel,data=ordered)

 2.使用dumpe2fs查询指定分区文件系统详细信息

-h 含义为仅显示超级块中的信息,而不显示磁盘块组的详细信息;

[root@localhost ~]# dumpe2fs -h /dev/sda1
.......省略其他不相关的输出...........
Default mount options:    user_xattr acl

大家可以看到,我们的 ACL 权限是 /dev/sda1 分区的默认挂载选项,所以不需要手工挂载。

手动添加ACL权限

当 Linux 系统没中挂载分区没有开启ACL权限时就可以手动开启ACL权限

1.临时开启分区 ACL 权限

通过命令可以临时开启分区的ACL权限,如果系统重启了,那么分区权限会恢复到初始状态。

[root@localhost ~]# mount -o remount, acl /

重新挂载根分区,并加入ACL权限

2.永久开启分区 ACL 权限

通过 vi打开 /etc/fstab 文件 加入ACL权限

[root@localhost ~]#vi /etc/fstab
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 /ext4 defaults, acl 1 1

重新挂载文件系统或重启系统,使修改生效

[root@localhost ~]# mount -o remount /

ACL权限查看和设置

分别使用 getfacl 和 setfacl命令就可以对文件进行权限的查看和设置

1.查看ACL权限

[root@localhost ~]# getfacle 文件名

2.设置ACL权限

 [root@localhost ~]# setfacl 选项 文件名

 选项:

   选项    选项说明
-m 设定 ACL 权限。

给用户设定 ACL 权限:setfacl -m u:用户名:权限 指定文件名

给用户组设定 ACL 权限:setfacl -m g:组名:权限 指定文件名

-x

删除指定的 ACL 权限
-b 删除所有的 ACL 权限
-d 设定默认 ACL 权限。只对目录生效,指目录中新建立的文件拥有此默认权限
-k 删除默认 ACL 权限
-R 递归设定 ACL 权限。指设定的 ACL 权限会对目录下的所有子文件生效

说明:给用户或用户组设定 ACL 权限其实并不是真正设定的权限,是与 mask 的权限“相与”之后的权限才是用户的真正权限,一般默认mask权限都是rwx,与我们所设定的权限相与就是我们设定的权限。

给用户添加ACL权限

例如:在一个班级有教师(root) 学生(zhangdan,lisi) 试听生(wangwu),project为他们共享的一个文件目录。其中我们要求 root 是 /project 目录的属主,权限是 rwx;tgroup 是此目录的属组,tgroup 组中拥有班级学员 zhangsan 和 lisi,权限是 rwx;其他人的权限是 0。这时,试听学员 wangwu 来了,她的权限是 r-x。我们来看具体的分配命令。

1.添加需要试验的用户和用户组,省略设定密码的过程

[root@localhost ~]# useradd zhangsan
[root@localhost ~]# useradd lisi
[root@localhost ~]# useradd wangwu
[root@localhost ~]# groupadd tgroup

2.建立需要分配权限的目录,改变/project目录的属主和属组,指定/project目录的权限

[root@localhost ~]# mkdir /project  
[root@localhost ~]# chown root:tgroup /project/
[root@localhost ~]# chmod 770 /project/
[root@localhost ~]# ll -d /project/
drwxrwx--- 2 root tgroup 1787 Nov  5 20:20 /project/

查看权限,已经符合要求了

3.给用户st赋予r-x权限,使用"u:用户名:权限" 格式

如果试听生要访问 /project目录,则需要给他设置一个ACL权限

[root@localhost ~]# setfacl -m u:st:rx /project/
[root@localhost /]# cd /
[root@localhost /]# ll -d project/
drwxrwx---+ 3 root tgroup 1787 Nov  5 20:20 project/

使用ls-l査询时会发现,在权限位后面多了一个"+",表示此目录拥有ACL权限
这样试听生也拥有了/project目录的读写权限

给用户组赋予 ACL 权限 

添加测试组

[root@localhost /]# groupadd tgroup2

给组tgroup2纷配ACL权限,使用"g:组名:权限"格式

[root@localhost /]# setfacl -m g:tgroup2:rwx project/
[root@localhost /]# ll -d project/
drwxrwx---+ 2 root tgroup1787 Nov  5 20:20 project/

最大有效权限mask

mask 是用来指定最大有效权限的。mask 的默认权限是 rwx,如给wangwu 用户赋予了 r-x 的 ACL 权限,则需要和 mask 的 rwx 权限"相与"才能得到 wangwu 的真正权限,也就是 r-x "相与"rwx 出的值是 r-x,所以 wangwu 用户拥有 r-x 权限。

如果把 mask 的权限改为 r--,和 wangwu 用户的权限相与,也就是 r--"相与"r-x 得出的值是 r--,wangwu 用户的权限就会变为只读。大家可以这么理解:用户和用户组所设定的权限必须在 mask 权限设定的范围之内才能生效,mask权限就是最大有效权限。

不过我们一般不更改 mask 权限,只要给予 mask 最大权限 rwx,那么任何权限和 mask 权限相与,得出的值都是权限本身。也就是说,我们通过给用户和用户组直接赋予权限,就可以生效,这样做更直观。

修改最大有效权限的命令如下:

[root@localhost /]# setfacl -m m:rx project/

设定mask权限为r-x,使用"m:权限"格式

 默认ACL权限和递归ACL权限

给 /project 目录设定了 ACL 权限后,在这个目录中新建一些子文件和子目录,这些文件并没有继承ACL权限 

默认 ACL 权限指的是针对父目录中新建立的文件和目录会继承父目录的 ACL 权限,格式是"setfacl-m d:u:用户名:权限 文件名";

递归 ACL 权限指的是针对父目录中已经存在的所有子文件和子目录继承父目录的 ACL 权限,格式是"setfacl-m u:用户名: 权限 -R 文件名"。

设置默认ACL权限

使用"d:u:用户名:权限"格式设定默认ACL权限

[root@localhost /]# setfacl -m d:u:st:rx /project/

设置递归ACL权限

-R递归

[root@localhost project]# setfacl -m u:st:rx -R/project/

删除ACL权限

 删除指定的ACL权限:

[root@localhost /]# setfacl -x u:st /project/

删除指定用户和用户组的ACL权限

删除所有ACL权限:

[root@localhost /]# setfacl -b project/

会删除文件的所有ACL权限