----------------------- 页面 1-----------------------
在 Unix/Linux 系统上沿用了多年的权限机制,由于欠缺灵活性,在现今的信息系统上显
得落后和不敷应用。然而一个新的权限机制标准已经诞生出来,本文将会为大家介绍这个新
机制在 Linux 上的操作方式。
传统上,在 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。
----------------------- 页面 2-----------------------
-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
----------------------- 页面 3-----------------------
当中 “-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::rw-
group::rw-
other::r--
以上的例子列出了一个基本的 ACL (Minimum ACL)。头三行为档案数据,当中包括
了档案的拥有者和所属群组。之后的便是 ACL 中的每一条的规则。
在这个基本的 ACL 中:
user::rw- 拥有者 adam 能读取和写入
group::rw- 属于 mis 群组的使用者能读取和写入
other::r-- 其它的使用者只能读取
----------------------- 页面 4-----------------------
更改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
----------------------- 页面 5-----------------------
# owner: adam
# group: mis
user::rw-
group::rw-
group:hr:r--
mask::rw-
other::---
回应本文开始时所要的权限: 要让使用者 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::rw-
user:eva:rw-
group::r--
group:hr:r--
mask::rw-
other::---
ACL 的种类
----------------------- 页面 6-----------------------
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:
----------------------- 页面 7-----------------------
例如,要设定 /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::rw-
default:user:eva:rw-
default:group::r--
default:mask::rw-
default:other::---
建立新的档案并检视其存取型ACL:
[adam@www adam]$ touch newfile
[adam@www adam]$ getfacl newfile
# file: newfile
# owner: adam
----------------------- 页面 8-----------------------
# group: mis
user::rw-
user:eva:rw-
group::r--
mask::rw-
other::---
其它要注意的事项
除了以上堤及过的 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。