曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3044|回复: 0
打印 上一主题 下一主题

使用 ACL 设置权限

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2013-5-5 17:09:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ACL ,是 Access Control List (访问控制列表)的缩写。一般来说,它是为了弥补系统默认的权限机制在某些情况下不能面面俱到而设一种补充手段。比如在 Samba 服务器上,往往需要使用 ACL ,它允许为用户及用户组而设置具体的权限。

在应用 ACL 时有两个标准命令,getfacl setfacl ,详细的命令说明请参考 man 手册。下面将以一些实例来说明 ACL 权限设置的应用情况。

如果一个文件被应用了 ACL ,那么我们可以通过 ls 命令观察得到,看下面:
[beyes@groad.net tmp]$ ls -ld corp_dir/
drwxrwx---+ 2 sky corp 4096 Mar  8 23:45 corp_dir/
在上面,我们看到第一列的末尾处有一个小的 '+' ,这就表明该目录被设置了 ACL 权限。至于如何设置的,下面会有说明。

为了能够在 ext2/ext3/ext4 等文件系统上应用 ACL ,我们首先要使能它,方法是在 mount 一个设备时,要有 acl 选项(默认情况下 no_acl ,即不启用 ACL。但在 CentOS/RHEL6 中,已经默认启用)。比如你想将一个设备挂载到 /home 目录下,并在其上可以应用 ACL ,那么你可以添加 acl 选项到 /etc/fstab 文件的相应行上,比如:
LABEL=/home    /home    ext4   defaults,acl 1 2
在修改了 /etc/fstab 后,你需要将 /home 重新挂在以使能 ACL 功能。如果没有其他人在使用系统时,可以先 unmount (需要 root 权限),然后再 mount 。假如还有人在使用该设备,那么可以使用 remount 选项来重新挂载,比如:
# mount -v -o remount /home
/dev/sda3 on /home type ext4 (rw,acl)

先查看一个文件系统传统属性:
[sky@groad.net tmp]$ touch sky.txt
[sky@groad.net tmp]$ ll sky.txt
-rw-r--r--. 1 sky corp 0 Mar  9 10:38 sky.txt
查看它的 ACL 权限,可以用 getfacl :
[sky@groad.net tmp]$ getfacl sky.txt
# file: sky.txt
# owner: sky
# group: corp
user::rw-
group::r--
other::r--
在还未设置 ACL 时,输出的就是系统的默认权限。以 '#' 打头的是说明部分,称为“头部信息“,它给出了文件名称,文件属主,文件用户组。如果不想看到这个文件头,可以使用 --omit-header 选项:
[sky@groad.net tmp]$ getfacl --omit-header sky.txt
user::rw-
group::r--
other::r--
上面 sky 这个用户的组是 corp ,可以通过 groups 命令(id 命令也可以)看到:
[sky@groad.net tmp]$ groups
corp
通常情况下,除了 root 外,没有人能够写 sky.txt 这个文件,你如果想允许某个用户可以写该文件,你需要 chmod 一下 other 的权限,但是这样一来,允许的范围有点过大了。比如现在仅希望 beyes 这个用户可以写该文件,此时就需要设置 ACL 权限了。设置 ACL 权限使用 setfacl 命令及其 -m (--modify)选项,语法格式为:
setfacl ––modify ugo:name:permissions file-list
在 ugo:name:permissions 这部分里,ugo 分别表示要 user ,group, other 。name 表示要设置的用户名或组名,如果要设置 other 的权限,那么 name 这栏要留空。permissions 是要设置的权限,可以用符号表示(如 rwx, r-x),也可以是八进制形式。

下面就要用 setfacl 命令为 sky.txt 这个文件为 beyes 这个用户单独添加写权限,如下执行命令:
setfacl -m u:beyes:rw- sky.txt
也可以如下使用:
setfacl -m u:beyes:6- sky.txt

现在用 beyes 这个用户往 sky.txt 里面写点东西看看:
[beyes@groad.net tmp]$ echo "hello groad.net" > sky.txt
[beyes@groad.net tmp]$ cat sky.txt
hello groad.net
说明权限设置是成功的。还可以用 getfacl 来查看一下 ACL 规则:
[beyes@groad.net tmp]$ getfacl sky.txt
# file: sky.txt
# owner: sky
# group: corp
user::rw-
user:beyes:rw-group::r--
mask::rw-
other::r--[table=100%,#ff9632][/table]

上面这个简单的例子就是 ACL 规则的基本应用。

在上面的 getfacl sky.txt 输出中,看到了一个掩码:mask::rw- 。这个 mask 称为"Effective Rights Mask"(有效权限掩码)。该掩码用来限制分配给用户或组的 ACL 规则的有效权限。它不能影响文件属主或组的权限。换句话来说,它不会影响 Linux 的传统权限设置。但是,由于 setfacl 一般都只是对分配到文件上的 ACL 权限做最小限制,因此这个掩码不会达到限制权限的目的,除非你明确进行设置。设置掩码使用 mask 选项,设置时原来的 ugo 不要写,而是使用 mask ,同时也不要去指定 name 部分。比如下面命令为 sky.txt 设置一个只允许读的掩码:
$ setfacl -m mask::r-- sky.txt
接着再使用 getfacl 来查看 sky.txt 的 ACL 权限:
[sky@groad.net tmp]$ getfacl sky.txt
# file: sky.txt
# owner: sky
# group: corp
user::rw-
user:beyes:rw-            #effective:r--
group::r--
mask::r--
other::r--
从上面的输出的注释部分可以看到,beyes ACL 上的有效权限已经只剩下只读,之前的可写权限已经被取消。可以再次尝试写 sky.txt 来验证是否可写:
[beyes@groad.net tmp]$ echo "hello linux" >> sky.txt
-bash: sky.txt: Permission denied
可见,设置是成功的。

当然了,ACL 规则可以在一行上一次写多条,每条规则使用逗号分隔,比如:
$ setfacl -m u:beyes:r--,u:Anono:rw- sky.txt

设置了权限,就应该有取消权限的选项,setfacl 中的 -x 选项可以移除一个用户或组的 ACL 规则,同样它不会影响文件数组及其组的权限。下面将 sky.txt 上的 ACL 规则取消:
[sky@groad.net tmp]$ setfacl -x u:beyes sky.txt
[sky@groad.net tmp]$ getfacl sky.txt
# file: sky.txt
# owner: sky
# group: corp
user::rw-
group::r--
mask::r--
other::r--
对于 beyes 上的 ACL 规则已经移除,但之前设置的掩码并没有去掉。如果也想去掉,那么使用 -b 选项:
[sky@groad.net tmp]$ setfacl -b sky.txt
[sky@groad.net tmp]$ getfacl sky.txt
# file: sky.txt
# owner: sky
# group: corp
user::rw-
group::r--
other::r--

上面的规则是为普通文件而设置的,对于目录权限的设置,我们使用“默认规则”(Default Rules) 。setfacl 中的 -d (default)选项可以为目录添加默认规则。一个目录添加了默认规则后,那么此后在其中添加的文件及子目录都将继承这一规则,因此称为“默认规则”。

默认情况下,一个目录是没有 ACL 默认规则的:
[sky@groad.net tmp]$ mkdir -m 700 skydir
[sky@groad.net tmp]$ ls -ld skydir
drwx------. 2 sky corp 4096 Mar  9 14:59 skydir
[sky@groad.net tmp]$ getfacl skydir
# file: skydir
# owner: sky
# group: corp
user::rwx
group::---
other::---
在设置 skydir 这个目录时指定了权限 700,因此 group 和 other 对该目录是没有任何权限的。下面打算添加一条默认规则,使组 corp 和 sup 组具有不同的权限:
[sky@groad.net tmp]$ setfacl -d -m g:corp:rwx,g:sup:r-x skydir
使用 getfacl 命令来观察一下:
[sky@groad.net tmp]$ getfacl skydir
# file: skydir
# owner: sky
# group: corp
user::rwx
group::---
other::---
default:user::rwx
default:group::---
default:group:corp:rwx
default:group:sup:r-x
default:mask::rwx
default:other::---
从上面输出可以看到,一共有 6 条 default 默认规则。其中第 1 ,第 2 及最后一条默认规则分别是文件属主,用户组以及 other 的组的权限。这 3 条是 Linux 的传统权限。

第 3,第4 条规则为 corp 和 sup 这两个组指定了权限。第 5 条是默认的掩码。

到了这一步,不能认为 corp 和 sup 组的用户已经具有这个目录下的权限(corp:rwx, sup:r-x)。可以分别用这两个组的用户试一下:
[gilble@groad.net tmp]$ id gilble
uid=503(gilble) gid=502(corp) groups=502(corp)
[gilble@groad.net tmp]$ cd skydir
-bash: cd: skydir: Permission denied

[Anono@groad.net tmp]$ id Anono
uid=502(Anono) gid=504(sup) groups=504(sup)
[Anono@groad.net tmp]$ cd skydir
-bash: cd: skydir: Permission denied

因此还需要手动做这个添加:
[sky@groad.net tmp]$ setfacl -m g:corp:rwx,g:sup:r-x skydir

再次用上面两个用户进入 skydir 目录:
[gilble@groad.net tmp]$ cd skydir
[gilble@groad.net skydir]$ pwd
/tmp/skydir

[Anono@groad.net tmp]$ cd skydir
[Anono@groad.net skydir]$ pwd
/tmp/skydir

可见,此时权限现在才生效。因此,一般的,可以在设置默认规则时顺并将权限添加进来。

下面在 skydir 这个目录下建立文件,看看是什么情况:
[sky@groad.net skydir]$ ll groad.txt
-rw-rw----+ 1 sky corp 0 Mar  9 17:05 groad.txt
[sky@groad.net skydir]$ getfacl groad.txt
# file: groad.txt
# owner: sky
# group: corp
user::rw-
group::---
group:corp:rwx            #effective:rw-
group:sup:r-x            #effective:r--
mask::rw-
other::---
将上面的 groad.net 的权限改变一下:
[sky@groad.net skydir]$ chmod g-w groad.txt
[sky@groad.net skydir]$ ll
total 4
-rw-r-----+ 1 sky corp 0 Mar  9 17:05 groad.txt
[sky@groad.net skydir]$ getfacl groad.txt
# file: groad.txt
# owner: sky
# group: corp
user::rw-
group::---
group:corp:rwx            #effective:r--
group:sup:r-x            #effective:r--
mask::r--
other::---
由上面可见,在 skydir 目录下所创建的文件的掩码,如果不是由 setfacl 明确指定的话,那它就自动使用传统权限中的用户组权限作为掩码。也就是说,传统权限优先于 ACL 。

有时我们可能需要将一个文件上的 ACL 设置拷贝到另外一个文件,那么我们可以使用下面的命令来进行 ACL 的拷贝:
getfacl basefile | setfacl -b -M - targetfile
这样,targefile 就拷贝了一份 basefile 的权限设置,这是通过 setfacl 的 -M 选项来实现的。

此外,我们还可以进行权限的递归设置。如果要使某个目录下的所有文件及子目录都具有相同的权限,那么可以使用 setfacl 的 -R 选项。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 06:57 , Processed in 0.078513 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表