Linux的ACL权限

什么是 ACL 权限?

在普通权限中,用户对文件只有三种身份,就是属主、属组和其他人;每种用户身份拥有读(read)、写(write)和执行(execute)三种权限。但是在实际工作中,这三种身份实在是不够用,我们举个例子来看看。

 

图 1 的根目录中有一个 /project 目录,这是班级的项目目录。班级中的每个学员都可以访问和修改这个目录,老师也需要对这个目录拥有访问和修改权限,其他班级的学员当然不能访问这个目录。需要怎么规划这个目录的权限呢?应该这样:老师使用 root 用户,作为这个目录的属主,权限为 rwx;班级所有的学员都加入 tgroup 组,使 tgroup 组作为 /project 目录的属组,权限是 rwx;其他人的权限设定为 0。这样这个目录的权限就可以符合我们的项目开发要求了。

有一天,班里来了一位试听的学员 st,她必须能够访问 /project 目录,所以必须对这个目录拥有 r 和 x 权限;但是她又没有学习过以前的课程,所以不能赋予她 w 权限,怕她改错了目录中的内容,所以学员 st 的权限就是 r-x。可是如何分配她的身份呢?变为属主?当然不行,要不 root 该放哪里?加入 tgroup 组?也不行,因为 tgroup 组的权限是 rwx,而我们要求学员 st 的权限是 r-x。如果把其他人的权限改为 r-x 呢?这样一来,其他班级的所有学员都可以访问 /project 目录了。

当出现这种情况时,普通权限中的三种身份就不够用了。ACL 权限就是为了解决这个问题的。在使用 ACL 权限给用户 st 陚予权限时,st 既不是 /project 目录的属主,也不是属组,仅仅赋予用户 st 针对此目录的 r-x 权限。这有些类似于 Windows 系统中分配权限的方式,单独指定用户并单独分配权限,这样就解决了用户身份不足的问题。

ACL是Access Control List(访问控制列表)的缩写,不过在Linux系统中,ACL用于设定用户针对文件的权限,而不是在交换路由器中用来控制数据访问的功能(类似于防火墙)

开启 ACL

dumpe2fs 命令是查询指定分区详细文件系统信息的命令

[root@iZbp143t3oxhfc3ar7jey0Z ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        1.9G     0  1.9G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G  580K  1.9G   1% /run
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/vda1        40G  6.6G   31G  18% /
tmpfs           379M     0  379M   0% /run/user/0
[root@iZbp143t3oxhfc3ar7jey0Z ~]# dumpe2fs -h /dev/vda1
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
Last mounted on:          /
Filesystem UUID:          1114fe9e-2309-4580-b183-d778e6d97397
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype n                                                                                        eeds_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nli                                                                                        nk extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              2621440
Block count:              10484164

如上所示,已经开启了ACL权限,假如没有开启的话,可以如下所示

[root@localhost ~]# mount -o remount,acl /
#重新挂载根分区,并挂载加入 acl 权限

如果想永久开启的话,可以通过修改/etc/fstab 文件,永久开启 ACL 权限:

[root@localhost ~]# vi /etc/fstab
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 / ext4 defaults ,acl 1 1
#加入 acl
[root@localhost ~]# mount -o remount /
#重新挂载文件系统或重启动系统,使修改生效

ACL演示

 常用的命令如下:

setfacl -m u:用户名:权限 文件名
setfacl -m g:组名:权限 文件名
setfacl -m u:aa:rwx /test 给 test 目录赋予 aa 是读写执行的 ACL 权限
setfacl -m u:cc:rx -R soft/ 赋予递归 ACL 权限,只能赋予目录 -R 递归
setfacl -m d:u:aa:rwx -R /test ACL 默认权限。 注意:默认权限只能赋予目录
注意:如果给目录赋予 acl 权限,两条命令都要输入
递归与默认的区别:
setfacl -m u:cc:rx -R soft/ 只对已经存在的文件生效
setfacl -m d:u:aa:rwx -R /test 只对以后新建的文件生效

演示如下:

[root@iZbp143t3oxhfc3ar7jey0Z /]# chmod 750 /www
[root@iZbp143t3oxhfc3ar7jey0Z /]# useradd st
[root@iZbp143t3oxhfc3ar7jey0Z /]# passwd st
Changing password for user st.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@iZbp143t3oxhfc3ar7jey0Z /]# setf
setfacl   setfiles  setfont
[root@iZbp143t3oxhfc3ar7jey0Z /]# setfacl -m u:st:5 /www/
[root@iZbp143t3oxhfc3ar7jey0Z /]# ll -d /www/
drwxr-x---+ 2 root root 4096 Mar 25 20:14 /www/
[root@iZbp143t3oxhfc3ar7jey0Z /]# getfacl /www/
getfacl: Removing leading '/' from absolute path names
# file: www/
# owner: root
# group: root
user::rwx
user:st:r-x
group::r-x
mask::r-x
other::---
[root@iZbp143t3oxhfc3ar7jey0Z /]# setfacl -m u:st:5 -R /www/
[root@iZbp143t3oxhfc3ar7jey0Z www]# ll
total 0
-rw-r-xr--+ 1 root root 0 Mar 25 20:41 abc
-rw-r-xr--+ 1 root root 0 Mar 25 20:41 bcd
[root@iZbp143t3oxhfc3ar7jey0Z www]# getfacl abc
# file: abc
# owner: root
# group: root
user::rw-
user:st:r-x
group::r--
mask::r-x
other::r--

[root@iZbp143t3oxhfc3ar7jey0Z www]# setfacl -m d:u:st:5 -R /www/
[root@iZbp143t3oxhfc3ar7jey0Z www]# getfacl /www/
getfacl: Removing leading '/' from absolute path names
# file: www/
# owner: root
# group: root
user::rwx
user:st:r-x
group::r-x
mask::r-x
other::---
default:user::rwx
default:user:st:r-x
default:group::r-x
default:mask::r-x
default:other::---

[root@iZbp143t3oxhfc3ar7jey0Z www]# touch qaz
[root@iZbp143t3oxhfc3ar7jey0Z www]# ll
total 0
-rw-r-xr--+ 1 root root 0 Mar 25 20:41 abc
-rw-r-xr--+ 1 root root 0 Mar 25 20:41 bcd
-rw-r-----+ 1 root root 0 Mar 25 20:46 qaz
[root@iZbp143t3oxhfc3ar7jey0Z www]# su - st
[st@iZbp143t3oxhfc3ar7jey0Z ~]$ cd /www/
[st@iZbp143t3oxhfc3ar7jey0Z www]$ ll
total 0
-rw-r-xr--+ 1 root root 0 Mar 25 20:41 abc
-rw-r-xr--+ 1 root root 0 Mar 25 20:41 bcd
-rw-r-----+ 1 root root 0 Mar 25 20:46 qaz
[st@iZbp143t3oxhfc3ar7jey0Z www]$ touch wer
touch: cannot touch ‘wer’: Permission denied
[st@iZbp143t3oxhfc3ar7jey0Z www]$ exit
logout
[root@iZbp143t3oxhfc3ar7jey0Z www]#

最大有效权限 mask

 它的权限是和user:st:r-x进行与操作,只有共同有的,才会有权限,一般默认mask权限都是rwx,与我们所设定的权限相与就是我们设定的权限。

删除 ACL 权限

[root@iZbp143t3oxhfc3ar7jey0Z www]# setfacl -x u:st /www/  #删除指定用户和用户组的 ACL 权限
[root@iZbp143t3oxhfc3ar7jey0Z www]# getfacl /www/
getfacl: Removing leading '/' from absolute path names
# file: www/
# owner: root
# group: root
user::rwx
group::r-x
mask::r-x
other::---
default:user::rwx
default:user:st:r-x
default:group::r-x
default:mask::r-x
default:other::---
 
[root@iZbp143t3oxhfc3ar7jey0Z www]# setfacl -b /www/  #会删除文件的所有的 ACL 权限
[root@iZbp143t3oxhfc3ar7jey0Z www]#

注:其实ACL当递归赋予权限的时候,就会有权限溢出的问题,因为目录要x权限,才能cd,这样里面的文件就有x权限,但是就有了可执行的权限了。

原文地址:https://www.cnblogs.com/dalianpai/p/12570717.html