管理员的工作中,相当重要的一环就是“管理账号”。因为整个系统都是你在管理,并且所有一般用户的账号申请必须要经过你的协助。在前两篇博客中,我们分别介绍文件的基础权限和特殊权限,也一直在强调权限的重用性,但是传统的权限仅有三种身份(ower、group、others)搭配读、写、执行(r、w、x)三种权限,并不能单纯针对某一个用户或某一个组来设置特定的权限需求,这时我没就不得不使用ACL(访问控制列表)了。
一、什么是 ACL
ACL是 Access Control List 的缩写,主要是目的是提供除属主、属组、其他人基本权限之外的具体权限设置。ACL 可以针对单一用户、单一文件或目录来进行r、w、x权限的设置,对于需要特殊权限的使用情况非常有用。ACL 主要针对以下几个情况:
- 用户(user):可针对用户来设置权限;
- 用户组(group):可针对用户组来设置权限;
- 默认属性(mask):可设置该目录下新建新文件、目录时设置新数据的默认权限;
二、启动 ACL
上面介绍了ACL权限的设置对象及设置场景,那么如何让你的文件支持ACL呢,接下来带大家看看。
由于 ACL 是传统的UNIX-like(类UNIX)操作系统权限的额外支持项目,因此要使用 ACL 必须要有文件系统的支持才行。目前绝大部分的文件系统都有支持 ACL 权限的功能,最新的CentOS 7 操作系统默认创建分区并写入文件系统时会附加 ACL 属性,CentOS 6 中新建的分区并写入文件系统默认不会添加acl属性。
- 查看 ACl 属性
查看分区是否就有 acl 权限我们可以使用 tune2fs 命令:
[[email protected] /]# [[email protected] /]# mount /dev/sdb3 /mnt # 查看时,必须将分区挂载起来 [[email protected] /]# tune2fs -l /dev/sdb3 tune2fs 1.42.9 (28-Dec-2013) Filesystem volume name: <none> Last mounted on: <not available> Filesystem UUID: 9a9bac28-da60-4351-a21f-c6529385e944 # 分区UUID号码,唯一表示符 Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal ext_attr resize_inode ...后面省略 # 文件系统特性 Filesystem flags: signed_directory_hash Default mount options: user_xattr acl # 具有acl权限 ...中间省略... Journal backup: inode blocks [[email protected] /]#
使用tune2fs命令可以查看文件是否具有acl属性,但对于自身默认没有附加acl的分区,我们如何添加权限并查看呢?tune2fs其实查看的是分区超级块的信息。
#.*.---------mount命令查看挂载属性-----------.*.# [[email protected] /]# mount ...省略... /dev/sdc1 on /app type xfs (rw) # 没有acl权限,即默认挂载时不携带acl权限 ...省略... #.*.---------mount临时添加acl权限-----------.*.# [[email protected] /]# mount -o remount,acl /dev/sda3 # 给/dev/sdc3这个新分区添加acl权限 [[email protected] /]# mount ...省略... /dev/sdc1 on /app type xfs (rw,acl) # 添加acl权限成功,这里只是临时生效, ...省略... [[email protected] /]# #.*.---------acl属性永久有效-----------.*.# [[email protected] /]# vim /etc/fstab 在文件最后追加以下条目并保存退出: UUID=939ea6b9-9aa5-421c-908f-73691670ab75 /mnt/sdc1 ext4 defaults 0 0 [[email protected] /]# mount -a # 重新加载/etc/fstab文件中的挂载信息,这样下次启动就生效了 [[email protected] /]#
说明:
- 用mount单纯的取查阅不见得能看到实际的选项,由于目前新的distributions经常会加入某些默认的功能
- mount -o remount(acl,rw,ro,nodev...) :表示重新挂载并添加属性,具体会在后续的磁盘管理中说明
- /etc/fstab 是挂载条目的配置文件:从左到右的每段含义分别是:
设备名(UUID、/dev/sd*、卷标名) 挂载目录 文件系统类型 权限 备份频率 是否开机检查
- 分区格式化后就会给分配一个UUID,他能唯一标识该分区;可使用命令blkid查看
三、ACL的设置
保证了文件系统启用了ACL支持之后,接下来便是如何设置ACL属性了,ACL属性的设置主要包括添加ACL属性和读取ACL权限,以及ACL的备份与恢复。
1、设置acl
设置ACL即添加ACL权限,使用 setfacl 命令来实现,下面看看 setfacl 的用法
[[email protected] /]# setfacl -[mbkdR... ][-m|-x acl参数 ] file(目标文件)
选项:
- -m : 设置后续的 acl 参数给文件使用,不可与 -x 一起使用
- -b : 删除说有 acl 设置参数
- -x : 删除后续的 acl 参数,不可与 -m 合并
- -k : 删除默认的 acl 参数
- -d : 设置默认的 acl 参数,只对目录有效,在该目录新建的数据会引用此默认选项
- -R : 递归设置 acl,子目录都会继承该属性
我们知道ACL的设置有很多种,包括单一用户ACL设置、组ACL设置、以及目录ACL设置;其具体用法如下:
#.*.---------单一用户设置ACL-----------.*.# [[email protected] ~]# cd /app [[email protected] app]# touch 1.txt # 创建一个文件1.txt [[email protected] app]# ll 1.txt -rw-r--r--. 1 root root 0 Aug 10 14:41 1.txt # 查看文件属性为基本属性 [[email protected] app]# setfacl -m u:harry:rx 1.txt # 设置harry用户在该文件上的权限为rx [[email protected] app]# ll 1.txt -rw-r-xr--+ 1 root root 0 Aug 10 14:41 1.txt # 再次查看文件,权限部分多了个 + ,而且组权限发生了改变 #.*.---------所有用户设置ACL-----------.*.# [[email protected] app]# setfacl -m u::rwx 1.txt [[email protected] app]# ll 1.txt -rwxr-xr--+ 1 root root 0 Aug 10 14:41 1.txt [[email protected] app]# #.*.------------组设置ACL-----------.*.# [[email protected] app]# set -m g:t1:rx 1 # 设置 t1 组在该文件上的ACl权限为ro(只读) [[email protected] app]# ll 1.txt -rw-r-xr--+ 1 root root 0 Aug 10 14:41 1.txt # 发现看不出什么变化 [[email protected] app]#
说明:上述设置文件的ACL属性,我们只能宏观的看到,组权限发生了改变,并且在权限位后面多了一个 + ,但我们确不能详细的看到具体的 ACL 权限。
2、读取acl
读取一个文件的 ACL 权限,我们使用命令 getfacl ,该命令能详细的查看文件的 ACL 信息。getfacl 的用法几乎和setfacl相同,我们以实例来理解:
[[email protected] app]# getfacl 1.txt # 获取1.txt文件的 ACL 信息 # file: 1.txt # 文件名 # owner: root # 文件的属主 # group: root # 文件的属组 user::rwx # 用户列表为空,代表文件属主的权限 user:harry:r-x # 针对用户harry的权限设置为rx group::r-- # 组列表为空,代表文件属组的权限 group:t1:r-- # 上面设置过 t1 组的权限,所以在这里显示出来了 mask::r-x # 此文件默认的有效权限,此选项可控制权限的上限 other::r-- # 其他人拥有的权限 [[email protected] app]#
说明:通过getfacl命令查阅到的文件的 ACL 属性 ,更加详细。数据前面带 # 的,表示该文件的默认属性,包括文件名、文件属主、文件属组。而未加 # 的行则代表不同用户、用户组的有效权限。
3、mask值含义及作用
ACL属性中的mask值定义了自定义用户、自定义组,拥有组能够使用的最大属性,相当于一个限高线,该mask值与文件属组的权限是由关系的,当你改变mask值时,文件的属组权限也会做相应的改变。
[[email protected] app]# setfacl -m mask:r 1.txt # 设置mask值为r [[email protected] app]# getfacl 1.txt # 查看ACL属性 # file: 1.txt # owner: root # group: root user::rwx user:harry:r-x #effective:r-- # harry组最高权限为r group::r-- mask::r-- other::r-- [[email protected] app]# setfacl -m mask:- 1.txt # 设置mask值为空 [[email protected] app]# getfacl 1.txt # file: 1.txt # owner: root # group: root user::rwx user:harry:r-x #effective:--- # 由于mask值为空,所以有效的权限也就为空,即不具有任何权限 group::r-- #effective:--- mask::--- other::r-- [[email protected] app]# ll 1.txt -rwx---r--+ 1 root root 0 Aug 10 14:41 1.txt # 查看文件的属性,发现属组的权限也发生了相应改变 [[email protected] app]#
说明
- harry用户的权限和mask的值的交集为 r ,因此 harry 用户只有 r (读)权限
- mask值规定可最大有有效权限,这样可以避免不小心开放某些权限个其他用户或用户组
- 个人建议可以给mask的只为rwx ,这样只用对用户或用户组单独设置ACL属性即可
4、acl的备份和恢复
acl权限的备份和恢复主要是通过复制,移动、重定向来实现的。但需要注意的是:主要的文件操作命令cp和mv都支持ACL,但是使用cp命令时需要加上-p参数。像tar等常见的备份工具是不会保留目录和文件的acl信息的。
#.*.------------备份ACL-----------.*.# [[email protected] app]# getfacl -R 1.txt >acl.bak # 获得1.txt文件的ACL信息重定向到acl.bak文件中 [[email protected] app]# cat acl.bak # 查看acl.bak内容,其结果和 getfacl 1.txt 结果一致,说明备份成功 # file: 1.txt # owner: root # group: root user::rwx user:harry:r-x #effective:--- group::r-- #effective:--- mask::--- other::r-- #.*.-----------恢复ACL-----------.*.# [[email protected] app]# setfacl -R -b 1.txt # 备份前先清空文件的ACL信息 [[email protected] app]# getfacl 1.txt # 再次查看,发现ACL权限回到了原始状态 # file: 1.txt # owner: root # group: root user::rwx group::--- other::r-- [[email protected] app]# setfacl -R --set-file=acl.bak 1.txt # 用acl.bak文件恢复1.txt的ACL信息 [[email protected] app]# getfacl 1.txt # 再次查看,权限又重新回归 # file: 1.txt # owner: root # group: root user::rwx user:harry:r-x #effective:--- group::r-- #effective:--- mask::--- other::r-- [[email protected] app]#
说明:恢复文件ACL属性的方法不仅局限于上述实例中的方法,还可以使用:
setfacl --restore acl.txt
谢谢阅读!