使用 Azure CLI 管理 Azure Data Lake Storage 中的 ACL

本文將教你如何使用 Azure CLI 來取得、設定及更新目錄和檔案的存取控制清單(ACL)。

新增的子項目會自動繼承 ACL。 但你也可以在現有子項目上遞迴新增、更新和移除 ACL,而不必對每個子項目單獨做這些修改。

參考 | 範本 | 提供意見反應

必要條件

  • Azure 訂用帳戶。 如需詳細資訊,請參閱取得 Azure 免費試用。

  • 已啟用階層命名空間的儲存體帳戶。 關於說明,請參閱 建立具有階層命名空間的儲存帳號。

  • Azure CLI 2.14.0 版或更高版本。

  • 下列其中一個安全性權限:

    • 一個已配置的 Microsoft Entra ID 安全主體,該主體被指派為 Storage Blob 資料擁有者角色,範圍涵蓋目標容器、儲存帳號、父資源群組或訂閱。

    • 您計劃套用 ACL 設定的目標容器或目錄的擁有使用者。 若要遞迴設定 ACL,此使用者會包含目標容器或目錄中的所有子項目。

請確保您已安裝正確版本的 Azure CLI

  1. 開啟 Azure Cloud Shell,或者如果你在本地安裝了 Azure CLI,也可以開啟像 Windows PowerShell 這樣的指令控制台應用程式。

  2. 使用下列命令,確認已安裝的 Azure CLI 版本為 2.14.0 或更新版本。

     az --version
    

    如果你的 Azure CLI 版本低於2.14.0,請安裝較新的版本。 如需詳細資訊,請參閱 安裝 Azure CLI。

連線到帳戶

  1. 如果您在本機使用 Azure CLI,請執行登入命令。

    az login
    

    如果 CLI 能開啟預設瀏覽器,它會打開瀏覽器並載入 Azure 登入頁面。

    否則,請在 https://aka.ms/devicelogin 中開啟瀏覽器頁面,並輸入顯示在您的終端機中的授權碼。 然後,請在瀏覽器中使用您的帳戶認證登入。

    若要深入了解不同的驗證方法,請參閱使用 Azure CLI 授與 Blob 或佇列資料的存取權。

  2. 如果你的身份與多個訂閱有關聯,且沒有被提示選擇訂閱,請將你的有效訂閱設定為你想操作的儲存帳號的訂閱。 在此範例中,使用訂用帳戶識別碼取代 <subscription-id> 預留位置值。

    az account set --subscription <subscription-id>
    

取得 ACL 清單

使用 az storage fs access show 命令取得目錄的 ACL。

此範例會取得目錄的 ACL,然後將 ACL 列印到主控台。

az storage fs access show -p my-directory -f my-container --account-name mystorageaccount --auth-mode login

使用 az storage fs access show 命令取得檔案的存取權限。

此範例取得檔案的 ACL,然後將 ACL 列印到主控台。

az storage fs access show -p my-directory/upload.txt -f my-container --account-name mystorageaccount --auth-mode login

下圖顯示取得目錄的 ACL 之後的輸出。

顯示 Azure Data Lake Storage 目錄 ACL 的主控台輸出截圖。

在此範例中,擁有使用者具有讀取、寫入和執行權限。 擁有者群組僅有讀取和執行權限。 如需訪問控制清單的詳細資訊,請參閱 Azure Data Lake Storage 中的訪問控制。

設定 ACL

設定 ACL 時,您會取代整個 ACL,包括其所有項目。 如果您想要變更安全性主體的權限層級,或將新的安全性主體新增至 ACL,而不會影響其他現有的項目,您應該改為更新 ACL。 若要更新 ACL 而非取代,請參閱本文的更新 ACL 一節。

如果您選擇設定 ACL,則必須為擁有者使用者新增一個項目、為擁有者群組新增一個項目,以及為所有其他使用者新增一個項目。 若要深入了解擁有使用者、擁有群組和所有其他使用者,請參閱使用者和身分識別。

本節說明如何:

  • 設定 ACL
  • 以遞迴方式設定 ACL

設定 ACL

使用 az storage fs access set 命令設定目錄的 ACL。

此範例會在目錄上為目錄擁有者、所屬群組或其他使用者設定 ACL,然後將 ACL 列印到主控台。

az storage fs access set --acl "user::rw-,group::rw-,other::-wx" -p my-directory -f my-container --account-name mystorageaccount --auth-mode login

此範例會在目錄上為擁有者使用者、擁有者群組或其他使用者設定 預設 ACL,然後將 ACL 輸出到主控台。

az storage fs access set --acl "default:user::rw-,group::rw-,other::-wx" -p my-directory -f my-container --account-name mystorageaccount --auth-mode login

使用 az storage fs access set 指令來設定 檔案的 ACL。

此範例會為檔案擁有者、擁有群組或其他使用者設定檔案的 ACL,然後將 ACL 輸出到主控台。

az storage fs access set --acl "user::rw-,group::rw-,other::-wx" -p my-directory/upload.txt -f my-container --account-name mystorageaccount --auth-mode login

附註

要為特定群組或使用者設定 ACL,請使用它們各自的物件 ID。 例如,要設定 群組的 ACL,請使用 group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。 要設定 使用者的 ACL,請使用 user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。

下圖顯示設定檔案的 ACL 之後的輸出。

主控台輸出顯示檔案在 Azure Data Lake Storage 設定後的 ACL 截圖。

在此範例中,擁有使用者和擁有群組只有讀取和寫入權限。 所有其他使用者具備寫入和執行權限。 如需訪問控制清單的詳細資訊,請參閱 Azure Data Lake Storage 中的訪問控制。

以遞迴方式設定 ACL

使用 az storage fs access set-recursive 命令以遞迴方式設定 ACL。

此範例會設定名為 my-parent-directory 目錄的 ACL。 這些條目賦予擁有者使用者讀取、寫入和執行權限,擁有群組僅有讀取與執行權限,其他群組則無法存取。 此範例的最後一個 ACL 項目會提供物件識別碼 "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" 讀取和執行權限給特定使用者。

az storage fs access set-recursive --acl "user::rwx,group::r-x,other::---,user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:r-x" -p my-parent-directory/ -f my-container --account-name mystorageaccount --auth-mode login

附註

要設定 預設 的 ACL 項目,請在每個項目前加上前綴 default: 。 例如,default:user::rwx 或 default:user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:r-x。

更新 ACL 清單

當您更新 ACL 時,您會修改 ACL 而不是取代 ACL。 例如,您可以將新的安全性主體新增至 ACL,而不會影響 ACL 中列出的其他安全性主體。 若要取代 ACL 而不是更新,請參閱這篇文章的設定 ACL 一節。

若要更新 ACL,請使用您想要更新的 ACL 項目來建立新的 ACL 物件,然後在更新 ACL 作業中使用該物件。 不要取得現有的 ACL,只要提供 ACL 條目以便更新即可。

本節說明如何:

  • 更新 ACL
  • 以遞迴方式更新 ACL

更新 ACL

使用 az storage fs access update-recursive 命令更新檔案的 ACL。 Azure CLI 只提供 update-recursive 命令來進行更新。 當你鎖定單一檔案時,指令只會更新該檔案的 ACL。

此範例會使用寫入權限更新 ACL 項目。

az storage fs access update-recursive --acl "user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:rwx" -p my-parent-directory/myfile.txt -f my-container --account-name mystorageaccount --auth-mode login

若要更新特定群組或使用者的 ACL,請使用其各自的物件識別碼。 例如,group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 或 user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。

附註

Azure CLI 不支援在不更新子項目 ACL 的情況下,更新單一目錄的 ACL。 若要更新目錄的 ACL,而不修改該目錄中所有子項目的 ACL,請使用其他任何受支援的工具或 SDK。 請參閱如何設定 ACL。

以遞迴方式更新 ACL

使用 az storage fs access update-recursive 命令以遞迴方式更新 ACL。

此範例會使用寫入權限更新 ACL 項目。

az storage fs access update-recursive --acl "user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:rwx" -p my-parent-directory/ -f my-container --account-name mystorageaccount --auth-mode login

附註

要更新 預設 的 ACL 條目,請在每個條目後加上前綴 default: 。 例如: default:user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:r-x 。

以遞迴方式移除 ACL 項目

您能以遞迴方式移除一或多個 ACL 項目。 要移除 ACL 項目,請為你想移除的 ACL 項目建立一個新的 ACL 物件,然後在移除 ACL 操作中使用該物件。 不要取得既有的 ACL,直接提供要移除的 ACL 項目即可。

使用 az storage fs access remove-recursive 命令移除 ACL 項目。

此範例會從容器的根目錄移除 ACL 項目。

az storage fs access remove-recursive --acl "user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -p my-parent-directory/ -f my-container --account-name mystorageaccount --auth-mode login

附註

要移除 預設 的 ACL 條目,請在每個條目後加上前綴 default: 。 例如: default:user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 。

從失敗中復原

以遞迴方式修改 ACL 時,您可能會遇到執行階段或權限錯誤。 如果是執行階段錯誤,請從頭開始重新啟動程序。 如果安全主體沒有足夠權限修改你所修改目錄階層中目錄或檔案的 ACL,就可能發生權限錯誤。 解決權限問題,然後選擇使用接續權杖從失敗點繼續處理程序,或從頭開始重新啟動程序。 如果您想要從頭開始重新啟動,就不需要使用接續權杖。 您可以重新套用 ACL 項目,而不會產生負面影響。

如果發生失敗,請將 --continue-on-failure 參數設為 false,以傳回接續權杖。 解決錯誤之後,為了從失敗點繼續該程序,您可再次執行命令,並將 --continuation 參數設定為接續 Token。

az storage fs access set-recursive --acl "user::rw-,group::r-x,other::---" --continue-on-failure false --continuation xxxxxxx -p my-parent-directory/ -f my-container --account-name mystorageaccount --auth-mode login  

若要確保該程序不中斷地完成,請將 --continue-on-failure 參數設定為 true。

az storage fs access set-recursive --acl "user::rw-,group::r-x,other::---" --continue-on-failure true --continuation xxxxxxx -p my-parent-directory/ -f my-container --account-name mystorageaccount --auth-mode login  

最佳作法

本節提供您以遞迴方式設定 ACL 的一些最佳做法指導方針。

處理執行階段錯誤

有許多原因可能會發生執行階段錯誤 (例如:中斷或用戶端連線問題)。 如果您遇到執行階段錯誤,請重新啟動遞迴 ACL 程序。 ACL 可重新套用到項目上,而不會帶來負面影響。

處理權限錯誤 (403)

如果您在執行遞迴 ACL 程序時遇到存取控制例外狀況,則您的 AD 安全性主體可能沒有足夠權限可將 ACL 套用至目錄階層中的一或多個子項目。 發生權限錯誤時,程序會停止,並提供接續權杖。 修正權限問題,然後使用接續權杖來處理剩餘的資料集。 已成功處理的目錄和檔案不需要重新處理。 您也可以選擇重新啟動遞迴 ACL 程序。 ACL 可重新套用到項目上,而不會帶來負面影響。

認證

建議您在目標儲存體帳戶或容器的範圍中,佈建已獲指派儲存體 Blob 資料擁有者角色的 Microsoft Entra 安全性主體。

效能

若要減少延遲,建議您在位於與儲存體帳戶相同區域中的 Azure 虛擬機器 (VM) 中執行遞迴 ACL 程序。

ACL 限制

您可以套用至目錄或檔案的 ACL 數目上限是 32 個存取 ACL 和 32 個預設 ACL。 如需詳細資訊,請參閱 Azure Data Lake Storage Gen2 中的存取控制。

另請參閱