linux学习笔记之 ACL 的使用



什么是 ACL
ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner,group,others 的
read,write,execute 权限之外的细部权限设定。ACL 可以针对单一使用者,单一文件或目录来进行
r,w,x 的权限规范,对于需要特殊权限的使用状况非常有帮助。
那 ACL 主要可以针对哪些方面来控制权限呢?他主要可以针对几个项目:
    使用者 (user):可以针对使用者来设定权限;
    群组 (group):针对群组为对象来设定其权限;
    默认属性 (mask):还可以针对在该目录下在建立新文件/目录时,规范新数据的默认权限;

如何启动 ACL
由于 ACL 是传统的 Unix-like 操作系统权限的额外支持项目,因此要使用 ACL 必须要有文件系统的支
持才行。目前绝大部分的文件系统都有支持 ACL 的功能,包括 ReiserFS, EXT2/EXT3, JFS, XFS 等等。
在我们的 CentOS 5.x 当中,预设使用 Ext3 是启动 ACL 支持的,至于察看你的文件系统是否支持 ACL
可以这样看:
# mount <==直接查阅挂载参数的功能
/dev/hda2 on / type ext3 (rw)
/dev/hda3 on /home type ext3 (rw)
# 假设我们只要看这两个装置。但没有看到 acl
# dumpe2fs -h /dev/hda2 <==由 superblock 内容去查询
....(前面省略)....
Default mount options:
user_xattr acl
....(后面省略)....

由 mount 单纯去查阅不见得可以看到实际的项目,由于目前新的 distributions 常常会主动加入某些默
认功能, 如上表所示,其实 CentOS 5.x 在预设的情况下 (Default mount options:) 就帮你加入 acl的
支持了!,那如果你的系统默认不会帮你加上 acl 的支持呢?那你可以这样做:
# mount -o remount,acl /
# mount
/dev/hda2 on / type ext3 (rw,acl)
# 这样就加入了,但是如果想要每次开机都生效,那就这样做:
# vi /etc/fstab
LABEL=/1 / ext3    defaults,acl    11
如果你不确定或者是不会使用 dumpe2fs 观察你的文件系统,那么建议直接将上述的 /etc/fstab 里面
的内容修改一下即可

ACL 的设定技巧: getfacl, setfacl
好了,让你的 filesystem 启动 ACL 支持后,接下来该如何设定与观察 ACL 呢? 很简单,利用这两个指令就可以了:
    getfacl:取得某个文件/目录的 ACL 设定项目;
    setfacl:设定某个目录/文件的 ACL 规范。
setfacl 指令用法
#setfacl [-bkRd] [{-m|-x} acl 参数] 目标文件名
选项与参数:
-m :设定后续的 acl 参数给文件使用,不可与 -x 合用;
-x :别除后续的 acl 参数,不可与 -m 合用;
-b :移除所有的 ACL 设定参数;
-k :移除预设的 ACL 参数,关于所谓的『预设』参数于后续范例中介绍;
-R :递归设定 acl ,亦即包括次目录都会被设定起来;
-d :设定『预设 acl 参数』的意思!只对目录有效,在该目录新建的数据会引用此默认值
上面谈到的是 acl 的选项功能,那举如何设定 ACL 的特殊权限呢?特殊权限的设定方法有很多, 我们
先来谈谈最常见的,就是针对单一使用者的设定方式:
1. 针对特定使用者的方式:
设定规范:『 u:[使用者账号列表]:[rwx] 』,例如针对 vbird1 的权限规范rx :
# touch acl_test1
# ll acl_test1
-rw-r--r-- 1 root root 0 Feb 27 13:28 acl_test1
# setfacl -m u:vbird1:rx acl_test1
# ll acl_test1
-rw-r-xr--+ 1 root root 0 Feb 27 13:28 acl_test1
权限部分多了个 + ,且与原本的权限 (644) 看起来差异很大,但要如何查阅呢?
# setfacl -m u::rwx acl_test1
[root@www ~]# ll acl_test1
-rwxr-xr--+ 1 root root 0 Feb 27 13:28 acl_test1
# 无使用者列表,代表设定该文件拥有者,所以上面显示 root 的权限成为 rwx了!

getfacl 指令用法
#getfacl filename
选项与参数:
getfacl 的选项几乎与 setfacl 相同!所以鸟哥这里就免去了选项的说明啊
请列出刚刚我们设定的 acl_test1 的权限内容:
# getfacl acl_test1
# file: acl_test1 <==说明档名
# owner: root     <==说明此文件的拥有者,亦即 ll 看到的第三使用者字段
# group: root     <==此文件的所属群组,亦即 ll 看到的第四群组字段
user::rwx         <==使用者列表栏是空的,代表文件拥有者的权限
user:vbird1:r-x   <==针对 vbird1 的权限设定为 rx ,与拥有者并不同!
group::r--        <==针对文件群组的权限设定仅有 r
mask::r-x         <==此文件预设的有效权限 (mask)
other::r--        <==其他人拥有的权限
上面的数据非常容易查阅,显示的数据前面加上 # 的,代表这个文件的默认属性,包括文件名、文件
拥有者与文件所属群组。 底下出现的 user, group, mask, other 则是属于不同使用者、群组与有效权
限(mask)的设定值。 以上面的结果来看,我们刚刚设定的 vbird1 对于这个文件具有 r 与x 的权限。

2. 针对特定群组的方式:
 设定规范:『 g:[群组列表]:[rwx] 』,例如针对 mygroup1 的权限规范 rx :
# setfacl -m g:mygroup1:rx acl_test1
# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:vbird1:r-x
group::r--
group:mygroup1:r-x <==这里就是新增的部分,多了这个群组的权限设定
mask::r-x
other::r--
基本上,群组与使用者的设定并没有什么太大的差异啦!如上表所示,非常容易了解意义。不过,你应
该会觉得奇怪的是, 那个 mask 是什举东西啊?其实他有点像是『有效权限』的意思!他的意义是:
使用者或群组所设定的权限必须要存在于 mask 的权限设定范围内才会生效,此即『有效权限
(effective permission)』 我们举个例子来看,如下所示:
3. 针对有效权限 mask 的设定方式:
设定规范:『 m:[rwx] 』,例如针对刚刚的文件规范为仅有 r :
# setfacl -m m:r acl_test1
# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:vbird1:r-x    #effective:r-- <==vbird1&mask 均存在者,仅有 r 而已!
group::r--
group:mygroup1:r-x
mask::r--          #effective:r--

other::r--
vbird1 与 mask 的集合发现仅有 r 存在,因此 vbird1 仅具有 r 的权限而已,并不存在 x 权限
这就是 mask 的功能。可以透过使用 mask 来规范最大允许的权限,就能够避免不小心开放某些
权限给其他使用者或群组了。 不过,通常都是将 mask 设定为 rwx ,然后再分别依据不同的使
用者/群组去规范她们的权限就是了。
例题:
/srv/projecta 这个目录,让 myuser1 可以进入查阅,但 myuser1 不具有修改的权力。
答:
由于 myuser1 是独立的使用者与群组,而 /srv 是附属于 / 之下的,因此 /srv 已经具有 acl
的功能。 透过如下的设定即可搞定:
1. 先测试看看,使用 myuser1 能否进入该目录
[myuser1@www ~]$ cd /srv/projecta
-bash: cd: /srv/projecta: Permission denied <==确实不可进入!
2. 开始用 root 的身份来设定一下该目录的权限吧!
# setfacl -m u:myuser1:rx /srv/projecta
# getfacl /srv/projecta
# file: srv/projecta
# owner: root
# group: projecta
user::rwx
user:myuser1:r-x <==还是要看看有没有设定成功
group::rwx
mask::rwx
other::---
3. 还是得要使用 myuser1 去测试看看结果
[myuser1@www ~]$ cd /srv/projecta
[myuser1@www projecta]$ ll -a
drwxrws---+ 2 root projecta 4096 Feb 27 11:29 . <==确实可以查询档名
drwxr-xr-x 4 root root
4096 Feb 27 11:29 ..
[myuser1@www projecta]$ touch testing
touch: cannot touch `testing‘: Permission denied <==确实不可以写入

上面的设定我们就完成了之前任务二的后续需求喔!这举简单呢!接下来让我们来测试一下,如果我用
root 或者是 pro1 的身份去 /srv/projecta 增加文件或目录时,该文件或目录是否能够具有 ACL 的设
定? 意思就是说,ACL 的权限设定是否能够被次目录所『继承』先试看看:
# cd /srv/projecta
# touch abc1
# mkdir abc2
# ll -d abc*
-rw-r--r-- 1 root projecta
0 Feb 27 14:37 abc1
drwxr-sr-x 2 root projecta 4096 Feb 27 14:37 abc2
你可以明显的发现,权限后面都没有 + ,代表这个 acl 属性并没有继承。如果你想要让 acl 在目录底
下的数据都有继承的功能,那就得如下这样做了!

4. 针对预设权限的设定方式:

设定用户预设mask:

#setfacl -m mask::rx  目录名或文件名

[没有d选项表示仅对当前目录有效]

移除文件或目录的acl

#setfacl -b 目录名或文件名


设定规范:『 d:[ug]:使用者列表:[rwx] 』,d选项表示对当前目录acl设定继承
让 myuser1 在 /srv/projecta 底下一直具有 rx 的预设权限
[root@www ~]# setfacl -m d:u:myuser1:rx /srv/projecta
[root@www ~]# getfacl /srv/projecta
# file: srv/projecta
# owner: root
# group: projecta
user::rwx
user:myuser1:r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:user:myuser1:r-x
default:group::rwx
default:mask::rwx
default:other::---

# cd /srv/projecta
[root@www projecta]# touch zzz1
[root@www projecta]# mkdir zzz2
[root@www projecta]# ll -d zzz*
-rw-rw----+ 1 root projecta
0 Feb 27 14:57 zzz1
drwxrws---+ 2 root projecta 4096 Feb 27 14:57 zzz2
# 确实有继承,然后我们使用 getfacl 再次确认
# getfacl zzz2
# file: zzz2
# owner: root
# group: projecta
user::rwx
user:myuser1:r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:user:myuser1:r-x
default:group::rwx
default:mask::rwx
default:other::---
透过这个『针对目录来设定的默认 ACL 权限设定值』的项目,我们可以让这些属性继承到次目录底下
如果想要让 ACL 的属性全部消失『 setfacl -b 文件或目录名 』即可


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。