Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2113888
  • 博文数量: 82
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 880
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-14 00:01
文章分类

全部博文(82)

文章存档

2014年(1)

2011年(1)

2009年(8)

2008年(11)

2007年(13)

2006年(26)

2005年(22)

我的朋友

分类: LINUX

2006-10-28 09:26:27

----------------------- 页面 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。
 
阅读(643) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~