Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3476198
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: LINUX

2009-09-18 10:51:31

2009-03-18 23:11:22 by deepblue

前段时间,在Linux上设置一个目录的访问权限时,发现通过简单的chmod操作不能满足自己的需求,

问题:如果用root帐号创建了一个目录DIR,有A,B,C,D四组用户,我想给A组用户读写执行的权限(rwx),给B组用户读写的权限(rw-),给C组用户读的权限(r--),不给D任何权限(---),要如何实现?

UGO的局限性

通常大家熟悉的是UGO的权限管理方式(User, Group, Other),即对一个文件的所有者,所属组和其他用户来分别设置该文件的读写执行权限。对于简单应用来说,这种粗粒度的权限管理方式已经够用了,设置起 来也很方便。然而,当我们需要对某个文件进行较复杂详细的权限设置时,UGO方式就显示出了其局限性。

如,对于本文开始所提出的问题,需要为四组不同用户设置对目录DIR的不同访问权限,而UGO方式只能对目录的所有者,所属组,以及其他用户设置不同权限,即最多只能设置3种不同权限,还不能对多个不同用户分别设置。

ACL则很好的满足了这样的需求。

ACL简介

ACL,全称Access Control List,即文件/目录的访问控制列表,可以针对任意指定的用户/组分配rwx权限。现在主流的商业Unix系统都支持ACL。FreeBSD也提供了对 ACL的支持。Linux在这个方面也不会落后,从2.6版内核开始支持ACL[1]。顾名思义,ACL将用户对一个文件访问权限就像是放在了一个列表 里,列表的每一项分别对应了一个或一组具体用户对该文件的特定访问权限。这就使任意的访问权限管理成为了可能。

下面我们来看看如何通过ACL进行详细的文件访问权限管理。

检查ACL包安装情况

首先检查你的Linux系统的核心是否有支持ACL的功能。因为Linux系统并 不是每一个版本的核心都有支持ACL的功能,而且即使在 kernel 中已加进了 ACL 的支持,也不一定已经自动启用。最简单的方法就是检查系统目前的核心能否支持,下面是我在ubuntu8.04上面查看boot/config文件的结 果:

zhou@zhou-desktop:~$ uname -a
Linux zhou-desktop 2.6.24-23-generic #1 SMP Thu Feb 5 15:00:25 UTC 2009 i686 GNU/Linux
zhou@zhou-desktop:~$ cat /boot/config-2.6.24-23-generic | grep -i acl
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
CONFIG_GENERIC_ACL=y
CONFIG_JFS_POSIX_ACL=y
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_NFS_V3_ACL=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_XFS_POSIX_ACL=y

如果看到该文件里包含了以上多个 POSIX_ACL=y的行,说明ACL已经编译到了内核中,如ext2, ext3等文件系统已经能够支持ACL功能。

在基于Debian的系统,如ubuntu中,可以使用dpkg命令来查看是否已经安装了acl相应软件包。

zhou@zhou-desktop:~$ dpkg -l | grep -i acl
ii  acl                           2.2.45-1                 Access control list utilities
ii  libacl1                      2.2.45-1                 Access control list shared library

开启ACL选项

即使系统已经支持了ACL,通常系统是不会自动开启acl选项的,因此需要手动重新加载文件系统,开启acl选项:

$ mount -o remount,acl /

后面的/ 是硬盘分区,-o后面的两个选项,分别表示重新加载根分区,和开启acl选项。

当然,在重新加载文件系统时也可以指定文件系统类型和路径:

$ mount -t ext3 -o remount,acl /home

若没有提示错误,则表示重新加载成功。

如果希望系统启动时自动开启ACL选项,可以在/etc/fstab文件中进行设置,找到希望开启ACL选项的文件系统对应行,在选项栏中加入",acl",保存退出。在下次启动系统时则将自动开启ACL选项。

UUID=32308755-b5ed-426b-a49c-cc8951aa1eb3               ext3    relatime,acl,errors=remount-ro 0

如上行中的红色部分,表明在根文件系统上自动开启ACL选项。

ACL设置

ACL的主要命令有2个:getfacl和setfacl,下面分别对其进行简单介绍。

getfacl,用于获取文件的acl权限信息,基本用法如下:

zhou@zhou-desktop:~/Temp$ getfacl aclTest/
# file: aclTest
# owner: zhou
# group: zhou
user::rwx
group::r-x
other::r-x

注意,即使该文件系统上没有开启ACL选项,getfacl命令仍然可用,不过只显示默认的文件访问权限,即与ls -l显示的内容相似:

zhou@zhou-desktop:~/Temp$ ls -l
drwxr-xr-x 2 zhou zhou 4096 2009-03-18 19:29 aclTest

setfacl,用于详细设置文件的访问权限,基本用法如下:

setfacl –[mxdb] file/dir

-m 建立一个ACL规则

-x  删除一个ACL规则

-b  删除全部的ACL规则

下面来看具体例子。

添加/修改ACL规则:-m选项,为用户guest和组guset设置aclTest目录的读写权限,并使用getfacl查看设置结果:

zhou@zhou-desktop:~/Temp$ setfacl -m u:guest:rw,g:guest:rw aclTest/
zhou@zhou-desktop:~/Temp$ 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为自动添加的内容。mask权限的作用我们在后文将进行介绍。

删除ACL规则:删除用户guest对目录aclTest的访问权限:

zhou@zhou-desktop:~/Temp$ setfacl -x u:guest aclTest/
zhou@zhou-desktop:~/Temp$ 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选项

zhou@zhou-desktop:~/Temp$ setfacl -b aclTest/
zhou@zhou-desktop:~/Temp$ 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就可以了。使用方法如下所示:

zhou@zhou-desktop:~/Temp$ setfacl --set u::rwx,g::rx,o::rx,u:guest:rwx,g:guest:rwx aclTest/
zhou@zhou-desktop:~/Temp$ 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的文件,将会发现其访问权限位后面比一般文件多了一个+号:

zhou@zhou-desktop:~/Temp$ ls -l
drwxrwx---+ 2 zhou zhou 4096 2009-03-18 19:29 aclTest

最后我们来说说mask

如果说ACL的优先级高于UGO,那么mask就是一个名副其实的最后一道防线。它决定了一个用户/组能够得到的最大的权限。这样我们在不改变已有ACL的定义的基础上,可以临时提高或是降低安全级别:

zhou@zhou-desktop:~/Temp$ setfacl -m mask::r aclTest/
zhou@zhou-desktop:~/Temp$ 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为四组用户设置相应权限即可。最终设置结果如下:

zhou@zhou-desktop:~/Temp$ getfacl aclTest/
# file: aclTest
# owner: zhou
# group: zhou
user::---
group::---
group:groupA:rwx
group:groupB:rw-
group:groupC:r--
group:groupD:---

mask::rwx
other::---

本文对ACL的使用只作了简单粗略的介绍,若读者希望进行深入研究,可以参考本文后续的参考资料。

阅读(1187) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~