Linux ACL访问控制
在Linux一般权限管理中,对文件的访问可以通过控制该文件的(目录)属主、属组和其他人三个用户角色进行;每种用户身份拥有读(read)、写(write)和执行(execute)三种权限。但是在实际工作中,这三种身份实在是无法满足精细的权限控制要求。请看下面的例子。
drwxrwx--- 45 user1 group1 12288 Feb 25 16:48 /project/
以上根目录下有一个 /project/ 目录,user1用户和在group1组中的用户都有访问和修改权限,但如果有另外一个用户user2需要有访问权限(rx)且不能有修改权限如该何操作呢?给other用户rx权限和将user2加入到group1组都不是好的选择。能不能单独给user2授权/project/目录的访问权限呢?是可以的,这时就要用到ACL权限了。
ACL是Access Control List(访问控制列表)的缩写,在Linux系统中,ACL用于设定用户针对文件的权限。路由器中也有ACL的概念,但和我们这里讲的ACL并不相同。
开启ACL权限#
ACL需要文件系统支撑,ACL的开启由挂载参数决定的。在 CentOS 6.x 系统中 ACL 权限默认是开启的,不需要手工开启。那该如何查看 ACL 权限是否开启了呢?可以这样查看:
1 [root@CentOS release 6.5 ~]# dumpe2fs -h /dev/mapper/vg_root-lv_root
2 dumpe2fs 1.41.12 (17-May-2010)
3 Filesystem volume name: <none>
4 Last mounted on: /
5 Filesystem UUID: 391a5a62-13d3-4f4f-a312-d46490508500
6 Filesystem magic number: 0xEF53
7 Filesystem revision #: 1 (dynamic)
8 Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
9 Filesystem flags: signed_directory_hash
10 Default mount options: user_xattr acl
11 Filesystem state: clean
12 Errors behavior: Continue
13 Filesystem OS type: Linux略……
#dumpe2fs是查询指定分区文件系统详细信息的命令,只支撑ext*类的文件系统。
其中,dumpe2fs 命令可选的选项及其含义如下:
- -h:仅显示超级块中的信息,而不显示磁盘块组的详细信息;
使用 dumpe2fs 命令可以査看到这个分区文件系统的详细信息。dmpe2fs命令输出结果中 Default mount options: user_xattr acl 显示分区/dev/mapper/vg_root-lv_root的默认挂载选项包括acl,所以不需要额外操作。
如果我们的Linux文件系统不支持ACL权限可以加用如下命令添加:
[root@localhost ~]# mount -o remount,acl /
#重新挂载对应分区,并加入ACL权限参数
使用 mount 命令重新挂载加入 的ACL 权限,临时有效,系统重启后挂载参数还是原来的。要想永久生效,需要修改 /etc/fstab 文件,命令如下:
[root@localhost ~]#vi /etc/fstab
UUID=56e5d02a-2fa6-40a8-b4ac-374407905c59 /ext4 defaults,acl 1 1
#defaults后加入ACL权限,用逗号分隔
[root@localhost ~]# mount -o remount /
#重新挂载文件系统或重启系统,使修改生效
建议采用修改/etc/fstab再remount的方式,可以验证fstab配置对不对,有问题可及时修改,避免fstab配置有错误导致重启无法开机或分区无法挂载等意外情况。
ACL权限设置#
1、ACL权限管理命令#
现在分区已经支持ACL了,管理ACL权限主要涉及两个命令查看ACL(getfacl)和设置ACL(setfacl),下面我们先了解下这两个命令的语法:
[root@localhost ~]# getfacl 文件名 #查看ACL权限
[root@localhost ~]# setfacl 选项 文件名 #设定ACL权限
setfacl 选项:
- -m:设定 ACL 权限。如果是给予用户 ACL 权限,则使用"u:用户名:权限"格式赋予;如果是给予组 ACL 权限,则使用"g:组名:权限" 格式赋予;
- -x:删除指定的 ACL 权限;
- -b:删除所有的 ACL 权限;
- -d:设定默认 ACL 权限。只对目录生效,指目录中新建立的文件拥有此默认权限;
- -k:删除默认 ACL 权限;
- -R:递归设定 ACL 权限。指设定的 ACL 权限会对目录下的所有子文件生效;
# setfacl -h
setfacl 2.2.51 -- set file access control lists
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
-m, --modify=acl modify the current ACL(s) of file(s)
-M, --modify-file=file read ACL entries to modify from file
-x, --remove=acl remove entries from the ACL(s) of file(s)
-X, --remove-file=file read ACL entries to remove from file
-b, --remove-all remove all extended ACL entries
-k, --remove-default remove the default ACL
--set=acl set the ACL of file(s), replacing the current ACL
--set-file=file read ACL entries to set from file
--mask do recalculate the effective rights mask
-n, --no-mask don't recalculate the effective rights mask
-d, --default operations apply to the default ACL
-R, --recursive recurse into subdirectories
-L, --logical logical walk, follow symbolic links
-P, --physical physical walk, do not follow symbolic links
--restore=file restore ACLs (inverse of `getfacl -R')
--test test mode (ACLs are not modified)
-v, --version print version and exit
-h, --help this help text
2、给用户添加ACL权限#
针对某个文件或目录设置特定用户对其的特定访问权限。
[root@localhost ~]# ll -d /project/ #查看 /project/ 当前的权限状态
drwxrwx--- 2 root sys 4096 1月19 05:21 /project/
#给user2分配rx权限
[root@localhost ~]# setfacl -m u:user2:rx /project/ #给用户user2赋予r-x权限,使用"u:用户名:权限" 格式
[root@localhost ~]# ll -d /project/
drwxrwx---+ 3 root sys 4096 1月19 05:22 project/ #使用ls-l査询时会发现,在权限位后面多了一个"+",表示此目录拥有ACL权限
[root@localhost ~]# getfacl /project #查看/prpject目录的ACL权限
#file: /project <-文件名
#owner: root <-文件的属主
#group: sys <-文件的属组
user::rwx <-用户名栏是空的,说明是属主的权限
user:user2:r-x <-用户user2的权限
group::rwx <-组名栏是空的,说明是属组的权限
mask::rwx <-mask权限
other::--- <-其他人的权限
可以看到虽然user2不是/project目录的属主、属组和other用户,作为一个特殊的用户对该目录拥有了访问权限。
3、给用户组添加ACL权限#
除了可以给用户添加ACL权限,也可以给用户组添加ACL权限,用于控制这个组中的用户对某个文件或目录的权限。
[root@localhost /]# setfacl -m g:group2:rwx project/ #为组group2纷配ACL权限,使用"g:组名:权限"格式
[root@localhost /]# ll -d project/
drwxrwx---+ 2 root sys 4096 1月19 06:21 project/
#属组并没有更改
[root@localhost /]# getfacl project/
#file: project/
#owner: root
#group: sys
user::rwx
user:user2:r-x
group::rwx
group:group2:rwx <-用户组group2拥有了rwx权限
mask::rwx
other::--
4、最大有效权限mask#
mask 是用来指定最大有效权限的。mask 的默认权限是 rwx。其他用户或组的有效权限都是和mask权限相与得到的。如果mask权限是r--,则不管user2的权限是多少那么他的最大权限也不会超过r--。例:user2的权限是r-x,其有效权限是r-- 与 r-x结果是r--,这个比较容易理解。
修改mask权限的命令:
[root@localhost /]# setfacl -m m:rx /project #设定mask权限为r-x,使用"m:权限"格式
[root@localhost /]# getfacl /project
#file:project/
#owner:root
#group:sys
user::rwx
group::rwx #effective:r-x
mask::r-x #mask权限变为r-x
other::--
5、默认ACL权限#
给 /project 目录设定了 ACL 权限,在这个目录中新建一些子文件和子目录,是不会继承父目录的 ACL 权限的。如果我们希望在这个目录下新创建文件也有对应的ACL权限,除了手动授权以外,还有更好的方法。
默认 ACL 权限的作用是:如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限。默认 ACL 权限只对目录生效。命令如下:
[root@localhost /]# setfacl -m d:u:user2:rx /project/ #使用"d:u:用户名:权限"格式设定默认ACL权限
[root@localhost project]# getfacl project/
# file: project/
# owner: root
# group: sys
user:: rwx
user:user2:r-x
group::rwx
group:group2:rwx
mask::rwx
other::--
default:user::rwx <-多出了default字段
default:user:st:r-x
default:group::rwx
default:mask::rwx
default:other::--
[root@localhost /]# cd project/
[root@localhost project]# touch testfile
[root@localhost project]# mkdir testdir
[root@localhost project]# ll 总用量8-rw-rw----+ 1 root root 02月19 06:33 testfile
drwxrwx---+ 2 root root 4096 1月19 06:34 testdir
可以看到在/project/下新创建的文件和目录testfile、testdir 继承了父目录用户user2的ACL权限。
6、递归ACL权限#
递归是指父目录在设定 ACL 权限时,所有的子文件和子目录也会拥有相同的 ACL 权限。
[root@localhost project]# setfacl -m u:user2:rx -R /project/ #-R递归
7、删除ACL权限#
删除指定的ACL权限:
[root@localhost /]# setfacl -x u:user2 /project/ #删除指定用户和用户组的ACL权限
[root@localhost /]# getfacl project/
# file:project/
# owner: root
# group: sys
user::rwx
group::rwx
group:group2:rwx
mask::rwx
other::--
user2用户的权限已被删除
删除所有ACL权限:
[root@localhost /]# setfacl -b /project #删除文件的所有ACL权限
[root@localhost /]# getfacl /project
#file: project/
#owner: root
# group: sys
user::rwx
group::rwx
other::--
可以看到所有ACL权限已被删除
总结:1、当要给某个用户或用户组分配特殊权限时可用ACL
2、ACL权限需要分区支持
3、除了给用户和组设置ACL权限外还可以设置默认ACL权限和mask权限