

简介
ACL是访问控制列表(Access Control Lists)的缩写,对于Unix系统,ACL是标准Unix文件属性(r,w)的附加扩展。ACL给予用户和管理员更好控制文件读写和权限赋予的能力,商业Unix和NTFS以及Freebsd都支持文件系统的ACL,Linux从2.6内核开始支持对Ext2,Ext3和XFS,JFS等文件系统的ACL支持。
注意:Fedora Core从2开始支持ACL操作,虽然好像并不支持JFS和ReiserFS。
打开文件系统的ACL支持,修改/etc/fstab的mount属性,例如针对这样的
/home文件系统,LABEL=/home /home ext3 rw,acl 1 2
该行第四列原文为defaults,现改为rw,acl以开启文件系统的ACL支持。
可以在线中心挂载文件系统
# mount -v -o remount /home
当然umount掉文件系统,再mount也是可以的,只要确信没有用户和程序在使用这个文件系统,可以通过mount命令来查看修改是否生效,
# mount -l
之后,输出中有这样的行就正确了,
/dev/hda5 on /home type ext3 (rw,acl) [/home]
ACL操作命令
getfacl - 取得文件的ACL信息
setfacl - 设置文件的ACL信息
基本命令就是这么两条。
getfacl很简单,可以返回文件当前的ACL信息,例如在一个CVSROOT下的passwd
有这样的属性,
# getfacl passwd
# file: passwd
# owner: cvsadmin
# group: cvsadmin
user::rw-
group::r--
other::r--
可以用setfacl加上相关属性,例如加上allen用户可写到刚才我们看到的passwd文件
# setfacl -m u:allen:rw- passwd
这个命令可以这样解释:增加用户(u)用户名(allen)可读写权限(rw-)到文件passwd。这样之后再执行getfacl,看看结果,
# getfacl passwd
# file: passwd
# owner: cvsadmin
# group: cvsadmin
user::rw-
user:allen:rw-
group::r--
mask::rw-
other::r--
可以看到多出了行user:allen:rw-,表示allen用户有rw-权限。
mask权限,就是用一个固定的权限设置遮住其他的权限设置,这样可以获得比较好的保护,因为用户最终对文件的权限将是由设置的权限和mask运算出来的有效权限,例如执行下面的设置
# setfacl -m mask::r-- passwd
# getfacl passwd
# file: passwd
# owner: cvsadmin
# group: cvsadmin
user::rw-
user:allen:rw- #effective:r--
group::r--
mask::r--
other::r--
我们可以看到allen用户对于passwd文件的有效(effective)权限经计算为r--。如果setfacl命令不指定操作用户,那么就是对默认属主用户权限的操作,这时候的setfacl命令功能上和传统的chmod相同。例如setfacl u::rwx,g::rwx,o::rwx
filename 等价于chmod 777 filenmae。
更多的setfacl操作
-x 删除特定用户的权限设置,例如setfacl -x u:allen
filename,删除filenmae上allen用户的权限设置。
删除所有的ACL设置
setfacl -b filename
setfacl --remove-all filename
递归选项 -R
此外,ACL的属性设置也可以写在一个文件中,使用setfacl的-M参数从文件中取得设置信息,这个对成批设置和备份ACL设置恢复特别有效。默认ACL设置,setfacl -d可以设置,只供目录以及目录继承使用。
cp和mv命令对于ACL的支持,mv命令保持ACL设置信息,cp命令在使用-p,-a参数时保留ACL设置信息。但是如果从一个支持ACL的文件系统向一个不支持ACL的文件系统移动或带ACL属性的拷贝,则会得到类似下面这样的错误提示:
cp: preserving permissions for `filename': Operation not supported
设置了ACL的文件在ls -l时可以看到这样的情况,
-rw-rw----+ 1 allen chen 0 Jun 2 09:52 filename
有个加号在第一个列的末尾。
可以这样备份ACL信息和恢复
getfacl -R dir/ > acl.bak.txt
setfacl --restore acl.bak.txt
打包备份ACLs目录和文件
请使用star命令打包,参数-acl用于指定备份相关的ACL信息。
备份:star -Hexustar -acl -c f=Tree.star Tree
恢复:star -acl -x f=Tree.star
ACL的应用,主要可以用在共享文件时需要细分用户权限的地方,如CVS仓库的权限控制应用等方面,ACL都有很好的用途。
******
ACL 在权限继承问题:
setfacl -m u:tset:rwx /test
意为增加test用户 对/test目录拥有完全权限
setfacl -m -d u:tset:rwx /test
意为增加test用户 对/test目录拥有完全权限并且默认继承。
关于 Linux 的 ACL
传统上,在Linux系统中每个档案和目录都设有权限(permission)来决定那些人能够使用这个档案。
权限分为三组,分别为:拥有者(file owner),群组(group),及其它(other)。
每组中再设有其属性。属性亦分为三种,分别为:读取(read),写入(write),及执行(executable)。
我们可以用ls -l来检视档案的权限:
-rwxrw-r- 1 freeoa mis 272401 May 10 2013 report.doc
在上面的例子,档案report.doc的拥有者为freeoa而freeoa可以读取,写入和执行这个档案,另外report.doc的群组为mis,在系统中所有属于mis群组的使用者皆可读取和写入这个档案,而其它的使用者只能够读取这个档案。
如果我们想report.doc的内容只能给mis群组的使用者读取,我们可以用chmod 640 report.doc这个指令更改其权限。
-rw-r--- 1 freeoa mis 272401 May 10 2013 report.doc
要是report.doc这个档案同时要给mis和hr两个群组的使用者读取,现有的权限机制已不能够让我们简易地设定。我们得要劳烦系统管理员为我们加 入一个新的群组(i.e.mishr),并把所有mis和hr中的使用者加进mishr群组中。然后我们要用chgrp mishr report.doc把群组设为mishr。
-rw-r--- 1 freeoa mishr 272401 May 10 2003 report.doc
假若,我们的要求再复杂一点:要让使用者freeoa和eva能读取和写入,群组mis和hr只能读取。那么,任我们再多加新的群组亦没办法得到这样的权限设 定。要得到以上的权限设定,我们须要一个新的权限机制。而这个机制名为存取控制清单(Access Control List,简称ACL)。ACL实为现有权限机制的延伸,在三个基本设定(拥有者,群组及其它)外,允许我们加入对某指定使用者或群组的存取权限设定。
为针对Unix系统先天的不足,一个名为POSIX ACL的权限机制标准便诞生出来。其目的是为各Unix系统之间制定一个兼容的ACL标准,使各用家能在各系统之间使用统一的接口。
这个POSIX ACL的功能在Linux kernel 2.6上被正式支持,之后又被back-port到2.4 kernel上。大家常用的档案系统,如:ext3,xfs,jfs,和ReiserFS,都能使用ACL。当然大家须要在编译kernel时启动 ACL。
相关的kernel option:
• CONFIG_FS_POSIX_ACL
• CONFIG_EXT3_FS_POSIX_ACL
• CONFIG_EXT2_FS_POSIX_ACL
挂上档案系统
虽然在kernel中已加进了POSIX ACL的支持,但是并不会自动启用的。我们必须在挂上档案系统时指明要使用ACL,例如:
mount -t ext3 -o acl /dev/sda1 /home
当中-o acl便是在/dev/sda1上启用ACL的选项,我们亦可以在/etc/fstab中加入选项:
/dev/sda1 /home ext3 acl 1 2
检视ACL
要检视一个档案或目录的ACL,便要使用getfacl指令:
[freeoa@www freeoa]$ getfacl report.doc
# file: report.doc
# owner: freeoa
# group: mis
user::rwgroup::
rwother::
r-
以上的例子列出了一个基本的ACL(Minimum ACL)。头三行为档案数据,当中包括了档案的拥有者和所属群组。之后的便是ACL中的每一条的规则。
在这个基本的ACL中:
user::rw- 拥有者freeoa能读取和写入
group::rw- 属于mis群组的使用者能读取和写入
other::r- 其它的使用者只能读取
更改ACL
setfacl指令能更改一个档案或目录的ACL。其用法如下:
setfacl option rules files
option:
-m 用来新增或修改ACL中的规则
-x 用来移除ACL中的规则
rules:
user:(uid/name):(perms) 指定某位使用者的权限
group:(gid/name):(perms) 指定某一群组的权限
other::(perms) 指定其它使用者的权限
mask::(perms) 设定有效的权限屏蔽
(perms)为传统的r(读取),w(写入)及x(执行)
如果想让hr群组的使用者能读取report.doc而其它的人不能读取的话,我们可以用以下的指令达成:
setfacl -m group:hr:r,other::- report.doc
以getfacl检视新的ACL:
[freeoa@www freeoa]$ getfacl report.doc
# file: report.doc
# owner: freeoa
# group: mis
user::rwgroup::
rwgroup:
hr:r-
mask::rwother::--
回应本文开始时所要的权限:要让使用者freeoa和eva能读取和写入,群组mis和hr只能读取,其它人不能读取和写入,我们只需多加两个规则便能达成:
setfacl -m group::r,user:eva:rw report.doc
[freeoa@www freeoa]$ getfacl report.doc
# file: report.doc
# owner: freeoa
# group: mis
user::rwuser:
eva:rwgroup::
r-
group:hr:r-
mask::rwother::--
ACL的种类
ACL有两种,分别为『存取型ACL』(Access ACL)和『预设型 ACL』(Default ACL)。我们之前所介绍便是存取型ACL,可用于档案或目录,它决定了该档案或目录本身的使用权限。而预设型ACL只可用于目录,它决定了该目录下新建立的档案或目录的ACL。
[freeoa@www freeoa]$ getfacl /home/freeoa
getfacl: Removing leading / from absolute path names
# file: home/freeoa
# owner: freeoa
# group: freeoa
user::rwx
group::--
other::--
要设定预设型ACL,同样使用setfacl。所不同的是,在每个规则前加上default:,例如:
setfacl -m default:user::rw /home/freeoa
如果觉得指令太长的话我们可以使用简略字符:
长写简写
user: u:
group: g:
other: o:
mask: m:
default: d:
例如,要设定/home/freeoa的预设型ACL为,使用者freeoa和eva能读取和写入,群组只能读取:
setfacl -m d:u::rw,d:u:eva:rw,d:g::r,d:o::- /home/freeoa
[freeoa@www freeoa]$ getfacl /home/freeoa
getfacl: Removing leading / from absolute path names
# file: home/freeoa
# owner: freeoa
# group: freeoa
user::rwx
group::--
other::--
default:user::rwdefault:
user:eva:rwdefault:
group::r-
default:mask::rwdefault:
other::--
建立新的档案并检视其存取型ACL:
[freeoa@www freeoa]$ touch newfile
[freeoa@www freeoa]$ getfacl newfile
# file: newfile
# owner: freeoa
# group: mis
user::rwuser:
eva:rwgroup::
r-
mask::rwother::--
其它要注意的事项
除了以上堤及过的getfacl和setfacl指令外,大家亦可以用另一个名为chacl的指令来修改ACL。chacl原本是IRIX系统上XFS的ACL工具,如果各位已经对chacl有认识的话便不用学getfacl和setfacl了。
美中不足的是,由于ACL是新的模块。虽然在kernel和一些shell common中支持外,很多大家常用的工具中仍未支持,当中包括KDE、Gnome、tar和dump等。
如要备份文件或目录既有的ACL大家可以用另一个和tar类似的工具star,来把ACL一起备份到tar档中,详情请参阅star的man page。