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

前提条件

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

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

背景信息

您可以使用NFSv4协议挂载文件系统,并在已挂载文件系统的机器上安装符合Linux标准的nfs4-acl-tools软件。安装完成后,通过标准工具nfs4_getfaclnfs4_setfacl设置NFSv4 ACL。

命令说明

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

命令 说明
nfs4_getfacl <filename> 查看文件当前的ACL权限。
nfs4_setfacl -a A::GROUP@:W <filename> 给GROUP设置写权限。
nfs4_setfacl -a A::1000:W <filename> 给用户1000设置写权限。
nfs4_setfacl -a A:g:10001:W <filename> 给用户组10001设置写权限。
nfs4_setfacl -e <filename> 交互式编辑设置ACL权限。
nfs4_getfacl <filename> > saved_acl.txt 将文件当前的ACL权限保存为一个文本文件。
nfs4_setfacl -S saved_acl.txt <filename> 恢复保存到文本文件里的ACL权限。
nfs4_setfacl -m A::1001:rwaxTNcCy A::1001:rxtcy file1 修改文件file1上的其中一条ACE的权限。
nfs4_getfacl file1 | nfs4_setfacl -S - file2 将文件file1的ACL权限复制到文件file2上。
nfs4_getfacl file1 | grep @ | nfs4_setfacl -S - file1 删除文件file1上所有非保留的ACE。
nfs4_setfacl -R -a A:g:10001:rW dir 对目录树dir下所有文件和目录,增加用户组10001可以读写访问的权限。
find dir -type f -exec sh -c 'for ace in $(nfs4_getfacl \{} | grep "^A.*\:1005\:"); do nfs4_setfacl -x $ace \{}; done' \; 删除目录树dir下所有文件中包含1005的ACE。
nfs4_setfacl -a A:fdg:10001:rW dir1 让用户组10001对目录dir1下新创建的文件和目录有读写权限。
nfs4_setfacl -a A:fg:10001:rx dir1 让用户组10001对目录dir1下新创建的文件有读和执行权限。

操作步骤

您可以参考以下步骤,为目录或文件设置NFSv4 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. 安装NFSv4 ACL工具。

    如果已安装NFSv4 ACL工具,请跳过此步骤。

    sudo yum -y install nfs4-acl-tools
  3. 获取用户群组players和adminis的id。
    打开/etc/group文件,获取用户群组players和adminis的id,如下所示。
    players:x:19064:player
    adminis:x:19065:admini
  4. 对目录和文件设置NFSv4 ACL。
    本文假设创建目录dir0,针对目录dir0中的所有文件,授予群组players只读权限,授予群组adminis读写执行权限,不授予其他用户权限。
    sudo umask 777
    sudo mkdir dir0
    sudo nfs4_setfacl -a A:fdg:19064:RX dir0
    sudo nfs4_setfacl -a A:fdg:19065:RWX dir0
    sudo nfs4_setfacl -a A:fdg:OWNER@: dir0
    sudo nfs4_setfacl -a A:fdg:GROUP@: dir0
    sudo nfs4_setfacl -a A:fdg:EVERYONE@: dir0
    设置完成后,可执行sudo nfs4_getfacl dir0查看设置结果。
    A::OWNER@:tTnNcCy
    A::GROUP@:tncy
    A::EVERYONE@:tncy
    A:fdi:EVERYONE@:tncy
    A:fdi:OWNER@:tTnNcCy
    A:fdi:GROUP@:tncy
    A:g:19064:rxtncy
    A:g:19065:rwaDxtTnNcCy
    A:fdig:19064:rxtncy
    A:fdig:19065:rwaDxtTnNcCy
  5. 验证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 'echo 456 >> dir0/file'
      bash: dir0/file: Permission denied
      [root@vbox test] sudo su player -c 'cat dir0/file'
      123
      [root@vbox test] sudo su player -c 'nfs4_getfacl dir0/file'
      A::OWNER@:tTnNcCy
      A::GROUP@:tncy
      A::EVERYONE@:tncy
      A:g:19064:rxtncy
      A:g:19065:rwaxtTnNcCy
    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 'nfs4_getfacl dir0/file'
      Invalid filename: di

相关操作

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

建议在使用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=1054(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 'nfs4_getfacl dir0/file'
Invalid filename: dir0/file