Linux文件系统ACL介绍
开发ACL功能的目的是让普通用户可与其他用户和组有选择性地共享自己的文件和目录。通过使用ACL用户可以允许其他用户读取、写入和执行文件和目录,而无需这些文件系统元素保持打开状态,或者请求root用户更改所分配的文件或者目录。
使用ACL必须在文件系统被挂载时在该文件系统上启用之。在RHEL系统被安装时,会自动在每个文件系统上启用ACL。
如果在安装完毕后(比如添加一个硬盘)创建了一个文件系统,则需要确保在挂载该系统时使用acl挂载选项。
为向文件添加 ACL 可以使用 setfacl 命令;而如果査看文件上的 ACL设置可以使用 getfacl 命令。
如果想要在任何文件或者目录上设置ACL必须是分配到该文件或目录上的实际拥有者(用户)。换言之,使用setfacl所设置的用户或组权限并没有赋予更改文件中ACL的权限。
因为可以将多个用户和组分配给一个文件/目录,所以一个用户所拥有的实际权限等于用户所属的所有用户/组权限的并集。如果针对 sales 组的文件具有只读权限,而针对 market组的文件具有读取/写入/执行权限(rwx),同时 freeoa 属于这两个组,那么 freeoa 最终拥有rwx权限。
通过使用 setfacl 命令,可以修改权限(-m)或者删除 ACL权限(-x)。下面是 setfacl 命令语法的个示例:
setfacl -m u:username:rwx filename
在该示例中,修改选项(-m)之后紧跟着字母u,表明正在为用户设置ACL权限。在一个冒号(:)之后是用户名,然后紧跟着又是一个冒号以及想要分配的权限。与使用 chmod 命令一样,使用setiacl可以为用户或组分配读取(7)、写入(w)和/或执行(x)权限(在本示例中给予了全 rwx 权限)。
setfacl -m g:user_group_name:rx filename
为组用户分配了rx权限。
通过ls -l的输出可以看到,在rw-rw-r--+输出中有一个加号(+)。该加号表明已经在文件上设置了 ACL,所以可以运行 getfacl 命令,注意对 mask 行(位于getfacl输出的末尾处):一旦在某一文件上设置了ACL,普通组权限就可以像ACL用户或组那样在文件上设置最大权限的mask。所以即使为单个人提供了比组权限所允许的更多的 ACL权限,其有效权限也不会超过组权限。
通过在某一目录上设置默认的ACL,可以让ACL得到继承。这也就意味着当在该目录中创建了新文件和目录时,它们也会被分配相同的ACL。为将某一用户或者组 ACL 权限设置为默认值,需要在用户或者组名称中添加一个d:。
setfacl -m -d:g:usergroup:rwx dir
可在其下创建子目录并运行getfacl来查看其是否继承了上级目录的ACL。
注意当在该目录中创建了一个文件时,所继承的权限是不同的。如果在没有执行权限的情况下创建一个普通文件,那么有效权限将减为rw-。
默认安装完毕后所创建的基本 Limux 文件系统只会将一个用户和一个组分配给每个文件和目录,而不会包括 ACL 支持。Linux ext文件系统类型(ext2~4)可以通过一个挂载选项添加 ACL支持。而为了添加 ACL支持,必须在挂载文件系统时添加acl挂载选项。添加该选项的方法可以有多种,主要包括:
1.在/etc/fstab 文件中有一行命令负责在系统启动时自动挂载文件系统,请在该命令的第5个字段添加 acl 选项。
2.在文件系统超级块的 Default 挂载选项字段中插入 acl 行,从而使用 acl 选项,而不管文件系统是自动挂载还是手动挂载。
3.当使用 mount 命令手动挂载文件系统时将acl选项添加到mount命令行。
在RHEL系统中只能将 acl 挂载选项添加到 Linux 安装完毕后创建的文件系统。在安装 Anaconda的过程中,安装程序会自动将 ACL 支持添加到所创建的每一个文件系统中。如果想要检查acl选项是否被添加到某一文件系统,请先确定与该文件系统相关联的设备名,然后运行tune2fs-命令,查看所插入的挂载选项。例如:
# mount grep home
/dev/mapper/freeoa-home on /home type ext4(rw)
# tune2fs -l /dev/mapper/freeoa-home |grep "mount options"
Default mount options:user xattr acl
首先输入 mount 命令,查看目前所挂载的所有文件系统的列表,并通过对单词home的查找限制了输出内容(因为只想查看挂载在home上的文件系统)。查看了文件系统的设备名后,使用该名称作为tune2fs的一个选项,查找默认的挂载选项行。
此时可以看到挂载选项user_xatr(为了扩展的属性,比如SELinux和acl被插入到文件系统超级块中,因此当挂载文件系统时会使用这些挂载选项。如果 Default 挂载选项字段为空(比如在创建了一个新文件系统之后),则可以使用tune2fs -o命令添加 acl挂载选项。例如在一个可移动 USB 驱动器(被分配为/dev/sdc1设备)上创建了一个文件系统,并为其开启acl挂载选项并进行检查,可运行下面所示的命令:
#tune2fs -o acl /dev/sdc1
#tune2fs -l /dev/sdc1 |grep "mount options"
Default mount options:acl
如果想要测试上面命令行是否正常工作,可以重新挂载文件系统并在文件系统的某一文件上使用 setfacl 命令查看。
向文件系统添加ACL支持的第二种方法是向/etc/fstab文件中用来在启动时自动挂载文件系统的命令行中添加 acl 选项。下面的示例显示了将/dev/sdcl 设备上的 ext4文件系统挂载到/var/stuff 目录的命令行:
/dev/sdc1 /var/stuff ext4 acl 1 2
在第4个字段添加了 acl,替代了defaults。如果在该字段已经添加了其他选项,可以在最后一个选择之后添加一个逗号再添加acl。当再次挂载该文件系统时,ACL将被启用。如果文件系统已经被挂载,则可以root用户的身份输入下面所示的mount命令(使用acl或者被添加到/etc/fstab文件的其他值),以便重新挂载文件系统:
#mount -o remount /dev/sdc1
第三种向文件系统添加ACL支持的方法是手动挂载文件系统并专门请求acl挂载选项。所以如果在/etc/stab文件中没有文件系统的条目,则可以在创建了挂载点(var/stuff)之后,输入下面的命令挂载文件系统并包括ACL支持:
#mount -o acl /dev/sdcl /var/stuff
mount指令只能临时挂载文件系统。当系统重新启动后就失效了,除非在/etc/fstab文件中添加一个条目。
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。
使用ACL必须在文件系统被挂载时在该文件系统上启用之。在RHEL系统被安装时,会自动在每个文件系统上启用ACL。
如果在安装完毕后(比如添加一个硬盘)创建了一个文件系统,则需要确保在挂载该系统时使用acl挂载选项。
为向文件添加 ACL 可以使用 setfacl 命令;而如果査看文件上的 ACL设置可以使用 getfacl 命令。
如果想要在任何文件或者目录上设置ACL必须是分配到该文件或目录上的实际拥有者(用户)。换言之,使用setfacl所设置的用户或组权限并没有赋予更改文件中ACL的权限。
因为可以将多个用户和组分配给一个文件/目录,所以一个用户所拥有的实际权限等于用户所属的所有用户/组权限的并集。如果针对 sales 组的文件具有只读权限,而针对 market组的文件具有读取/写入/执行权限(rwx),同时 freeoa 属于这两个组,那么 freeoa 最终拥有rwx权限。
通过使用 setfacl 命令,可以修改权限(-m)或者删除 ACL权限(-x)。下面是 setfacl 命令语法的个示例:
setfacl -m u:username:rwx filename
在该示例中,修改选项(-m)之后紧跟着字母u,表明正在为用户设置ACL权限。在一个冒号(:)之后是用户名,然后紧跟着又是一个冒号以及想要分配的权限。与使用 chmod 命令一样,使用setiacl可以为用户或组分配读取(7)、写入(w)和/或执行(x)权限(在本示例中给予了全 rwx 权限)。
setfacl -m g:user_group_name:rx filename
为组用户分配了rx权限。
通过ls -l的输出可以看到,在rw-rw-r--+输出中有一个加号(+)。该加号表明已经在文件上设置了 ACL,所以可以运行 getfacl 命令,注意对 mask 行(位于getfacl输出的末尾处):一旦在某一文件上设置了ACL,普通组权限就可以像ACL用户或组那样在文件上设置最大权限的mask。所以即使为单个人提供了比组权限所允许的更多的 ACL权限,其有效权限也不会超过组权限。
通过在某一目录上设置默认的ACL,可以让ACL得到继承。这也就意味着当在该目录中创建了新文件和目录时,它们也会被分配相同的ACL。为将某一用户或者组 ACL 权限设置为默认值,需要在用户或者组名称中添加一个d:。
setfacl -m -d:g:usergroup:rwx dir
可在其下创建子目录并运行getfacl来查看其是否继承了上级目录的ACL。
注意当在该目录中创建了一个文件时,所继承的权限是不同的。如果在没有执行权限的情况下创建一个普通文件,那么有效权限将减为rw-。
默认安装完毕后所创建的基本 Limux 文件系统只会将一个用户和一个组分配给每个文件和目录,而不会包括 ACL 支持。Linux ext文件系统类型(ext2~4)可以通过一个挂载选项添加 ACL支持。而为了添加 ACL支持,必须在挂载文件系统时添加acl挂载选项。添加该选项的方法可以有多种,主要包括:
1.在/etc/fstab 文件中有一行命令负责在系统启动时自动挂载文件系统,请在该命令的第5个字段添加 acl 选项。
2.在文件系统超级块的 Default 挂载选项字段中插入 acl 行,从而使用 acl 选项,而不管文件系统是自动挂载还是手动挂载。
3.当使用 mount 命令手动挂载文件系统时将acl选项添加到mount命令行。
在RHEL系统中只能将 acl 挂载选项添加到 Linux 安装完毕后创建的文件系统。在安装 Anaconda的过程中,安装程序会自动将 ACL 支持添加到所创建的每一个文件系统中。如果想要检查acl选项是否被添加到某一文件系统,请先确定与该文件系统相关联的设备名,然后运行tune2fs-命令,查看所插入的挂载选项。例如:
# mount grep home
/dev/mapper/freeoa-home on /home type ext4(rw)
# tune2fs -l /dev/mapper/freeoa-home |grep "mount options"
Default mount options:user xattr acl
首先输入 mount 命令,查看目前所挂载的所有文件系统的列表,并通过对单词home的查找限制了输出内容(因为只想查看挂载在home上的文件系统)。查看了文件系统的设备名后,使用该名称作为tune2fs的一个选项,查找默认的挂载选项行。
此时可以看到挂载选项user_xatr(为了扩展的属性,比如SELinux和acl被插入到文件系统超级块中,因此当挂载文件系统时会使用这些挂载选项。如果 Default 挂载选项字段为空(比如在创建了一个新文件系统之后),则可以使用tune2fs -o命令添加 acl挂载选项。例如在一个可移动 USB 驱动器(被分配为/dev/sdc1设备)上创建了一个文件系统,并为其开启acl挂载选项并进行检查,可运行下面所示的命令:
#tune2fs -o acl /dev/sdc1
#tune2fs -l /dev/sdc1 |grep "mount options"
Default mount options:acl
如果想要测试上面命令行是否正常工作,可以重新挂载文件系统并在文件系统的某一文件上使用 setfacl 命令查看。
向文件系统添加ACL支持的第二种方法是向/etc/fstab文件中用来在启动时自动挂载文件系统的命令行中添加 acl 选项。下面的示例显示了将/dev/sdcl 设备上的 ext4文件系统挂载到/var/stuff 目录的命令行:
/dev/sdc1 /var/stuff ext4 acl 1 2
在第4个字段添加了 acl,替代了defaults。如果在该字段已经添加了其他选项,可以在最后一个选择之后添加一个逗号再添加acl。当再次挂载该文件系统时,ACL将被启用。如果文件系统已经被挂载,则可以root用户的身份输入下面所示的mount命令(使用acl或者被添加到/etc/fstab文件的其他值),以便重新挂载文件系统:
#mount -o remount /dev/sdc1
第三种向文件系统添加ACL支持的方法是手动挂载文件系统并专门请求acl挂载选项。所以如果在/etc/stab文件中没有文件系统的条目,则可以在创建了挂载点(var/stuff)之后,输入下面的命令挂载文件系统并包括ACL支持:
#mount -o acl /dev/sdcl /var/stuff
mount指令只能临时挂载文件系统。当系统重新启动后就失效了,除非在/etc/fstab文件中添加一个条目。
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。