首页 > 代码库 > Linux系统中文件的ACL权限

Linux系统中文件的ACL权限

管理员的工作中,相当重要的一环就是“管理账号”。因为整个系统都是你在管理,并且所有一般用户的账号申请必须要经过你的协助。在前两篇博客中,我们分别介绍文件的基础权限和特殊权限,也一直在强调权限的重用性,但是传统的权限仅有三种身份(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 命令:

[root@centos7 /]# 
[root@centos7 /]# mount /dev/sdb3 /mnt  # 查看时,必须将分区挂载起来
[root@centos7 /]# 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
[root@centos7 /]#

使用tune2fs命令可以查看文件是否具有acl属性,但对于自身默认没有附加acl的分区,我们如何添加权限并查看呢?tune2fs其实查看的是分区超级块的信息。

#.*.---------mount命令查看挂载属性-----------.*.#

[root@centos7 /]# mount
...省略...
/dev/sdc1 on /app type xfs (rw) # 没有acl权限,即默认挂载时不携带acl权限
...省略...

#.*.---------mount临时添加acl权限-----------.*.#

[root@centos7 /]# mount -o remount,acl /dev/sda3     # 给/dev/sdc3这个新分区添加acl权限
[root@centos7 /]# mount 
...省略...
/dev/sdc1 on /app type xfs (rw,acl) # 添加acl权限成功,这里只是临时生效,
...省略...
[root@centos7 /]#

#.*.---------acl属性永久有效-----------.*.#

[root@centos7 /]# vim /etc/fstab
在文件最后追加以下条目并保存退出:
UUID=939ea6b9-9aa5-421c-908f-73691670ab75 /mnt/sdc1  ext4  defaults 0 0 
[root@centos7 /]# mount -a  # 重新加载/etc/fstab文件中的挂载信息,这样下次启动就生效了
[root@centos7 /]#

说明:

  • 用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 的用法

[root@centos7 /]# 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-----------.*.#

[root@centos7 ~]# cd /app
[root@centos7 app]# touch 1.txt   # 创建一个文件1.txt
[root@centos7 app]# ll 1.txt 
-rw-r--r--. 1 root root 0 Aug 10 14:41 1.txt  # 查看文件属性为基本属性
[root@centos7 app]# setfacl -m u:harry:rx 1.txt  # 设置harry用户在该文件上的权限为rx 
[root@centos7 app]# ll 1.txt 
-rw-r-xr--+ 1 root root 0 Aug 10 14:41 1.txt # 再次查看文件,权限部分多了个 + ,而且组权限发生了改变

#.*.---------所有用户设置ACL-----------.*.#

[root@centos7 app]# setfacl -m u::rwx 1.txt 
[root@centos7 app]# ll 1.txt 
-rwxr-xr--+ 1 root root 0 Aug 10 14:41 1.txt
[root@centos7 app]# 

#.*.------------组设置ACL-----------.*.#

[root@centos7 app]# set -m g:t1:rx 1 # 设置 t1 组在该文件上的ACl权限为ro(只读)
[root@centos7 app]# ll 1.txt 
-rw-r-xr--+ 1 root root 0 Aug 10 14:41 1.txt # 发现看不出什么变化
[root@centos7 app]#

说明:上述设置文件的ACL属性,我们只能宏观的看到,组权限发生了改变,并且在权限位后面多了一个 + ,但我们确不能详细的看到具体的 ACL 权限。

2、读取acl

读取一个文件的 ACL 权限,我们使用命令 getfacl ,该命令能详细的查看文件的 ACL 信息。getfacl 的用法几乎和setfacl相同,我们以实例来理解:

[root@centos7 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--        # 其他人拥有的权限

[root@centos7 app]#

说明:通过getfacl命令查阅到的文件的 ACL 属性 ,更加详细。数据前面带 # 的,表示该文件的默认属性,包括文件名、文件属主、文件属组。而未加 # 的行则代表不同用户、用户组的有效权限。

3、mask值含义及作用

ACL属性中的mask值定义了自定义用户、自定义组,拥有组能够使用的最大属性,相当于一个限高线,该mask值与文件属组的权限是由关系的,当你改变mask值时,文件的属组权限也会做相应的改变。

[root@centos7 app]# setfacl -m mask:r 1.txt   # 设置mask值为r
[root@centos7 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--

[root@centos7 app]# setfacl -m mask:- 1.txt  # 设置mask值为空
[root@centos7 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--

[root@centos7 app]# ll 1.txt 
-rwx---r--+ 1 root root 0 Aug 10 14:41 1.txt  # 查看文件的属性,发现属组的权限也发生了相应改变
[root@centos7 app]#

说明

  • harry用户的权限和mask的值的交集为 r ,因此 harry 用户只有 r (读)权限  

  • mask值规定可最大有有效权限,这样可以避免不小心开放某些权限个其他用户或用户组

  • 个人建议可以给mask的只为rwx ,这样只用对用户或用户组单独设置ACL属性即可

4、acl的备份和恢复

acl权限的备份和恢复主要是通过复制,移动、重定向来实现的。但需要注意的是:主要的文件操作命令cp和mv都支持ACL,但是使用cp命令时需要加上-p参数。像tar等常见的备份工具是不会保留目录和文件的acl信息的。

#.*.------------备份ACL-----------.*.#

[root@centos7 app]# getfacl -R 1.txt >acl.bak # 获得1.txt文件的ACL信息重定向到acl.bak文件中
[root@centos7 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-----------.*.#

[root@centos7 app]# setfacl -R -b 1.txt  # 备份前先清空文件的ACL信息
[root@centos7 app]# getfacl 1.txt  # 再次查看,发现ACL权限回到了原始状态
# file: 1.txt
# owner: root
# group: root
user::rwx
group::---
other::r--

[root@centos7 app]# setfacl -R --set-file=acl.bak 1.txt  # 用acl.bak文件恢复1.txt的ACL信息
[root@centos7 app]# getfacl 1.txt  # 再次查看,权限又重新回归
# file: 1.txt
# owner: root
# group: root
user::rwx
user:harry:r-x            #effective:---
group::r--            #effective:---
mask::---
other::r--

[root@centos7 app]#

说明:恢复文件ACL属性的方法不仅局限于上述实例中的方法,还可以使用:

setfacl --restore acl.txt

谢谢阅读


本文出自 “vinsent” 博客,请务必保留此出处http://vinsent.blog.51cto.com/13116656/1955166

Linux系统中文件的ACL权限