ACL 权限

文章目录

一、简介与开启

1.1简介

在之前的一篇文章 Linux 权限管理命令 中我讲过,不同的用户对于一个文件会有三种身份:所有者、所属组成员、其他人。每种身份对应着不同的读、写、执行权限,比如 770,即所有者拥有读、写、执行权限,所属组的成员也拥有读、写、执行权限,其他人没有任何权限。那么如果这时又来了一个用户,我只想让他对某一个文件拥有读的权限,应该怎么办呢?把他加入所属组显然是不行的,因为所属组成员拥有读、写、执行的权限,同理,把他变成文件的所有者也不行,其他人更不行,因为其他人什么权限都没有,而我们希望的是这个新来的用户拥有读权限。

这时就出现了身份不足的问题。为了解决这个问题,Linux 中引入了 ACL 权限的概念。ACL 的全称是 Access Control List,即访问控制列表。通过 ACL,我们可以规定用户对于文件的权限,而这个用户不必属于那三种身份中的任何一种。这样的话,即使某个文件的权限是 770,我们也可以让 A 用户的对于该文件的权限是 5,B 用户对于该文件的权限是 4,C 用户的权限是 6 等等。

对于某个文件,要想使用 ACL,该文件所在的分区必须支持 ACL 才行,通过下面这条命令我们可以查看某个分区是否支持 ACL:

dumpe2fs -h /dev/sda5

ACL 权限
在 Default mount options 这一行中,如果有 acl,则说明该分区支持 ACL。其中 /dev/sda5 表示根分区,使用 df -h 命令可以查看系统中的所有分区:
ACL 权限

1.2 开启 ACL 权限

现在的 Linux 系统,磁盘分区默认都是开启 ACL 权限的,万一遇到文件所在的分区没有开启 ACL 权限,我们就需要手动开启 ACL 权限。

1.2.1 临时开启

顾名思义,临时开启 ACL 权限只是临时生效,一旦重启系统,ACL 权限就没有了。临时开启 ACL 权限需要执行下面这个命令:

mount -o remount,acl / #重新挂载根分区,并挂载加入ACL权限

其中最后面那个「/」是根分区的名字,如果你想开启其他分区的 ACL 权限,把「/」替换成相应的分区的名字就可以。

1.2.2 永久开启

永久开启 ACL 权限需要两步。

**第一步:**修改系统的配置文件。该文件的路径是:/etc/fstab

打开该文件,找到要开启 ACL 权限的那个分区所在的行,在 defaults 后面加上「,acl」即可,如下图所示:
ACL 权限
**第二步:**重新挂载文件系统或重新启动系统。

重新挂载系统:

mount -o remount /

重新启动系统:

Linux 关机重启命令

二、查看与设定

2.1 设定 ACL 权限

设定 ACL 权限的命令是:setfacl,语法是:setfacl 选项 文件名

setfacl 命令的选项有:

选项 作用
-m 设定 ACL 权限
-x 删除指定的 ACL 权限
-b 删除所有的 ACL 权限
-d 设定默认 ACL 权限
-k 删除默认 ACL 权限
-R 递归设定 ACL 权限

为了演示,我们模拟一个教学场景:老师是 root 用户,他为班上的每个学生都创建了一个用户,把这些学生的用户都加到 tgroup 组里。他在服务器上创建了一个 project 目录,把 project 目录的所有者设成 root,所属组设成 tgroup,老师通过这个目录留作业,学生们把做好的作业上传到这个目录里,因此,老师和学生对 project 目录都需要有读、写、执行的权限,而其他人对于 project 目录没有任何权限,所以 project 目录的权限应该是 770。这时来了一个试听的学生,他对于 project 目录应该有读和执行的权限,不能有写权限,所以应该为他设定 ACL 权限。

#添加几个学生用户
useradd andy
useradd jack
useradd jay
#添加一个组
groupadd tgroup
#把学生用户添加到tgroup组里
gpasswd -a andy tgroup
gpasswd -a jack tgroup
gpasswd -a jay tgroup
#添加一个试听学生的用户
useradd st
#在根目录下创建一个project目录并修改其所属组及权限
mkdir /project
chown root:tgroup /project/
chmod 770

好了,至此我们已经创建好了一个实验环境,接下来开始正式的学习如何设定 ACL 权限。

为 st 用户添加读和执行 project 目录的权限:

setfacl -m u:st:rx /project/

此外,我们还可以为一个组设定 ACL 权限,假设有一个试听组 stgroup,我们为这个试听组添加读和执行 project 目录的权限:

setfacl -m g:stgroup:rx /project/

设定完 ACL 权限之后,查看一下 project 目录的属性:
ACL 权限
在表示权限的那一列里,最后面有一个加号,说明该目录除了普通权限,还有 ACL 权限,下面我们学习如何查看 ACL 权限。

2.2 查看文件的 ACL 权限

查看文件的 ACL 权限用 getfacl 命令,后面跟文件名或目录名就可以了,比如:

getfacl /project #查看 /project/ 的ACL权限

ACL 权限
第 1 行是报错信息,大概意思是这个命令不支持绝对路径,让你把目录前面的「/」去掉,这个报错信息其实忽略就好。

三、最大有效权限

mask 是用来指定最大有效权限的。如果我给用户赋予了 ACL 权限,是需要和 mask 的权限「相与」才能得到用户的真
正权限。
ACL 权限
设定有效最大权限的命令:

setfacl -m m:rx /project/ #把目录/project/的最大有效权限设为r-x

设定完最大有效权限之后,查看一下该目录的 ACL 权限:
ACL 权限

四、删除 ACL 权限

删除 ACL 权限用 setfacl 命令的 -x 选项或 -b 选项。

如果只想删除一条 ACL 权限,就用 -x 选项,如:

setfacl -x u:用户名 文件名 #删除指定用户的ACL权限
setfacl -x g:组名 文件名 #删除指定用户组的ACL权限

如果想一次性删除所有 ACL 权限,就用 -b 选项。

setfacl -b 文件名  #删除文件的所有ACL权限

五、递归 ACL 权限

递归是父目录在设定 ACL 权限时,所有的子目录和子目录下的文件也会拥有相同的 ACL 权限。设定递归 ACL 权限的方式:

setfacl -m u:用户名:权限 -R 目录名

六、默认 ACL 权限

默认 ACL 权限的作用是,如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限。

setfacl -m d:u:用户名:权限 文件名
上一篇:ACL


下一篇:ACL的概念