本文介绍NFSv4 ACL和POSIX ACL相关的特性。

说明 目前,ACL功能只支持华北 3(张家口)、华北 5(呼和浩特)、亚太东南 2(悉尼)、亚太东南 3(吉隆坡)和美国西部 1(硅谷)地域,并且需要通过提交工单申请后才能使用。

NAS NFSv4 ACL特性

  • ACE类型只支持Allow,不支持Deny、Audit和Alarm。

    Deny ACE会极大增加权限设置的复杂性,容易给用户造成混淆而留下安全问题。业界已达成共识应尽量避免使用Deny ACE。不支持Deny ACE的详细介绍,请参见常见问题

    Audit ACE和Alarm ACE在阿里云NAS NFS上不起作用。如果需要审计和报警功能,可以在阿里云控制台上进行配置。

  • 未设置ACL的文件或目录会呈现与之mode对应的缺省ACL。
    touch file
    [root@vbox test]# ls -l file
    -rw-r--r--. 1 root root 0 May  6 14:27 file
    [root@vbox test]# nfs4_getfacl file
    # file: file
    A::OWNER@:rwatTnNcCy
    A::GROUP@:rtncy
    A::EVERYONE@:rtncy
  • ACE按照一定顺序排列并去重,使ACL显示结果更清晰易懂。
    用户增加或修改ACE时,如果ACL中已经存在继承类型完全的ACE,则新的ACE会和旧的ACE的Allow bits进行合并。 例如:
    • 排序时owner、group、everyone对应的ACE总是排在最前面。
      [root@vbox test]# nfs4_getfacl file
      # file: file
      A::OWNER@:rwaxtTnNcCy
      A::GROUP@:rtncy
      A::EVERYONE@:rtncy
      A::1001:rwaxtTNcCy
    • 为用户1009增加一条读写权限的ACE,按照顺序排序后排在用户1001后面。
      [root@vbox test]# nfs4_setfacl -a A::1009:X file
      [root@vbox test]# nfs4_getfacl file
      # file: file
      A::OWNER@:rwaxtTcCy
      A::GROUP@:rwatcy
      A::EVERYONE@:tcy
      A::1001:rwaxtTNcCy
      A::1009:xtcy
    • 为用户1009增加执行权限的ACE,系统自动将新增的执行权限合并到用户1009已有的ACE中。
      [root@vbox test]# nfs4_setfacl -a A::1009:W file
      [root@vbox test]# nfs4_getfacl file
      # file: file
      A::OWNER@:rwaxtTcCy
      A::GROUP@:rwatcy
      A::EVERYONE@:tcy
      A::1001:rwaxtTNcCy
      A::1009:waxtTncCy
    • 为用户1009增加fd继承权限的ACE,系统会将它拆分为只拥有继承能力的ACE和只对本文件起作用的ACE,并将两个ACE与ACL中同继承类型的ACE进行合并。
      [root@vbox test]# nfs4_setfacl -a A:fd:1009:R file
      [root@vbox test]# nfs4_getfacl file
      # file: file
      A::OWNER@:rwaxtTcCy
      A::GROUP@:rwatcy
      A::EVERYONE@:tcy
      A::1001:rwaxtTNcCy
      A::1009:rwaxtTNcCy
      A:fdi:1009:r
  • 支持所有继承特性。
    1. 假设当前目录dir的权限是owner可写,group可读,everyone不能访问。
      [root@vbox nfs]# nfs4_getfacl dir
      # file: dir
      A::OWNER@:rwaDxtTnNcCy
      A::GROUP@:rxtcy
      A::EVERYONE@:tncy
    2. 给用户1000增加读写权限并且可继承。
      [root@vbox nfs]# nfs4_setfacl -a A:fd:1000:rwx dir
      [root@vbox nfs]# nfs4_getfacl dir
      # file: dir
      A::OWNER@:rwaDxtTcCy
      A::GROUP@:rxtcy
      A::EVERYONE@:tcy
      A::1000:rwx
      A:fdi:1000:rwx
    3. 在目录dir下创建的文件或目录就自动带有继承的ACE。
      [root@vbox nfs]# touch dir/file
      [root@vbox nfs]# nfs4_getfacl dir/file
      # file: dir/file
      A::OWNER@:rwatTcCy
      A::GROUP@:rwatcy
      A::EVERYONE@:rwatcy
      A::1000:rwx
      [root@vbox nfs]# mkdir dir/subdir
      [root@vbox nfs]# nfs4_getfacl dir/subdir
      # file: dir/subdir
      A::OWNER@:rwaDxtTcCy
      A::GROUP@:rwaDxtcy
      A::EVERYONE@:rwaDxtcy
      A:fdi:1000:rwx
    说明
    • 建议EVERYONE权限尽量小。在执行相应的代码前请先执行umask 777,这样创建文件/目录时传入的mode会变成000,可以让默认的权限最小化,详情请参见umask与默认mode
    • Linux文件/目录的系统调用,默认会传入mode作为参数。按照RFC7530协议标准,需要在继承ACL之后再叠加上mode操作修改ACL,而按照协议如果修改了group的mode,需要保证所有群组的ACE都小于等于group mode的权限。而这会导致群组的继承失效。例如:子文件原本要继承Group A: RWX,但是默认传入的mode是GROUPS: R,则子文件的Group A的ACE会变成Group A: R。为了规避该问题,实际情况下mode不会修改ACL除owner、group、everyone之外的其他群组,语义更简单。需要移除某个群组的权限可以直接删除对应的ACE。
  • 多个机器间的用户名与UID/GID的映射需要自行维护。

    目前阿里云NAS NFS鉴权采用的是IP安全组,不支持用户名鉴权。用户设置的NFSv4 ACL在后端存储的是UID/GID的ACE,在NFSv4 ACL客户端显示时会自动加载本地的/etc/passwd将UID/GID转化成用户名/群组名。您需要管理多个机器间的用户名与UID/GID之间的映射,确保同一个用户名/群组名映射到相同的UID/GID,以免发生错误。

  • 支持通过Extended Attributes输出NFSv4 ACL。
    [root@vbox nfs]# getfattr -n system.nfs4_acl file
    # file: file
    system.nfs4_acl=0sAAAABgAAAAAAAAAAABYBhwAAAAZPV05FUkAAAAAAAAAAAAAAABIAhwAAAAZHUk9VUEAAAAAAAAAAAAAAABIAhwAAAAlFVkVSWU9ORUAAAAAAAAAAAAAAAAAAAAEAAAAEMTAwMAAAAAAAAAALAAAAAwAAAAQxMDAwAAAAAAAAAEAAFgGQAAAABTEwMDAxAAAA
  • 支持cp等工具迁移NFSv4 ACL。

    阿里云NAS支持使用Redhat NFSv4 ACL迁移工具说明中提到的cp、tar、rsync工具迁移NFSv4 ACL。

    下面例子中cp --preserve=xattr file1 file2拷贝file1到file2时拷贝了ACL。 cp -ar dir1 dir2拷贝dir1到dir2时拷贝了ACL。
    说明 rsync工具可能由于版本低于3.1.2而不能迁移NFSv4 ACL。
    [root@vbox nfs]# nfs4_getfacl file1
    # file: file1
    A::OWNER@:rwatTcCy
    A::GROUP@:rwatcy
    A::EVERYONE@:rwatcy
    A::1000:rtncy
    [root@vbox nfs]# cp --preserve=xattr file1 file2
    [root@vbox nfs]# nfs4_getfacl file2
    # file: file2
    A::OWNER@:rwatTcCy
    A::GROUP@:rwatcy
    A::EVERYONE@:rwatcy
    A::1000:rtncy
    [root@vbox nfs]# cp -ar dir1 dir2
  • 支持NFSv4 ACL和mode之间的互操作,修改ACL可能引起mode的改变,反之亦然。
    例如文件file当前mode为0666。
    [root@vbox nfs]# ls -l file
    -rw-rw-rw-. 1 root root 0 May  3  2019 file
    [root@vbox nfs]# nfs4_getfacl file
    # file: file
    A::OWNER@:rwatTcCy
    A::GROUP@:rwatcy
    A::EVERYONE@:rwatcy
    • 通过设置mode给owner增加执行权限,相应ACE也会增加执行权限。
      [root@vbox nfs]# chmod u+x file
      [root@vbox nfs]# ls -l file
      -rwxrw-rw-. 1 root root 0 May  3  2019 file
      [root@vbox nfs]# nfs4_getfacl file
      # file: file
      A::OWNER@:rwaxtTcCy
      A::GROUP@:rwatcy
      A::EVERYONE@:rwatcy
    • 通过设置ACE给group增加执行权限,相应mode也会增加执行权限。
      [root@vbox nfs]# nfs4_setfacl -a A::GROUP@:x file
      [root@vbox nfs]# ls -l file
      -rwxrwxrw-. 1 root root 0 May  3  2019 file
    说明
    • 在互操作中ACL的everyone和UNIX mode中的other等价,修改mode other会直接修改ACE EVERYONE,这对权限语义有轻微的影响。例如:当前mode为rw-------,执行chmod o+r后,所有人包括owner和group会获得读权限,因为ACE EVERYONE + r;而在纯UNIX mode的模式下owner和group仍然没有读权限。
    • 在没有设置过NFSv4 ACL时,mode other仍然保持other的语义。设置过NFSv4 ACL后,mode other将变成everyone的语义并保持everyone语义。强烈建议在使用NFSv4 ACL之后请勿使用mode。
  • 支持NFSv4 ACL和POSIX ACL的互操作。

    可以使用NFSv3协议挂载含有NFSv4 ACL的文件系统,挂载后NFSv4 ACL会被转化为POSIX ACL。也可以用NFSv4协议挂载含有POSIX ACL的文件系统,挂载后POSIX ACL会被转化为NFSv4 ACL。

    说明 由于POSIX ACL和NFSv4 ACL的语义不完全相同。例如:POSIX ACL继承不区分文件和目录,POSIX ACL的权限只有rwx而NFSv4 ACL更丰富。强烈建议只使用NFSv4 ACL或者只使用POSIX ACL,尽量避免混用。

    假设用NFSv4 ACL设置了dir0,权限如下。

    [root@vbox test] 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

    POSIX ACL的dir0权限如下。

    [root@vbox test] sudo getfacl dir0
    user::---
    group::---
    group:players:r-x
    group:adminis:rwx
    mask::rwx
    other::---
    default:user::---
    default:group::---
    default:group:players:r-x
    default:group:adminis:rwx
    default:mask::rwx
    default:other::---

    假设用NFSv4 ACL设置了dir0/file权限如下。

    [root@vbox test] sudo nfs4_getfacl dir0/file
    A::OWNER@:tTnNcCy
    A::GROUP@:tncy
    A::EVERYONE@:tncy
    A:g:19064:rxtncy
    A:g:19065:rwaxtTnNcCy

    POSIX ACL的dir0/file权限如下。

    [root@vbox test] sudo getfacl dir0/file
    user::---
    group::---
    group:players:r-x
    group:adminis:rwx
    mask::rwx
    other::---
  • NFSv4 ACL数量限制。
    默认情况下,阿里云NAS支持每个文件系统里不完全相同的ACL的数量上限为10万个,每个ACL中ACE数量上限为500个。
    说明 使用时请勿滥用ACL和ACE,减少权限判断时占用的时间和资源。

NAS POSIX ACL特性

  • other的权限适用于所有人。

    包括user、group和所有在ACE里出现的用户,等价于NFSv4 ACL的everyone。

    说明 强烈建议任何情况下只给other赋予最小权限。

    例如:myfile文件中有如下ACL。虽然包含alice的ACE中没有写权限,但因为other有写权限,所以用户alice也拥有写权限。

    [root@vbox 3]# getfacl myfile
    # file: myfile
    # owner: root
    # group: root
    user::rw-
    user:alice:r--
    group::r--
    mask::r--
    other::rw-
  • 执行chmod命令不会修改非mode的ACE。
    说明 对于设置了POSIX ACL的文件尽量避免修改mode,请使用修改ACL的方式设置权限。
    1. 例如:myfile文件中有一条ACE为赋予群组players读写权限。
      [root@vbox 3]# getfacl myfile
      # file: myfile
      # owner: root
      # group: root
      user::rw-
      user:player:rw-
      group::rw-
      group:players:rw-
      mask::rw-
      other::---
    2. 执行chmod g-w myfilechmod u-w myfile后,并不会修改用户player和群组players的权限。这与POSIX ACL规范相比有差异,但是可以保证修改mode不会影响POSIX ACL设置的非通用用户和群组的权限。
      [root@vbox 3]# getfacl myfile
      # file: myfile
      # owner: root
      # group: root
      user::r--
      user:player:rw-
      group::r--
      group:players:rw-
      mask::rw-
      other::---
  • 如果文件中的group和other都没有执行权限(x),那么ACE中的执行权限也不起作用。

    这是由客户的Linux系统决定的。虽然NAS服务端返回的是允许执行,但是NAS客户端要求group或者other必须带有执行权限才能真正允许执行。

    例如myfile文件中的group和other都没有执行权限,则用户player也不能执行该文件。

    [root@vbox 3]# getfacl myfile
    # file: myfile
    # owner: root
    # group: root
    user::rw-
    user:player:r-x
    group::r--
    mask::r-x
    other::r--
    如果group有了执行权限,那么用户player也有执行权限。
    [root@vbox 3]# getfacl myfile
    # file: myfile
    # owner: root
    # group: root
    user::rw-
    user:player:r-x
    group::r-x
    mask::r-x
    other::r--
  • 如果目录上设置了可继承的NFSv4 ACL,那么在NFSv3下此行为可能会不符合POSIX ACL标准。

    因为NFSv4 ACL继承可以分为文件继承和目录继承,而POSIX ACL是文件和目录均继承。

    说明 建议您避免混用NFS4 ACL和POSIX ACL,一个文件系统只使用一种NFS版本进行挂载。
  • 不支持修改Mask值。

    NAS POSIX ACL的Mask值由所有用户和群组的权限或操作产生,并无实际意义,也不会被修改。

  • 多个机器间的用户名与UID/GID的映射需要由您自己维护。

    目前阿里云NAS NFS鉴权采用的是IP安全组,不支持用户名鉴权。您设置的POSIX ACL在后端存储的是用户UID/GID的ACE,在POSIX ACL客户端显示时会自动加载本地的/etc/passwd将UID/GID转化成用户名/群组名。您需要管理多个机器间的用户名与UID/GID之间的映射,确保同一个用户名/群组名映射到相同的UID/GID,以免发生错误。

  • 支持通过Extended Attributes输出POSIX ACL。
    [root@vbox nfs]# getfattr -n system.posix_acl_access file
    # file: file
    system.posix_acl_access=0sAgAAAAEAAAD/////AgAFACAEAAAEAAAA/////xAABQD/////IAABAP////8=
  • 支持cp等工具迁移POSIX ACL。

    阿里云NAS支持使用Redhat NFSV4 ACL迁移工具说明中提到的cp、tar、rsync迁移POSIX ACL。

    下面例子中cp --preserve=xattr file1 file2拷贝file1到file2时拷贝了ACL。cp -ar dir1 dir2拷贝dir1到dir2时拷贝了ACL。
    说明 rsync工具可能由于版本低于3.1.2而不能迁移POSIX ACL。
    [root@vbox nfs]# getfacl file1
    user::---
    user:player:r-x
    group::---
    mask::r-x
    other::--x
    [root@vbox nfs]# cp --preserve=xattr file1 file2
    [root@vbox nfs]# getfacl file2
    # file: file2
    user::---
    user:player:r-x
    group::---
    mask::r-x
    other::--x
    [root@vbox nfs]# cp -ar dir1 dir2
  • POSIX ACL数量限制。
    默认情况下,阿里云NAS支持每个文件系统里不完全相同的ACL的数量上限为10万个,每个ACL中ACE数量上限为500个。
    说明 使用时请勿滥用ACL和ACE,减少权限判断时占用的时间和资源。

常见问题

为什么ACE类型不支持Deny?
  • ACE在ACL中的位置起决定性作用。

    NFSv4 ACL并不强制进行ACE排序,Deny可能被设置在任何位置。假设ACL有两个ACE(A::Alice:r和D::Alice:r),两个ACE的先后顺序会直接决定Alice是否具有读权限。

    说明 您在设置ACL时,需要非常注意ACE的位置。
  • ACL中的ACE数量急剧膨胀。

    因为没有强制进行ACE排序,ACL列表里的ACE难以合并和去重。长期往ACL里加ACE,可能膨胀到几十上百条ACE,在判断权限控制结果时需要扫描所有ACE,费时费力。

  • 因为mode没有Deny功能,如果使用Deny会使ACL与mode的互操作变得更复杂。
    • 在有Deny的情况下,如果mode发生变化,则可能需要往ACL中添加多条ACE。例如把mode改成-rw-rw-rw,则需要按顺序在ACL头部添加如下内容。
      A::OWNER@:rw
      D::OWNER@:x
      A::GROUP@:rw
      D::GROUP@:x
      A::EVERYONE@:rw
      D::EVERYONE@:x
    • 如果没有Deny,ACE可以排序和去重并且不区分everyone和other,如果mode发生变化,修改ACL也非常方便,只需找到owner、group、everyone所在ACE并改成如下内容即可。
      A::OWNER@:rw
      A::GROUP@:rw
      A::EVERYONE@:rw
  • NFSv4 ACL和POSIX ACL无法互相转化。

    POSIX ACL并不支持Deny,NFSv4 ACL如果包含Deny则无法转化为POSIX ACL。