关于Linux 的ACL


传统上,在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。

  1. No comments yet.
(will not be published)