本文介绍在使用NFSv3协议挂载的文件系统上,如何设置POSIX ACL来进行文件和目录权限管理。

前提条件

已使用NFSv3协议挂载文件系统,详情请参见挂载NFS文件系统
说明

目前,NFS ACL功能只支持亚太南部1(孟买)、中国香港(香港)、华东2(上海)、英国(伦敦)、欧洲中部 1(法兰克福)、西南1(成都)、亚太东南 2(悉尼)、亚太东南 5(雅加达)、美国东部1(硅谷)、美国西部1(弗吉尼亚)、华北3(张家口)、华东1(杭州)、华北5(呼和浩特)、华东2(北京)地域。如果您所在的区域还不支持NFS ACL功能,请提交工单

命令说明

在设置POSIX ACL前,请先熟悉相关操作命令。

命令 说明
getfacl <filename> 查看文件当前的ACL。
setfacl -m g::w <filename> 给GROUP设置写权限。
setfacl -m u:player:w <filename> 给用户player设置写权限。
setfacl -m g:players:rwx <filename> 给用户组players设置读写执行权限。
setfacl -x g:players <filename> 删除用户组players的权限。
getfacl file1 | setfacl --set-file=- file2 将文件file1的ACL复制到文件file2上。
setfacl -b file1 删除文件file1上的所有非mode的ACE。
setfacl -k file1 删除文件file1上的所有default的ACE。
setfacl -R -m g:players:rw dir 对目录树dir下的文件和目录增加用户组players读写的权限。
setfacl -d -m g:players:rw dir1 用户组players对目录dir1下新创建的文件和目录都有读写权限。

操作步骤

您可以参考以下步骤,为目录或文件设置NFS ACL实现权限管理。

  1. 创建用户和群组。

    本文假设创建普通用户player,属于普通用户群组players;管理员admini,属于管理员群组adminis;另外再创建一个用户anonym。

    sudo useradd player
    sudo groupadd players
    sudo usermod -g players player
    sudo useradd admini
    sudo groupadd adminis
    sudo usermod -g adminis admini
    sudo useradd anonym
  2. 对目录和文件设置POSIX ACL实现权限管理。

    本文假设创建目录dir0,针对目录dir0中的所有文件,授予players只读权限,授予adminis读写执行权限,不授予其他用户权限。

    sudo umask 777
    sudo mkdir dir0
    sudo setfacl -m g:players:r-x dir0
    sudo setfacl -m g:adminis:rwx dir0
    sudo setfacl -m u::--- dir0
    sudo setfacl -m g::--x dir0
    sudo setfacl -m o::--- dir0
    sudo setfacl -d -m g:players:r-x dir0
    sudo setfacl -d -m g:adminis:rwx dir0
    sudo setfacl -d -m u::--- dir0
    sudo setfacl -d -m g::--x dir0
    sudo setfacl -d -m o::--- dir0
    设置完成后,可执行sudo getfacl dir0查看设置结果。
    # file: dir0
    # owner: root
    # group: root
    user::---
    group::--x
    group:players:r-x
    group:adminis:rwx
    mask::rwx
    other::---
    default:user::---
    default:group::--x
    default:group:players:r-x
    default:group:adminis:rwx
    default:mask::rwx
    default:other::---
  3. 验证ACL设置结果。
    1. 验证用户admini具有读写权限。
      [root@vbox test] sudo su admini -c 'touch dir0/file'
      [root@vbox test] sudo su admini -c 'echo 123 > dir0/file'
    2. 验证用户player具有只读权限。
      [root@vbox test] sudo su player -c 'touch dir0/file'
      touch: cannot touch ‘dir0/file’: Permission denied
      [root@vbox test] sudo su player -c 'cat dir0/file'
      123
      [root@vbox test] sudo su player -c 'echo 456 >> dir0/file'
      bash: dir0/file: Permission denied
      [root@vbox test] sudo su player -c 'getfacl dir0/file'
      # file: dir0/file
      # owner: admini
      # group: adminis
      user::---
      group::---
      group:players:r-x
      group:adminis:rwx
      mask::rwx
      other::---
    3. 验证用户anonym无权限。
      [root@vbox test] sudo su anonym -c 'ls dir0'
      ls: cannot open directory dir0: Permission denied
      [root@vbox test] sudo su anonym -c 'cat dir0/file'
      cat: dir0/file: Permission denied
      [root@vbox test] sudo su anonym -c 'getfacl dir0/file'
      getfacl: dir0/file: Permission denied

相关操作

如果您要移除用户权限,可参见以下方法。

建议在使用NFSv4 ACL时,尽量把每个用户归类到群组中。在设置NFSv4 ACL时直接设置群组权限而不用设置单个用户的权限。这样在移除用户权限时只需把用户移出某个群组即可。例如:见以下命令将用户admini移出群组adminis,移入群组adminis2。

[root@vbox test] sudo groupadd adminis2
[root@vbox test] sudo usermod -g adminis2 admini
[root@vbox test] id admini
uid=1057(admini) gid=1057(admini) groups=1061(adminis2)
[root@vbox test] sudo su admini -c 'ls dir0'
ls: cannot open directory dir0: Permission denied
[root@vbox test] sudo su admini -c 'cat dir0/file'
cat: dir0/file: Permission denied
[root@vbox test] sudo su admini -c 'getfacl dir0/file'
getfacl: dir0/file: Permission denied