参考 ACL: Using Access Control List on Linux
What is ACL
ACL - Access Control List,用于在Linux文件系统传统的权限控制机制之外,提供更加精细化的文件权限控制。
对于一个文件而言,它有三组权限控制位,分别对应该文件的owner
、group
和other
,即可以为这三类用户分别设置它们的read
、write
和exec
权限。但在有些场景下,我们需要更加精细的权限控制,而光靠传统上述的权限机制可能无法实现。此时,我们可以借助ACL来实现。
配置系统
要使用ACL机制,首先要确保
文件系统的ACL选项打开:通过命令
tune2fs -l <文件系统名>
查看[root@ecs3 home]# tune2fs -l /dev/xvda1 | grep mount
Last mounted on: /
Default mount options: user_xattr acl
Last mount time: Fri Dec 26 09:48:08 2014
Maximum mount count: -1安装了ACL工具:如果,命令
getfacl
和setfacl
可以使用,说明ACL工具已经安装好了。
使用ACL
下面使用ACL来分别配置group和user的权限
配置group权限
假设:创建一个名为jack
的用户和一个名为testgroup
的群组,并将jack
加入到testgroup
中。
[root@quickstart tao2]# groupadd testgroup
[root@quickstart tao2]# useradd -d /home/jack -g testgroup jack
然后,我们希望使得testgroup
中的用户对目录/home/cloudera
具有rwx
的权限(该目录本来的权限为wxrwxr-x cloudera cloudera
,我们要针对testgroup
加上写权限)。
[jack@quickstart home]# ll /home
total 36
drwxrwxr-x 29 cloudera cloudera 4096 May 21 01:05 cloudera
drwx------ 4 jack testgroup 4096 May 21 06:18 jack
可见,现在群组testgroup
对目录/home/cloudera
是没有写权限的。
setfacl
现在我们用setfacl
命令来设置群组testgroup
对目录/home/cloudera
的权限,之后用命令getfacl
来查看设置结果:
[root@quickstart home]# setfacl -m g:testgroup:wx /home/cloudera/
[root@quickstart home]# getfacl /home/cloudera/
getfacl: Removing leading '/' from absolute path names
# file: home/cloudera/
# owner: cloudera
# group: cloudera
user::rwx
group::rwx
group:testgroup:-wx
mask::rwx
other::r-x
关于
setfacl
命令的参数:-m
表示 modify,g:testgrouop:w
中的g
表示设置的类别是group,testgroup
是被设置的群组名称,wx
表示设置的目标权限。
现在测试一下jack
能不能在目录/home/cloudera
中创建一个文件:
[root@quickstart home]# su - jack
[jack@quickstart ~]$ touch /home/cloudera/newFile
用户jack
确实可以在/home/cloudera
中创建一个文件。
getfacl
关于getfacl的输出:前几行的意义很明显,讲讲最后三行的意义:
group:testgroup:-wx
表示群组testgroup
对目标文件的权限是wx
mask::rwx
表示对目标文件(或目录)来说,除owner外的用户和群组对其最高权限为rwx
other::r-x
是什么意思?
mask
如果我们将testgroup
的权限设置为wx
,同时将mask
设置为r
,那么testgroup
对目标文件/目录就无法写入,因为mask
限制了除owner外的用户和群组对目标文件/目录的最高权限。
[root@quickstart home]# setfacl -b cloudera/
[root@quickstart home]# setfacl -m g:testgroup:wx,mask:r cloudera/
[root@quickstart home]# su - jack
[jack@quickstart ~]$ cd /home
[jack@quickstart home]$ touch cloudera/x
touch: cannot touch `cloudera/x': Permission denied
[jack@quickstart home]$ getfacl cloudera/
# file: cloudera/
# owner: cloudera
# group: cloudera
user::rwx
group::---
group:testgroup:-wx #effective:---
mask::r--
other::r-x