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

NAS NFSv4 ACL特性

  • ACE类型只支持Allow,不支持Deny、AuditAlarm。

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

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

  • 未设置ACL的文件或目录会呈现与mode对应的默认ACL。示例如下:

    1. 执行touch file命令,进入file文件。

    2. 执行ls -l file命令,查看file文件的权限。

      -rw-r--r--. 1 root root 0 May 6 14:27 file
    3. 执行nfs4_getfacl file命令,查看file文件当前的ACL权限。

      # file: file
      A::OWNER@:rwatTnNcCy
      A::GROUP@:rtncy
      A::EVERYONE@:rtncy
  • ACE按照一定顺序排列并去重,使ACL显示结果更清晰易懂。

    用户增加或修改ACE时,如果ACL中已经存在继承类型完全的ACE,则新的ACE会和旧的ACEAllow bits进行合并。 例如:

    • 排序时owner、group、everyone对应的ACE总是排在最前面。

      您可执行nfs4_getfacl file命令,查看file文件ACL权限顺序。

      # file: file
      A::OWNER@:rwaxtTnNcCy
      A::GROUP@:rtncy
      A::EVERYONE@:rtncy
      A::1001:rwaxtTNcCy
    • 为用户1009增加一条读写权限的ACE,按照顺序排序后排在用户1001后面。

      • 执行命令

        nfs4_setfacl -a A::1009:X file
        nfs4_getfacl file
      • 返回示例

        # file: file
        A::OWNER@:rwaxtTcCy
        A::GROUP@:rwatcy
        A::EVERYONE@:tcy
        A::1001:rwaxtTNcCy
        A::1009:waxtTncCy
    • 为用户1009增加执行权限的ACE,系统自动将新增的执行权限合并到用户1009已有的ACE中。

      • 执行命令

        nfs4_setfacl -a A::1009:W file
        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,并将两个ACEACL中同继承类型的ACE进行合并。

      • 执行命令

        nfs4_setfacl -a A:fd:1009:R file
        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不能访问。

      • 执行命令

        nfs4_getfacl dir
      • 返回示例

        # file: dir
        A::OWNER@:rwaDxtTnNcCy
        A::GROUP@:rxtcy
        A::EVERYONE@:tncy
    2. 给用户1000增加读写权限并且可继承。

      • 执行命令

        nfs4_setfacl -a A:fd:1000:rwx dir
        nfs4_getfacl dir
      • 返回示例

        # file: dir
        A::OWNER@:rwaDxtTcCy
        A::GROUP@:rxtcy
        A::EVERYONE@:tcy
        A::1000:rwx
        A:fdi:1000:rwx
    3. 在目录dir下创建的文件或目录就自动带有继承的ACE。

      • 在目录dir下创建文件

        • 执行命令

          touch dir/file
          nfs4_getfacl dir/file
        • 返回示例

          # file: dir/file
          A::OWNER@:rwatTcCy
          A::GROUP@:rwatcy
          A::EVERYONE@:rwatcy
          A::1000:rwx
      • 在目录dir下创建目录

        • 执行命令

          mkdir dir/subdir
          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,而按照协议如果修改了groupmode,需要保证所有群组的ACE都小于等于group mode的权限。而这会导致群组的继承失效。例如:子文件原本要继承Group A: RWX,但是默认传入的modeGROUPS: R,则子文件的Group AACE会变成Group A: R。为了规避该问题,实际情况下mode不会修改ACLowner、group、everyone之外的其他群组,语义更简单。需要移除某个群组的权限可以直接删除对应的ACE。

  • 多个机器间的用户名与UIDGID的映射需要自行维护。

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

  • 支持通过Extended Attributes输出NFSv4 ACL。

    • 执行命令

      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拷贝file1file2时拷贝了ACL。 cp -ar dir1 dir2拷贝dir1dir2时拷贝了ACL。

    说明

    rsync工具可能由于版本低于3.1.2而不能迁移NFSv4 ACL。

    • 示例一:迁移文件ACL。

      1. 执行nfs4_getfacl file1命令,查看file1文件的ACL权限。

        # file: file1
        A::OWNER@:rwatTcCy
        A::GROUP@:rwatcy
        A::EVERYONE@:rwatcy
        A::1000:rtncy
      2. 执行cp --preserve=xattr file1 file2命令,拷贝file1 ACLfile2。

      3. 执行nfs4_getfacl file2命令,查看file2文件的ACL权限。

        # file: file2
        A::OWNER@:rwatTcCy
        A::GROUP@:rwatcy
        A::EVERYONE@:rwatcy
        A::1000:rtncy
    • 示例二:迁移目录ACL。

      1. 执行nfs4_getfacl dir1命令,查看dir1目录的ACL权限。

        # file: dir1
        A::OWNER@:rwaDxtTnNcCy
        A::GROUP@:rxtncy
        A::EVERYONE@:rxtncy
        A::1000:rxtncy
      2. 执行cp -ar dir1 dir2命令,拷贝dir1 ACLdir2。

      3. 执行nfs4_getfacl dir2命令,查看dir2目录的ACL权限。

        # file: dir2
        A::OWNER@:rwaDxtTnNcCy
        A::GROUP@:rxtncy
        A::EVERYONE@:rxtncy
        A::1000:rxtncy
  • 支持NFSv4 ACLmode之间的互操作,修改ACL可能引起mode的改变,反之亦然。

    例如,文件file当前mode0666,则文件权限和ACL权限示例如下。

    • 执行ls -l file命令,查看file文件权限。

      -rw-rw-rw-. 1 root root 0 May 3 2019 file
    • 执行nfs4_getfacl file命令,查看file文件的ACL权限。

      # file: file
      A::OWNER@:rwatTcCy
      A::GROUP@:rwatcy
      A::EVERYONE@:rwatcy

    通过设置modeowner增加执行权限,相应ACE也会增加执行权限。示例如下:

    1. 执行chmod u+x file命令,给owner增加执行权限。

    2. 执行ls -l file命令,查看文件权限。

      -rwxrw-rw-. 1 root root 0 May 3 2019 file
    3. 执行nfs4_getfacl file命令,确认owner已增加执行权限。

      # file: file
      A::OWNER@:rwaxtTcCy
      A::GROUP@:rwatcy
      A::EVERYONE@:rwatcy

    通过设置ACEgroup增加执行权限,相应mode也会增加执行权限。

    1. 执行nfs4_setfacl -a A::GROUP@:x file命令,给group增加执行权限。

    2. 执行ls -l file命令,查看file文件权限。

      -rwxrwxrw-. 1 root root 0 May 3 2019 file
    说明
    • 在互操作中ACLeveryoneUNIX mode中的other等价,修改mode other会直接修改ACE EVERYONE,这对权限语义有轻微的影响。例如:当前moderw-------,执行chmod o+r后,所有人包括ownergroup会获得读权限,因为ACE EVERYONE + r;而在纯UNIX mode的模式下ownergroup仍然没有读权限。

    • 在没有设置过NFSv4 ACL时,mode other仍然保持other的语义。设置过NFSv4 ACL后,mode other将变成everyone的语义并保持everyone语义。强烈建议在使用NFSv4 ACL之后请勿使用mode。

  • modeNFSv4 ACL权限的对应关系。

    • 执行chmod命令改变mode时,NFSv4 ACL就会如下表中的对应改变。

      other

      mode other

      NFSv4 ACL EVERYONE on file

      NFSv4 ACL EVERYONE on dir

      ---

      A::EVERYONE@:tncy

      A::EVERYONE@:tncy

      --x

      A::EVERYONE@:xtncy

      A::EVERYONE@:xtncy

      -w-

      A::EVERYONE@:watncy

      A::EVERYONE@:waDtncy

      -wx

      A::EVERYONE@:waxtncy

      A::EVERYONE@:waDxtncy

      r--

      A::EVERYONE@:rtncy

      A::EVERYONE@:rtncy

      r-x

      A::EVERYONE@:rxtncy

      A::EVERYONE@:rxtncy

      rw-

      A::EVERYONE@:rwatncy

      A::EVERYONE@:rwaDtncy

      rwx

      A::EVERYONE@:rwaxtncy

      A::EVERYONE@:rwaDxtncy

      group

      mode group

      NFSv4 ACL GROUP on file

      NFSv4 ACL GROUP on dir

      ---

      A::GROUP@:tncy

      A::GROUP@:tncy

      --x

      A::GROUP@:xtncy

      A::GROUP@:xtncy

      -w-

      A::GROUP@:watncy

      A::GROUP@:waDtncy

      -wx

      A::GROUP@:waxtncy

      A::GROUP@:waDxtncy

      r--

      A::GROUP@:rtncy

      A::GROUP@:rtncy

      r-x

      A::GROUP@:rxtncy

      A::GROUP@:rxtncy

      rw-

      A::GROUP@:rwatncy

      A::GROUP@:rwaDtncy

      rwx

      A::GROUP@:rwaxtncy

      A::GROUP@:rwaDxtncy

      owner

      mode owner

      NFSv4 ACL OWNER on file

      NFSv4 ACL OWNER on dir

      ---

      A::OWNER@:tTnNcCy

      A::OWNER@:tTnNcCy

      --x

      A::OWNER@:xtTnNcCy

      A::OWNER@:xtTnNcCy

      -w-

      A::OWNER@:watTnNcCy

      A::OWNER@:waDtTnNcCy

      -wx

      A::OWNER@:waxtTnNcCy

      A::OWNER@:waDxtTnNcCy

      r--

      A::OWNER@:rtTnNcCy

      A::OWNER@:rtTnNcCy

      r-x

      A::OWNER@:rxtTnNcCy

      A::OWNER@:rxtTnNcCy

      rw-

      A::OWNER@:rwatTnNcCy

      A::OWNER@:rwaDtTnNcCy

      rwx

      A::OWNER@:rwaxtTnNcCy

      A::OWNER@:rwaDxtTnNcCy

    • 执行nfs4_setfacl命令改变NFSv4 ACL时,如果修改的是文件权限,且NFSv4 ACL属性wa不全都存在,则mode不会显示w属性。

    • 执行nfs4_setfacl命令改变NFSv4 ACL时,如果修改的是目录权限,NFSv4 ACL属性waD不全都存在,则mode不会显示w属性。

    • 如果目录NFSv4 ACLDx权限,此时mode显示没有w属性,但是目录可以进行子文件子目录创建和删除动作,相当于有modewx属性。

    • nfs4_setfacl时最好使用大写RWX设置权限。大写RWX会自动对应到moderwx,避免NFSv4 ACLmode的兼容问题。

    NFSv4 ACL支持比mode更丰富的权限定义,每个权限位有不同的功能。实际上某些权限功能需要多个权限位同时存在才能起效,某些权限位代表的功能需要其他权限位来表达。对于文件和目录,同样的权限位也可能有不同的功能。文件和目录的NFSv4 ACL权限请参见NFSv4 ACL

    说明
    • 默认OWNER最小权限为:tTnNcCy,不允许少于这个权限。

    • 默认GROUPEVERYONE最小权限为:tncy,不允许少于这个权限。

  • 支持NFSv4 ACLPOSIX ACL的互操作。

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

    说明

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

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

    • 执行命令,获取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

    POSIX ACLdir0权限示例如下。

    • 执行命令

      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权限如下。

    • 执行命令

      sudo nfs4_getfacl dir0/file
    • 返回示例

      A::OWNER@:tTnNcCy
      A::GROUP@:tncy
      A::EVERYONE@:tncy
      A:g:19064:rxtncy
      A:g:19065:rwaxtTnNcCy

    POSIX ACLdir0/file权限如下。

    • 执行命令

      sudo getfacl dir0/file
    • 返回示例

      user::---
      group::---
      group:players:r-x
      group:adminis:rwx
      mask::rwx
      other::---
  • NFSv4 ACL数量限制。

    默认情况下,阿里云NAS支持每个文件系统里不完全相同的ACL的数量上限为10万个,每个ACLACE数量上限为500个。

    说明

    使用时请勿滥用ACLACE,减少权限判断时占用的时间和资源。

NAS POSIX ACL特性

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

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

    说明

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

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

    • 执行命令

      getfacl myfile
    • 返回信息

      # file: myfile
      # owner: root
      # group: root
      user::rw-
      user:alice:r--
      group::r--
      mask::r--
      other::rw-
  • 执行chmod命令不会修改非modeACE。

    说明

    对于设置了POSIX ACL的文件尽量避免修改mode,请使用修改ACL的方式设置权限。

    例如,myfile文件中有一条ACE为群组players赋予读写权限。示例如下:

    • 执行命令

      getfacl myfile
    • 返回信息

      # file: myfile
      # owner: root
      # group: root
      user::rw-
      user:player:rw-
      group::rw-
      group:players:rw-
      mask::rw-
      other::---

    执行chmod g-w myfilechmod u-w myfile后,并不会修改用户player和群组players的权限。这与POSIX ACL规范相比有差异,但是可以保证修改mode不会影响POSIX ACL设置的非通用用户和群组的权限。示例如下:

    • 执行命令

      getfacl myfile
    • 返回信息

      # file: myfile
      # owner: root
      # group: root
      user::r--
      user:player:rw-
      group::r--
      group:players:rw-
      mask::rw-
      other::---
  • 如果文件中的groupother都没有执行权限(x),那么ACE中的执行权限也不起作用。

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

    例如,myfile文件中的groupother都没有执行权限,则用户player也不能执行该文件。示例如下:

    • 执行命令

      getfacl myfile
    • 返回信息

      # file: myfile
      # owner: root
      # group: root
      user::rw-
      user:player:r-x
      group::r--
      mask::r-x
      other::r--

    如果group有了执行权限,那么用户player也有执行权限。示例如下:

    • 执行命令

      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是文件和目录均继承。

    说明

    建议您避免混用NFSv4 ACLPOSIX ACL,一个文件系统只使用一种NFS版本进行挂载。

  • 不支持修改Mask值。

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

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

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

  • 支持通过Extended Attributes输出POSIX ACL。

    • 执行命令

      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拷贝file1file2时拷贝了ACL。cp -ar dir1 dir2拷贝dir1dir2时拷贝了ACL。

    说明

    rsync工具可能由于版本低于3.1.2而不能迁移POSIX ACL。

    • 示例一:迁移文件ACL权限。

      1. 执行getfacl file1命令,查看file1文件的ACL权限。

        # file: file1
        # owner: root
        # group: root
        user::rw-
        user:player:r--
        group::r--
        mask::r--
        other::r--
      2. 执行cp --preserve=xattr file1 file2命令,拷贝file1 ACLfile2。

      3. 执行getfacl file2命令,查看file2ACL权限。

        # file: file2
        # owner: root
        # group: root
        user::rw-
        user:player:r--
        group::r--
        mask::r--
        other::r--
    • 示例二:迁移目录ACL。

      1. 执行getfacl dir1命令,查看dir1ACL权限。

        # file: dir1
        # owner: root
        # group: root
        user::rwx
        user:player:r-x
        group::r-x
        mask::r-x
        other::r-x
      2. 执行cp -ar dir1 dir2命令,拷贝dir1 ACLdir2。

      3. 执行getfacl dir2命令,查看dir2ACL权限。

        # file: dir2
        # owner: root
        # group: root
        user::rwx
        user:player:r-x
        group::r-x
        mask::r-x
        other::r-x
  • POSIX ACL数量限制。

    默认情况下,阿里云NAS支持每个文件系统里不完全相同的ACL的数量上限为10万个,每个ACLACE数量上限为500个。

    说明

    使用时请勿滥用ACLACE,减少权限判断时占用的时间和资源。

常见问题

为什么ACE类型不支持Deny?

  • ACEACL中的位置起决定性作用。

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

    说明

    您在设置ACL时,需要非常注意ACE的位置。

  • ACL中的ACE数量急剧膨胀。

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

  • 因为mode没有Deny功能,如果使用Deny会使ACLmode的互操作变得更复杂。

    • 在有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可以排序和去重并且不区分everyoneother;如果mode发生变化,修改ACL也非常方便,只需找到owner、group、everyone所在ACE并改成如下内容即可。

      A::OWNER@:rw
      A::GROUP@:rw
      A::EVERYONE@:rw
  • NFSv4 ACLPOSIX ACL无法互相转换。

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