linux::acl 配置
ACL(access control list)。主要的目的是在提供传统的 owner,group,others 的 read,write,execute 权限之外的细部权限设定。ACL 可以针对单一使用者, 单一档案或目录來进行 r,w,x 的权限规范。
1. 安装ACL
即使系统已经支持了ACL,通常系统是不会自动开启acl选项的,因此需要手动重新加载文件系统,开启acl选项:
[root@~ home]# mount –o remount , acl /home
后面的/ 是硬盘分区,-o后面的两个选项,分别表示重新加载根分区,和开启acl选项。当然,在重新加载文件系统时也可以指定文件系统类型:
[root@~ ]#
mount -t ext3 -o remount,acl /home
若没有提示错误,则表示重新加载成功。如果希望系统启动时自动开启ACL选项,可以在/etc/fstab文件中进行设置,找到希望开启ACL选项的文件系统对应行,在选项栏中加入",acl",保存退出。在下次启动系统时则将自动开启ACL选项。
/dev/hda2
/home
ext3
defaults
,acl 0 0 0
如上行中的红色部分,表明在根文件系统上自动开启ACL选项。
查看系统有哪些分区:
[root@www ~]# df -h
Filesystem
Size
Used
Avail Use%
Mounted on
/dev/sda2
3.8G
2.5G
1.2G
69%
/
/dev/sda3
15G
172M
14G
2%
/home
/dev/sda1
46M
11M
33M
25%
/boot
tmpfs
252M
0
252M
0%
/dev/shm
/dev/hdc
3.7G
3.7G
0
100%
/mnt/cdrom
查看某个分区的ACl权限是否开启:
Filesystem
/dev/sda2
/dev/sda3
/dev/sda1
tmpfs
/dev/hdc
查看某个分区的ACl权限是否开启:
[root@www ~]# dumpe2fs -h /dev/sda1
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name:
/boot
Last mounted on:
Filesystem UUID:
51e86dc7-14a2-4fc4-9a4f-5297c3680b77
Filesystem magic number: 0xEF53
Filesystem revision #:
1 (dynamic)
Filesystem features:
has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super
Default mount options:
user_xattr acl
Filesystem state:
clean
Errors behavior:
Continue
......................
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name:
Last mounted on:
Filesystem UUID:
Filesystem magic number:
Filesystem revision #:
Filesystem features:
Default mount options:
Filesystem state:
Errors behavior:
......................
2. ACL的基本用法。
ACL的主要命令有2个:
getfacl和
setfacl,下面分别对其进行简单介绍。
2.1 getfacl
用于获取文件的acl权限信息,基本用法如下(注意,即使该文件系统上没有开启ACL选项,getfacl命令仍然可用):
[root@~]# getfacl aclTest
# file: aclTest
# owner: edwin
# group: edwin
user::rwx
group::r-x
other::r-x
2.2 setfacl,
用于详细设置文件的访问权限,基本用法如下:
setfacl –[mxdb] file/dir
-m 建立一个ACL规则
-x 删除一个ACL规则
-b 删除全部的ACL规则
下面来看具体例子。
添加/修改ACL规则:-m选项,为用户guest和组guset设置aclTest目录的读写权限,并使用getfacl查看设置结果:
[root@~]# $ setfacl -m u:guest:rw,g:guest:rw aclTest/
[root@~]# $ getfacl aclTest/
# file: aclTest
# owner: zhou
# group: zhou
user::rwx
user:guest:rw-
group::r-x
group:guest:rw-
mask::rwx
other::r-x
可以看到,目录aclTest的ACL中多了3条规则(蓝色部分)。其中,user:guest:rw-和group:guest:rw-为我们设置的访问权限,而mask::rwx为自动添加的内容。
[root@~]#setfacl -m u:test:rwx /test
意为增加test用户 对/test目录拥有完全权限
[root@~]#setfacl -m d:u:tset:rwx /test
意为增加test用户 对/test目录拥有完全权限并且默认继承。 设置d: 参数是为文件夹及其下面所有新创建的子对象设置默认的acl 权限。也就是说 设置了d:参数后, 文件夹内所有新创建的文件都会与 /test拥有相同的ACL权限,这就是权限继承,/test文件夹下设置acl之前原有的对象不继承/test的ACL
当对一个用户设置默认继承权限后,如对文件夹/test ,为用户test设置默认继承权限setfacl -m d:u:test:rw /test 后,同时也为文件夹的owner 和group ,other group设置了默认继承权限。setfacl -x d:u:test /test 命令会删除test用户所有的acl包括继承权限。但不会删除 owner ,group 和other group的默认继承权限,setfacl -k /test 命令会去掉所有的默认继承ACL 。如果我们按照下面的顺序运行,结果会怎样?
[root@~]#setfacl -m d:g:tgroup:rwx /newdir
[root@~]#chmod 700 /newdir
su - test
用户test是tgroup 的成员
[root@~]#cd /newdir
结果就是permission denie, 所以如果chmod 和setfacl有权限冲突的话,需要首先设置chmod再设置setfacl
删除ACL规则:删除用户guest对目录aclTest的访问权限:
[root@~]# setfacl -x u:guest aclTest/
[root@~]# getfacl aclTest/
# file: aclTest
# owner: zhou
# group: zhou
user::rwx
group::r-x
group:guest:rw-
mask::rwx
other::r-x
可以看到,用户guest对于目录aclTest的访问权限已经完全删除了。注意,这里不能指定删除guest对aclTest的某一个权限,如setfacl -x u:guest:w aclTest/ 将提示参数错误。
删除文件的所有ACL规则:-b选项
[root@~]# setfacl -b aclTest/
[root@~]# getfacl aclTest/
# file: aclTest
# owner: zhou
# group: zhou
user::rwx
group::r-x
other::r-x
覆盖文件的原有ACL规则:--set选项。注意,-m选项只是修改已有的配置或是新增加一些,而--set选项和-m不同,它会把原有的ACL项全都删除,并用新的替代,需要注意的是--set选项的参数中一定要包含UGO的设置,不能象-m一样只是添加ACL就可以了。使用方法如下所示:
[root@~]# setfacl --set u::rwx,g::rx,o::rx,u:guest:rwx,g:guest:rwx aclTest/
[root@~]# getfacl aclTest/
# file: aclTest
# owner: zhou
# group: zhou
user::rwx
user:guest:rwx
group::r-x
group:guest:rwx
mask::rwx
other::r-x
如果在后面的参数中没有写明UGO参数,即u::rwx,g::rx,o::rx,系统将提示参数缺失。
另外,如果使用ls -l命令查看设置了ACL的文件,将会发现其访问权限位后面比一般文件多了一个+号:
[root@~]# ls -l
drwxrwx---+ 2 zhou zhou 4096 2009-03-18 19:29 aclTest
mask
如果说ACL的优先级高于UGO,那么mask就是一个名副其实的最后一道防线。它决定了一个用户/组能够得到的最大的权限。这样我们在不改变已有ACL的定义的基础上,可以临时提高或是降低安全级别:
[root@~]# setfacl -m mask::r aclTest/
[root@~]# getfacl aclTest/
# file: aclTest
# owner: zhou
# group: zhou
user::rwx
user:guest:rwx #effective:r--
group::r-x #effective:r--
group:guest:rwx #effective:r--
mask::r--
other::r-x
可以看到,在我们将mask访问权限设置为只读时,mask行以上的ACL权限,除文件所有者外,都变成了只读,即#effective:r--所标识的实际权限。这就为临时改变整体权限和迅速恢复提供了便利。mask只对其他用户和组的权限有影响,对owner和other的权限是没有任何影响的。在使用了ACL的情况下,group的权限显示的就是当前的mask。通常我们把 mask设置成rwx,以不阻止任何的单个ACL项。到此为止,我们已经可以轻而易举地解决本文开头提出的问题了,只需要使用ACL为四组用户设置相应权限即可。最终设置结果如下:
[root@~]# getfacl aclTest/
# file: aclTest
# owner: zhou
# group: zhou
user::---
group::---
group:groupA:rwx
group:groupB:rw-
group:groupC:r--
group:groupD:---
mask::rwx
other::---