welcome: please sign in
location: AclHowto

使用 POSIX ACL 协助同一台主机上多人协作的权限管理

假设主机 hast 上有 bob, cindy 两个人需要修改 /path/to/project1 里面的文件。于是,hast 的管理员 admin 建立了一个组 project1,把他们都加了进去,并修改了 /path/to/project1 的属性:

# groupadd project1
# gpasswd -a bob project1
# gpasswd -a cindy project1
# chgrp project1 -R /path/to/project1
# chmod g+rwX -R /path/to/project1

Wow~ 好像大功告成了,是吗? 可是,假设 bob 在 /path/to/project1 中创建了一个文件

% touch /path/to/project1/file1

那么这个 file1 的权限一般会是:

-rw-r--r--

即 u=rw g=r o=r。而且 file1 的组会是 bob 的“默认组”而不是 project1。

如何解决呢?

bob 刚才创建的文件具有上述两个讨厌的特性;但是如果 bob 记得每次打以下命令,就能创建出想要的文件:

% newgrp project1 # 把默认组换成 project1。注意这会开一个 subshell
% umask 002 # 让创建的文件对组可写

但是这样 admin 就必须要告诉每一个用户记得打这两行命令……有没有一劳永逸的方法呢?

答案是 yes :)

确认打开 ACL 支持

  1. 确认文件系统打开了 ACL。设 /path/to/project1 所在的设备为 /dev/sdz1,如果从
    tune2fs -l /dev/sdz1 | grep 'Default mount options'

    的输出中看到了 acl,那么 ACL 已经开启了。如果没有,使用

    tune2fs -o acl /dev/sdz1
    打开 ACL 支持。
  2. 确认在挂载选项中打开 ACL。检查
    mount
    命令的输出,/dev/sdz1 一行信息中有 acl 这个挂载选项的话,那么 acl 就是开启的。如果没有开启,用
    mount -oremount,acl /mount/point/to/dev/sdz1

    打开。并且把 acl 写到 /etc/fstab 中对应挂载点的配置中。

OK 下面开始正式为协作目录设置 ACL 权限。首先,给目录加上 SGID 属性。这个属性的意思是说:这个目录的所属组会被它下面创建的文件继承。

# chmod g+s /path/to/project1

然后设置这个目录的“默认权限”:

# setfacl -d -m g::rwX /path/to/project1 # -d 表示 default -m 表示“mode”

或者这样:

# setfacl -m d:g::rwX /path/to/project1

此后,在这个目录中创建的文件将具有和目录相同的所属组,同时对于组是可写的。

快快在 TUNA 的服务器上们推广吧~~~~

关于最后用到的 setfacl 命令:这是 POSIX ACL 的一个工具;Debian 的主机上需要先安装包 acl 才会有这个命令。 POSIX ACL 对传统 UNIX 文件权限系统的一个扩展。它的语法就像上面的 g::rwX。参考 [1] [2]。

参考

1. http://www.suse.de/~agruen/acl/linux-acls/online/

2. http://en.wikipedia.org/wiki/Access_control_list#Filesystem_ACLs

3. Xin Yue 在邮件列表的回复

4. 著名入门指导书 http://vbird.dic.ksu.edu.tw/linux_basic/0220filemanager.php#sgid


CategoryHowto

AclHowto (2011-10-31 13:39:07由xiaq编辑)