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
在 Default mount options 这一行中,如果有 acl,则说明该分区支持 ACL。其中 /dev/sda5
表示根分区,使用 df -h
命令可以查看系统中的所有分区:
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
」即可,如下图所示:
**第二步:**重新挂载文件系统或重新启动系统。
重新挂载系统:
mount -o remount /
重新启动系统:
二、查看与设定
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 权限。
2.2 查看文件的 ACL 权限
查看文件的 ACL 权限用 getfacl
命令,后面跟文件名或目录名就可以了,比如:
getfacl /project #查看 /project/ 的ACL权限
第 1 行是报错信息,大概意思是这个命令不支持绝对路径,让你把目录前面的「/
」去掉,这个报错信息其实忽略就好。
三、最大有效权限
mask 是用来指定最大有效权限的。如果我给用户赋予了 ACL 权限,是需要和 mask 的权限「相与」才能得到用户的真
正权限。
设定有效最大权限的命令:
setfacl -m m:rx /project/ #把目录/project/的最大有效权限设为r-x
设定完最大有效权限之后,查看一下该目录的 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:用户名:权限 文件名
标签:设定,setfacl,ACL,project,权限,目录 来源: https://blog.csdn.net/young2415/article/details/92390912