提示:ACL 访问控制权限详解,setfacl,getfacl,setfacl -m,setfacl -d,setfacl -k,setfacl -x,mask等实操详解


ACL (访问控制权限)

ACL 用途

1. 普通权限(回顾)
传统权限控制方式,是用 3 种身份(文件所有者,所属群组,其他用户),搭配 3 种权限(读 r,写 w,执行x)。
[root@zaishu~]# ls -l
total 36
drwxr-xr-x. 2 root root 4096 Apr 15 16:33 Desktop
drwxr-xr-x. 2 root root 4096 Apr 15 16:33 Documents

-rwxr-xr-x. 2 root root 4096 Apr 15 16:33 post-install

rwxr-xr-x 指明不同用户访问文件权限,即文件所有者拥有对文件的读、写、访问权限(rwx),文件所属群组拥有对文件的读、访问权限(r-x),其他用户拥有对文件的读、访问权限(r-x)。

2. 权限扩展的意义

但实际以上 3 种身份可能不够用,如下。
21.ACL 访问控制权限详解,setfacl,getfacl,setfacl -m,setfacl -d,setfacl -k,setfacl -x,mask等实操详解_用户名

/project是班级项目目录。班级中学生可以访问和修改这个目录,老师有对该目录的最高权限,其他班级学生不允许访问这个目录。

则对应老师为这个目录的属主,权限为 rwx;班级学生为 class组,/project 目录属组为class,权限是 rwx;其他人没有权限。

来了试听的学员 shuge,它可以访问 /project 目录;需要授予r和x权限,shuge是属于其他人员,如果更改目录权限为r-x,则其它所有人都可以访问,不符合要求。

3. ACL概念

针对上面情况,普通权限的三种身份不够用,无法实现对某个单独的用户设定访问权限。 这个时候需要使用 ACL (访问控制权限)

ACL,是 Access Control List(访问控制列表)的缩写,ACL 可实现对单一用户设定访问文件的权限。直接对 shuge 用户设定访问文件的 r-x 权限。

4. 支持acl功能
CentOS 6/7 系统中,ACL 权限默认处于开启状态,无需手工开启。
Linux 系统如果没有默认挂载,可以执行如下命令实现手动挂载:
[root@zaishu ~]# mount -o remount,acl / //mount 命令重新挂载,并加入 ACL 权限。永久生效,需要修改 /etc/fstab 文件:
[root@zaishu ~]#vi /etc/fstab
UUID=5b69ece8-4e15-b8fe-68093d5462f2 /ext4 defaults,acl 1 1
#加入ACL权限
[root@zaishu ~]# mount -o remount /

ACL权限设置(setfacl getfacl)

常用命令有2 个分别是 setfacl 和 getfacl 命令,前者用于给指定文件或目录设定 ACL 权限,后者用于查看。

语法选项

getfacl 用于查看文件或目录当前ACL 权限信息::

[root@zaishu ~]# getfacl 文件名
getfacl 命令的使用非常简单,且常和 setfacl 命令一起搭配使用。

setfacl 对用户或群组指定文件的访问权限。

[root@zaishu ~]# setfacl 选项 文件名
选项 功能
-m 设定 ACL 权限。
设置用户 ACL 权限,参数使用 “u:用户名:权限” ,例如 setfacl -m u:shuge:rx /project 表示设定 shuge 用户对 project 目录具有 rx 权限;
设置组 ACL 权限,参数使用 “g:组名:权限” ,例如 setfacl -m g:class:rx /project 表示对组 class 对 project 目录具有 rx 权限。
-x 删除指定用户或组的 ACL 权限,例如 setfacl -x u:shuge /project 表示删除 shuge用户对 project 目录的 ACL 权限。
-b 删除所有的 ACL 权限,例如 setfacl -b /project 表示删除有关 project 目录上所有 ACL 权限。
-d 设定默认 ACL 权限,命令为 “setfacl -m d:u:用户名:权限 文件名”(如果是群组,则使用 d:g:群组名:权限),只对目录生效,指目录中新建立的文件拥有此默认权限,例如 setfacl -m d:u:shuge:rx /project 表示 shuge 用户对 project 目录中新建立的文件拥有 rx 权限。
-R 递归设定 ACL 权限,指设定的 ACL 权限会对目录下的所有子文件生效,命令格式为 “setfacl -m u:用户名:权限 -R 文件名”(群组使用 g:群组名:权限),例如 setfacl -m u:shuge:rx -R /project 表示 shuge用户对已存在于 project 目录中的子文件和子目录拥有 rx 权限。
-k 删除默认 ACL 权限。

setfacl -m

用途: 用户或群组添加 ACL 权限

例如上图的需求,老师并作为 /project 的所有者,对 project 目录拥有 rwx 权限;
新建 class 群组,并作为 project 目录的所属组,本组成员拥有对 project 的 rwx 权限;
将其他用户访问 project 目录的权限设定为 0。
对于shuge来说,需要设定 ACL 权限,令该用户对 project 拥有 rx 权限。

具体的设置命令如下:

[root@zaishu ~]# useradd zhangsan
[root@zaishu ~]# useradd lisi
[root@zaishu ~]# useradd shuge
[root@zaishu ~]# groupadd class <-- 添加需要试验的用户和用户组,省略设定密码的过程
[root@zaishu ~]# mkdir /project <-- 建立需要分配权限的目录
[root@zaishu ~]# chown root:class /project <-- 改变/project目录的所有者和所属组
[root@zaishu ~]# chmod 770 /project  <-- 指定/project目录的权限
[root@zaishu ~]# ll -d /project
drwxrwx---. 2 root class 4096 Apr 16 12:55 /project

这时shuge学员来试听了,如何给她分配权限

[root@zaishu ~]# setfacl -m u:shuge:rx /project
#给用户st赋予r-x权限,使用"u:用户名:权限" 格式
[root@zaishu /]# cd /
[root@zaishu /]# ll -d /project
drwxrwx---+ 2 root class 4096 Apr 16 12:55 /project
#如果查询时会发现,在权限位后面多了一个"+",表示此目录拥有ACL权限
[root@zaishu /]# getfacl project
#查看/prpject目录的ACL权限
#file:project <--文件名
#owner:root <--文件的所有者
#group:class <--文件的所属组
user::rwx <--用户名栏是空的,说明是所有者的权限
user:class:r-x <--用户st的权限
group::rwx <--组名栏是空的,说明是所属组的权限
mask::rwx <--mask权限
other::--- <--其他人的权限

通过设定 ACL 权限,单独给 shuge 用户分配 r-x 权限,而无需给它设定任何身份。

设置组的acl权限

可以给用户组设定 ACL 权限:

[root@zaishu /]# groupadd class2
#添加新群组
[root@zaishu /]# setfacl -m g:class2:rwx project
#为组class2纷配ACL权限
[root@zaishu /]# ll -d project
drwxrwx---+ 2 root class 4096 1月19 04:21 project
#属组并没有更改
[root@zaishu /]# getfacl project
#file: project
#owner: root
#group: tgroup
user::rwx
user:shuge:r-x
group::rwx
group:clas2:rwx <-用户组class2拥有了rwx权限
mask::rwx
other::---

setfacl -d

设定默认 ACL 权限
1. 不设定默认值
当对project 目录设定了 ACL 权限,则如果在这个目录中的文件和子目录,这些文件是否会继承父目录的 ACL 权限呢?执行以下命令进行验证:

[root@zaishu /]# cd project
l[root@zaishu project]# touch abc
[root@zaishu project]# mkdir d1
#在/project目录中新建了abc文件和d1目录
[root@zaishu project]#ll
总用量4
这两个新建立的文件权限位后面并没有 "+",表示它们没有继承 ACL 权限。
[root@zaishu project]# ll
total 0
-rw-r--r-- 1 root root 0 Nov 29 09:44 abc
drwxr-xr-x 2 root root 6 Nov 29 09:44 d1

[root@zaishu project]# getfacl abc 
# file: abc
# owner: root
# group: root
user::rw-
group::r--
other::r-

新建的子文件或子目录,并不会继承父目录的 ACL 权限。

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

[root@zaishu project]# setfacl -m d:u:shuge:rx /project/
[root@zaishu project]# getfacl /project/
getfacl: Removing leading '/' from absolute path names
# file: project/
# owner: root
# group: class
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:shuge:r-x
default:group::r-x
default:mask::r-x
default:other::r-x

3. 验证新建文件
新建的abc2和d2已经继承了父目录的ACL权限

[root@zaishu project]# touch abc2
[root@zaishu project]# mkdir d2
[root@zaishu project]# ll 
total 0
-rw-r--r--  1 root root 0 Nov 29 09:44 abc
-rw-r--r--+ 1 root root 0 Nov 29 09:56 abc2
drwxr-xr-x  2 root root 6 Nov 29 09:44 d1
drwxr-xr-x+ 2 root root 6 Nov 29 09:56 d2

setfacl -k

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

[root@zaishu project]# setfacl -k /project/
[root@zaishu project]# touch abc3
[root@zaishu project]# mkdir d3
新建的abc3和d3没有继承了父目录的ACL权限
[root@zaishu project]# ll
total 0
-rw-r--r--  1 root root 0 Nov 29 09:44 abc
-rw-r--r--+ 1 root root 0 Nov 29 09:56 abc2
-rw-r--r--  1 root root 0 Nov 29 09:58 abc3
drwxr-xr-x  2 root root 6 Nov 29 09:44 d1
drwxr-xr-x+ 2 root root 6 Nov 29 09:56 d2
drwxr-xr-x  2 root root 6 Nov 29 09:58 d3

setfacl -x

使用 setfacl -x 命令,删除指定的 ACL 权限

[root@zaishu project]# setfacl -x u:shuge /project
[root@zaishu project]# getfacl /project/
getfacl: Removing leading '/' from absolute path names
# file: project/
# owner: root
# group: class
user::rwx
group::r-x
other::r-x

[root@zaishu project]# ll -d /project
drwxr-xr-x 5 root class 71 Nov 29 09:58 /project
acl权限已被删除

setfacl -R

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

[root@zaishu project]# setfacl -m u:shuge:rx -R /project
[root@zaishu project]# ll -d /project/
drwxr-xr-x+ 5 root class 71 Nov 29 09:58 /project/
[root@zaishu project]# ll
total 0
-rw-r-xr--+ 1 root root 0 Nov 29 09:44 abc
-rw-r-xr--+ 1 root root 0 Nov 29 09:56 abc2
-rw-r-xr--+ 1 root root 0 Nov 29 09:58 abc3
drwxr-xr-x+ 2 root root 6 Nov 29 09:44 d1
drwxr-xr-x+ 2 root root 6 Nov 29 09:56 d2
drwxr-xr-x+ 2 root root 6 Nov 29 09:58 d3

子目录也拥有了ACL权限

setfacl -b

删除指定文件的所有 ACL 权限

[root@zaishu project]# setfacl -b /project/
[root@zaishu project]# getfacl /project/
getfacl: Removing leading '/' from absolute path names
# file: project/
# owner: root
# group: class
user::rwx
group::r-x
other::r-x

所有ACL权限已被删除

Linux mask

mask 权限,指的是用户或群组拥有的最大 ACL 权限,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理。

[root@zaishu project]# setfacl -m u:shuge:rx -R /project
[root@zaishu project]# getfacl /project/
getfacl: Removing leading '/' from absolute path names
# file: project/
# owner: root
# group: class
user::rwx
user:shuge:r-x
group::r-x
mask::r-x  //设置ACL后,这儿会多一栏mask
other::r-x

mask 权限计算

mask 权限是用户或群组能拥有的最大 ACL 权限,
举个例子,如果像上面命令,给 shuge用户赋予访问 project 目录的 r-x 权限,还需要和 mask 权限对比计算得到最终的权限。将两权限做“按位相与”运算,最终得出的值。
以读(r)权限为例,做相与操作的结果:

A B and
r r r
r - -
- r -
- - -

把 mask 权限改为 r–,再用户的权限 r-x 比对,按位相与运算用户最终只有 r 权限。

mask设置

使用 setfacl 命令,执行如下命令:

[root@zaishu project]# setfacl -m m:r /project/
[root@zaishu project]# getfacl /project/
getfacl: Removing leading '/' from absolute path names
# file: project/
# owner: root
# group: class
user::rwx
user:shuge:r-x			#effective:r--  //有效的acl权限为r--
group::r-x			#effective:r--
mask::r--
other::r-x

总结

ACL 访问控制权限详解,setfacl,getfacl,setfacl -m,setfacl -d,setfacl -k,setfacl -x,mask等实操讲解