全部產品
Search
文件中心

File Storage NAS:特性

更新時間:Jul 06, 2024

本文介紹NFSv4 ACL和POSIX ACL相關的特性。

NAS NFSv4 ACL特性

  • ACE類型只支援Allow,不支援Deny、Audit和Alarm。

    Deny ACE會極大增加使用權限設定的複雜性,容易給使用者造成混淆而留下安全問題。業界已達成共識應盡量避免使用Deny ACE。不支援Deny ACE的詳細介紹,請參見常見問題

    Audit ACE和Alarm 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會和舊的ACE的Allow 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,並將兩個ACE與ACL中同繼承類型的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,而按照協議如果修改了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。

    • 執行命令

      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。

    • 樣本一:遷移檔案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 ACL至file2。

      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 ACL至dir2。

      3. 執行nfs4_getfacl dir2命令,查看dir2目錄的ACL許可權。

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

    例如,檔案file當前mode為0666,則檔案許可權和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

    通過設定mode給owner增加執行許可權,相應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

    通過設定ACE給group增加執行許可權,相應mode也會增加執行許可權。

    1. 執行nfs4_setfacl -a A::GROUP@:x file命令,給group增加執行許可權。

    2. 執行ls -l file命令,查看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。

  • mode與NFSv4 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 ACL有Dx許可權,此時mode顯示沒有w屬性,但是目錄可以進行子檔案子目錄建立和刪除動作,相當於有mode的wx屬性。

    • nfs4_setfacl時最好使用大寫RWX設定許可權。大寫RWX會自動對應到mode的rwx,避免NFSv4 ACL和mode的相容問題。

    NFSv4 ACL支援比mode更豐富的許可權定義,每個許可權位有不同的功能。實際上某些許可權功能需要多個許可權位同時存在才能起效,某些許可權位代表的功能需要其他許可權位來表達。對於檔案和目錄,同樣的許可權位也可能有不同的功能。檔案和目錄的NFSv4 ACL許可權請參見NFSv4 ACL

    說明
    • 預設OWNER最小許可權為:tTnNcCy,不允許少於這個許可權。

    • 預設GROUP和EVERYONE最小許可權為:tncy,不允許少於這個許可權。

  • 支援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,許可權如下。

    • 執行命令,擷取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 ACL的dir0許可權樣本如下。

    • 執行命令

      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 ACL的dir0/file許可權如下。

    • 執行命令

      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也擁有寫入權限。樣本如下:

    • 執行命令

      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的方式設定許可權。

    例如,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::---
  • 如果檔案中的group和other都沒有執行許可權(x),那麼ACE中的執行許可權也不起作用。

    這是由客戶的Linux系統決定的。雖然NAS服務端返回的是允許執行,但是NAS用戶端要求group或者other必須帶有執行許可權才能真正允許執行。

    例如,myfile檔案中的group和other都沒有執行許可權,則使用者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 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。

    • 執行命令

      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。

    • 樣本一:遷移檔案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 ACL至file2。

      3. 執行getfacl file2命令,查看file2的ACL許可權。

        # file: file2
        # owner: root
        # group: root
        user::rw-
        user:player:r--
        group::r--
        mask::r--
        other::r--
    • 樣本二:遷移目錄ACL。

      1. 執行getfacl dir1命令,查看dir1的ACL許可權。

        # 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 ACL至dir2。

      3. 執行getfacl dir2命令,查看dir2的ACL許可權。

        # 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萬個,每個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。