Azure Data Lake Storage Gen1 中的存取控制

Azure Data Lake Storage Gen1 實作的存取控制模型衍生自 HDFS,而 HDFS 又衍生自 POSIX 存取控制模型。 本文摘要說明 Data Lake Storage Gen1 存取控制模型的基本概念。

檔案和資料夾的存取控制清單

存取控制清單 (ACL) 有兩種類型,存取 ACL預設 ACL

  • 存取 ACL:這些控制物件的存取權。 檔案和資料夾均有存取 ACL。

  • 預設 ACL:與資料夾相關聯之 ACL 的「範本」,用以判斷再該資料夾下建立的任何子項目的存取 ACL。 檔案沒有預設 ACL。

存取 ACL 和預設 ACL 有相同的結構。

注意

變更父代的預設 ACL 並不會影響現存子項目的存取 ACL 或預設 ACL。

權限

檔案系統物件的權限為 [讀取]、[寫入] 和 [執行],這些權限可以用於下表所示的檔案和資料夾:

檔案 資料夾
讀取 (R) 可以讀取檔案的內容 需要 [讀取] 和 [執行] 才能列出資料夾內容
寫入 (W) 可寫入或附加至檔案 需要 [寫入] 和 [執行] 才能在資料夾中建立子項目
執行 (X) 不表示 Data Lake Storage Gen1 內容中的任何項目 需要周遊資料夾的子項目

權限的簡短形式

RWX 用來表示 [讀取 + 寫入 + 執行]。 有更壓縮的數字形式存在,其中 [讀取 = 4]、[寫入 = 2] 和 [執行 = 1],其總和代表各種權限。 以下有一些範例。

數值形式 簡短形式 代表的意義
7 RWX 讀取 + 寫入 + 執行
5 R-X 讀取 + 執行
4 R-- 讀取
0 --- 沒有權限

不會繼承權限

在 Data Lake Storage Gen1 所使用的 POSIX 樣式模型中,項目的權限會儲存在項目本身。 換句話說,無法從父項目繼承項目的權限。

以下是一些常見的案例,可協助您了解在 Data Lake Storage Gen1 帳戶上執行某些作業所需的權限。

作業 Object / Seattle/ Portland/ Data.txt
讀取 Data.txt --X --X --X R--
附加至 Data.txt --X --X --X -W-
刪除 Data.txt --X --X -WX ---
建立 Data.txt --X --X -WX ---
清單 / R-X --- --- ---
清單 /Seattle/ --X R-X --- ---
List /Seattle/Portland/ --X --X R-X ---

注意

只要前面的兩個條件成立,刪除檔案時就不需要其寫入權限。

使用者和身分識別

每個檔案和資料夾都有這些身分識別的不同權限︰

  • 擁有使用者
  • 擁有群組
  • 具名使用者
  • 具名群組
  • 所有其他使用者

使用者和群組的身分識別 Microsoft Entra 身分識別。 因此,除非另有說明,否則 Data Lake Storage Gen1 內容中的「使用者」可能表示 Microsoft Entra 用戶或 Microsoft Entra 安全組。

超級使用者

超級使用者具有 Data Lake Storage Gen1 帳戶中所有使用者的大多數權限。 超級使用者:

  • 具有所有檔案和資料夾的 RWX 權限。
  • 可以變更任何檔案或資料夾的權限。
  • 可以變更任何檔案或資料夾的擁有使用者或擁有群組。

身為 Data Lake Storage Gen1 帳戶 [擁有者] 角色成員的所有使用者都會自動成為超級使用者。

擁有使用者

建立項目的使用者會自動成為項目的擁有使用者。 擁有使用者可以︰

  • 變更所擁有檔案的權限。
  • 只要擁有使用者也是目標群組的成員,請變更所擁有檔案的擁有群組。

注意

擁有使用者「無法」變更檔案或資料夾的擁有使用者。 只有超級使用者可以變更檔案或資料夾的擁有使用者。

擁有群組

背景

在 POSIX ACL 中,每個使用者都會與「主要群組」相關聯。例如,使用者「alice」可能屬於「財務」群組。 Alice 也可能屬於多個群組,但一定有一個群組指定為其主要群組。 在 POSIX 中,當 Alice 建立檔案時,該檔案的擁有群組會設定為她的主要群組,在此案例中為 "finance"。否則擁有群組的行為會類似於指派給其他使用者/群組的權限。

因為 Data Lake Storage Gen1 中的使用者沒有相關聯的「主要群組」,所以會如下指派擁有群組。

指派新檔案或資料夾的擁有群組

  • 案例 1:根資料夾 "/"。 建立 Data Lake Storage Gen1 帳戶時,會建立這個資料夾。 在此情況下,擁有群組會設定為全部為零的 GUID。 這個值不允許任何存取。 將這類時間指派給群組以前,這是一個預留位置。
  • 案例 2 (其他所有案例):建立新項目時,會從父資料夾複製擁有群組。

變更擁有群組

可以變更擁有群組的對象︰

  • 任何超級使用者。
  • 擁有使用者,如果擁有使用者也是目標群組的成員。

注意

擁有群組「無法」變更檔案或資料夾的 ACL。

若為在 2018 年 9 月或之前建立的帳戶,擁有群組已設定為在上述根資料夾案例 (案例 1) 中建立帳戶的使用者。 單一使用者帳戶不適用於透過擁有群組提供權限,因此此預設設定不會授與任何權限。 您可以將此權限指派給有效的使用者群組。

存取檢查演算法

以下的虛擬程式碼代表 Data Lake Storage Gen1 帳戶的存取檢查演算法。

def access_check( user, desired_perms, path ) : 
  # access_check returns true if user has the desired permissions on the path, false otherwise
  # user is the identity that wants to perform an operation on path
  # desired_perms is a simple integer with values from 0 to 7 ( R=4, W=2, X=1). User desires these permissions
  # path is the file or folder
  # Note: the "sticky bit" is not illustrated in this algorithm
  
# Handle super users.
  if (is_superuser(user)) :
    return True

  # Handle the owning user. Note that mask IS NOT used.
  entry = get_acl_entry( path, OWNER )
  if (user == entry.identity)
      return ( (desired_perms & entry.permissions) == desired_perms )

  # Handle the named users. Note that mask IS used.
  entries = get_acl_entries( path, NAMED_USER )
  for entry in entries:
      if (user == entry.identity ) :
          mask = get_mask( path )
          return ( (desired_perms & entry.permmissions & mask) == desired_perms)

  # Handle named groups and owning group
  member_count = 0
  perms = 0
  entries = get_acl_entries( path, NAMED_GROUP | OWNING_GROUP )
  for entry in entries:
    if (user_is_member_of_group(user, entry.identity)) :
      member_count += 1
      perms | =  entry.permissions
  if (member_count>0) :
    return ((desired_perms & perms & mask ) == desired_perms)
 
  # Handle other
  perms = get_perms_for_other(path)
  mask = get_mask( path )
  return ( (desired_perms & perms & mask ) == desired_perms)

遮罩

如<存取檢查演算法>所述,遮罩會限制具名使用者擁有群組具名群組的存取權。

注意

對於新的 Data Lake Storage Gen1 帳戶,根資料夾 ("/") 的存取 ACL 遮罩會預設為 RWX。

黏性位元

黏性位元是 POSIX 檔案系統的更進階功能。 在 Data Lake Storage Gen1 的內容中,不太可能需要黏性位元。 總而言之,如果已在資料夾上啟用黏性位元,子項目便只能由子項目的擁有使用者刪除或重新命名。

黏性位元不會顯示在 Azure 入口網站中。

新檔案和資料夾的預設權限

在現有資料夾之下建立新檔案或資料夾時,父資料夾的預設 ACL 可決定︰

  • 子資料夾的預設 ACL 與存取 ACL。
  • 子檔案的存取 ACL (檔案沒有預設 ACL)。

umask

建立檔案或資料夾時,可使用 umask 來修改子項目上的預設 ACL 設定方式。 umask 是一個在父資料夾上的 9 位元值,其中包含一個用於擁有使用者擁有群組其他的 RWX 值。

Azure Data Lake Storage Gen1 的 umask 是一個設定為 007 的常數值。 此值會轉譯成

umask 元件 數值形式 簡短形式 意義
umask.owning_user 0 --- 針對擁有使用者,將父系的「預設 ACL」複製到子系的「存取 ACL」
umask.owning_group 0 --- 針對擁有群組,將父系的「預設 ACL」複製到子系的「存取 ACL」
umask.other 7 RWX 針對其他,移除子系「存取 ACL」上的所有權限

Azure Data Lake Storage Gen1 所使用的 umask 值實際上意謂著不論「預設 ACL」的指示為何,預設一律不會在新子系上傳輸用於「其他」的值。

下列虛擬程式碼說明為子項目建立 ACL 時套用 umask 的方式。

def set_default_acls_for_new_child(parent, child):
    child.acls = []
    for entry in parent.acls :
        new_entry = None
        if (entry.type == OWNING_USER) :
            new_entry = entry.clone(perms = entry.perms & (~umask.owning_user))
        elif (entry.type == OWNING_GROUP) :
            new_entry = entry.clone(perms = entry.perms & (~umask.owning_group))
        elif (entry.type == OTHER) :
            new_entry = entry.clone(perms = entry.perms & (~umask.other))
        else :
            new_entry = entry.clone(perms = entry.perms )
        child_acls.add( new_entry )

Data Lake Storage Gen1 中 ACL 的相關常見問題

我必須啟用 ACL 的支援嗎?

否。 Data Lake Storage Gen1 帳戶一律會啟用透過 ACL 的存取控制。

若要以遞迴方式刪除資料夾與其內容,需要哪些權限?

  • 父資料夾必須具有 [寫入 + 執行] 權限。
  • 要刪除的資料夾及其中的每個資料夾,都需要 [讀取 + 寫入 + 執行] 權限。

注意

您不需要寫入權限即可刪除資料夾中的檔案。 此外,決不會刪除根資料夾 "/"。

誰是檔案或資料夾的擁有者?

檔案或資料夾的建立者會成為擁有者。

在建立檔案或資料夾時,會將哪個群組設定為擁有群組?

擁有群組是從新檔案或資料夾建立所在父資料夾的擁有群組複製而來。

我是檔案的擁有使用者,但沒有我需要的 RWX 權限。 該怎麼辦?

擁有使用者可以變更檔案的權限,以取得本身所需的任何 RWX 權限。

當我在 Azure 入口網站中查看 ACL 時,我可看到使用者名稱,但透過 API 卻看到 GUID,為什麼會這樣?

ACL 中的項目會儲存為 GUID,對應至 Microsoft Entra ID 中的使用者。 API 會依現狀傳回 GUID。 Azure 入口網站會儘可能將 GUID 轉譯成好記的名稱,試圖讓 ACL 更容易使用。

當我使用 Azure 入口網站時,為什麼有時候會在 ACL 中看到 GUID?

當使用者不再存在於 Microsoft Entra 時,會顯示 GUID。 當用戶離開公司,或在 Microsoft Entra ID 中刪除其帳戶時,通常會發生這種情況。 此外,請確定您使用正確的識別碼來設定 ACL (下列問題的詳細資料)。

使用服務主體時,我應該使用哪個識別碼來設定 ACL?

在 Azure 入口網站上,移至 [Microsoft Entra ID -> 企業應用程式],然後選取您的應用程式。 [概觀] 索引標籤應該會顯示物件識別碼,這是新增 ACL 以進行資料存取 (而非應用程式識別碼) 時應該使用的內容。

Data Lake Storage Gen1 是否支援 ACL 的繼承?

否,但預設 ACL 可以用來為父資料夾下新建的子檔案和資料夾設定 ACL。

檔案和資料夾上的 ACL 項目限制為何?

每個檔案和每個目錄可以設定 32 個 ACL。 存取和預設 ACL 各有各的 32 個 ACL 項目限制。 盡可能使用安全性群組進行 ACL 指派。 使用群組時,比較不可能超過每個檔案或目錄的 ACL 項目數目上限。

何處可以進一步了解 POSIX 存取控制模型?

另請參閱