传统上,在Linux系统中每个档案和目录都设有权限(permission)来决定那些人能够使用这个档案。
权限分为三组,分别为:拥有者(file owner),群组(group),及其它(other)。
每组中再设有其属性。属性亦分为三种,分别为:读取(read),写入(write),及执行(executable)。
我们可以用”ls -l”来检视档案的权限:
-rwxrw-r– 1 adam mis 272401 May 10 2003 report.doc
在上面的例子,档案report.doc的拥有者为”adam”而adam可以读取,写入和执行这个档案,另外report.doc的群组为”mis”,在系统中所有属于mis群组的使用者皆可读取和写入这个档案,而其它的使用者只能够读取这个档案。
如果我们想report.doc的内容只能给mis群组的使用者读取,我们可以用”chmod 640 report.doc”这个指令更改其权限。
-rw-r—– 1 adam mis 272401 May 10 2003 report.doc
要是report.doc这个档案同时要给mis和hr两个群组的使用者读取,现有的权限机制已不能够让我们简易地设定。我们得要劳烦系统管理员为我们加 入一个新的群组(i.e.mishr),并把所有mis和hr中的使用者加进mishr群组中。然后我们要用”chgrp mishr report.doc”把群组设为mishr。
-rw-r—– 1 adam mishr 272401 May 10 2003 report.doc
假若,我们的要求再复杂一点:要让使用者adam和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”指令:
[adam@www adam]$ getfacl report.doc
# file: report.doc
# owner: adam
# group: mis
user::rwgroup::
rwother::
r–
以上的例子列出了一个基本的ACL(Minimum ACL)。头三行为档案数据,当中包括了档案的拥有者和所属群组。之后的便是ACL中的每一条的规则。
在这个基本的ACL中:
user::rw- 拥有者adam能读取和写入
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:
[adam@www adam]$ getfacl report.doc
# file: report.doc
# owner: adam
# group: mis
user::rwgroup::
rwgroup:
hr:r–
mask::rwother::—
回应本文开始时所要的权限:要让使用者adam和eva能读取和写入,群组mis和hr只能读取,其它人不能读取和写入。我们只需多加两个规则便能达成:
setfacl -m group::r,user:eva:rw report.doc
[adam@www adam]$ getfacl report.doc
# file: report.doc
# owner: adam
# group: mis
user::rwuser:
eva:rwgroup::
r–
group:hr:r–
mask::rwother::—
ACL的种类
ACL有两种,分别为『存取型ACL』(Access ACL)和『预设型 ACL』(Default ACL)。我们之前所介绍便是存取型ACL,可用于档案或目录,它决定了该档案或目录本身的使用权限。
而预设型ACL只可用于目录,它决定了该目录下新建立的档案或目录的ACL。
[adam@www adam]$ getfacl /home/adam
getfacl: Removing leading ””””/”””” from absolute path names
# file: home/adam
# owner: adam
# group: adam
user::rwx
group::—
other::—
要设定预设型ACL,同样使用“setfacl”。所不同的是,在每个规则前加上“default:”,例如:
setfacl -m default:user::rw /home/adam
如果觉得指令太长的话我们可以使用简略字符:
长写简写
user: u:
group: g:
other: o:
mask: m:
default: d:
例如,要设定/home/adam的预设型ACL为,使用者adam和eva能读取和写入,群组只能读取:
setfacl -m d:u::rw,d:u:eva:rw,d:g::r,d:o::- /home/adam
[adam@www adam]$ getfacl /home/adam
getfacl: Removing leading ””””/”””” from absolute path names
# file: home/adam
# owner: adam
# group: adam
user::rwx
group::—
other::—
default:user::rwdefault:
user:eva:rwdefault:
group::r–
default:mask::rwdefault:
other::—
建立新的档案并检视其存取型ACL:
[adam@www adam]$ touch newfile
[adam@www adam]$ getfacl newfile
# file: newfile
# owner: adam
# 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。


近期评论