Linux下Access Control List (ACL) 的简单设置

Linux下标准的文件权限管理大致基于这么一个比较简单的模式:

  • 任何一个文件都有三个权限:可读,可写,可执行,记号分别是r, w, x。
  • 文件属性有三个级别:用户,群,全体;每个级别分别可以有不同的上述权限。

用=ls -l=命令可以看一个文件的这些权限,比如说:

-rwxrwxr-x 1 qiuxing compbio  556 Mar 30  2010 README.TXT

这说明=README.TXT=这个文件的创建用户为=qiuxing=, 群为=compbio=; 最前面的 rwxrwxr-x 说明用户 qiuxing (头三个字母)和群 compbio 都对这个文件拥有读写执行权限,但其他用户(最后三个字母)只拥有读和执行权限,不能写它。

现在假设我要和别人共享文件(比如说通过FTP server),那么标准的做法是这样子的:

  1. 新建一个群,比如说 ftpuser. 然后把所有要和我共享文件的用户都加入这个群。这个现在都可以通过图形化界面来干了。
  2. 把共享目录(比如说 /var/data )的所有文件的群都设成 ftpuser, 权限都设置成比如说群可读写。另外还要注意一点,所有的目录都得设置成群 可执行, 否则别人没法 cd 进去。
    sudo chgrp -R ftpuser /var/data
    sudo chmod -R 775 ftpuser /var/data
    

但这样做还有一点点问题。每次任何一个用户在 /var/data 下新生成的文件缺省属性都是这样的: 文件的群属性为该用户的主要群(在大部分Linux上这个群要么叫做users, 要么干脆就和用户名一样),权限为用户本人可读写,所有别人可读。这样每次生成一个文件都要改属性,很不方便。

所以我们应该让 /var/data 下的新生成文件缺省群属性为 ftpuser, 权限为群可读可写可执行。方法是 1. set group ID; 2. acl.

用root身份执行

find /var/data -type d -exec chmod g+s '{}' \;

这行命令把 /var/data 下所有的目录均 setgid 成 ftpuser, 这样在它们里面生成的任何文件缺省群为 ftpuser.

关于acl.

  1. Ubuntu下access control tool 可以如下安装:
    sudo apt-get install acl
    
  2. ACL是在文件系统级别上实现的。所以装上了之后得要让文件系统知道有这么回事。改你的 /etc/fstab, 在mount选项上加上acl这个参数:
    # <file system>  <mount point>     <type>  <options>   <dump>  <pass>
    /dev/sdb1        /var              ext3    defaults,acl   0       0
    

    然后重新mount一下:

    sudo mount -o remount,acl /var
    
  3. setfacl 来改属性
    sudo setfacl -d -m g:ftpuser:rwx /var/data
    

    这行命令具体什么意思,还有 setfacl 别的用法,请参看 BeginLinux.com 的文章。

高级问题:为什么不用 umask? 如果你去google, 会发现很多老一点的设置缺省权限的方法都基于 umask. 但是在shell 的配置文件里改 umask 值的后果是该用户创建的 所有 文件都变成这个属性了,这往往不是我们想要的效果。

, ,

  1. 发表评论

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: