在ADLS Gen2中啟用黏性位時發生403拒絕存取授權錯誤
本文可協助您瞭解黏性位,並提供如何在 Azure Data Lake Storage (ADLS) Gen2 中設定此設定並取得問題的相關信息。
ADLS Gen2 中的黏性位為何?
ADLS Gen2 使用者通常需要管理不同用戶的許可權,其中一種方法是使用訪問控制清單(ACL)。 ACL 是類似 POSIX 的訪問控制系統,其具有稱為黏性位的特定設定,可能會導致授權失敗。 如需許可權控制模式和黏性位的詳細資訊,請參閱 Azure Data Lake Storage Gen2 中的訪問控制清單(ACL)。
黏性位是ADLS Gen2記憶體帳戶 ACL 設定中不需要的進階功能。 相反地,您可以使用 遮罩功能 來限制具名使用者、具名群組和擁有群組的最大許可權。 這與黏性位類似,而且很容易在 Azure 入口網站 中設定。
403 拒絕存取授權錯誤
試想以下情況:
- ADLS Gen2 儲存體帳戶具有稱為容器的容器,以及名為folder/child-folder的資料夾路徑。
- 您可以使用 ACL 作為授權方法。
- 在 ADLS Gen2 儲存器帳戶的 ACL 設定中,您已使用根目錄和資料夾的 Execute (X) 許可權以及子資料夾的 Write and Execute (WX) 權限進行設定。
- 子資料夾上已啟用黏性位。
- 您嘗試建立或上傳新的檔案, 例如,test.txt到 ADLS Gen2 儲存器帳戶資料夾路徑 容器/folder/child-folder/。
在此案例中,您會收到 403 拒絕存取授權錯誤。
此錯誤發生的原因有兩個:
- 您沒有足夠的權限可存取資料夾路徑。
- 您有足夠的許可權,但啟用黏性位會導致您不是此資料夾路徑的擁有者。
識別黏性位是否造成 403 拒絕存取錯誤
確認資料夾和父資料夾的 ACL 設定,然後將它與 ACL 許可權相關的常見案例進行比較。 如果許可權足夠,則 403 錯誤可能是由黏性位所造成。
使用 Azure CLI 確認黏性位設定
有許多方式可以檢查此設定,例如 REST API 呼叫、PowerShell 命令和 Azure CLI。 我們建議使用 Azure CLI 選項,因為它不需要安裝任何額外的軟體,而且命令很容易理解。
若要使用 Azure CLI 確認黏性位設定,請遵循下列步驟:
使用您的帳戶登入 Azure 入口網站。 請確定此帳戶在ADLS Gen2記憶體帳戶上具有記憶體 Blob 資料擁有者角色指派。
從 Azure 入口網站 選取 Cloud Shell。
使用下列命令來取得容器/資料夾目錄的 ACL 和黏性位設定:
az storage fs access show -p folder -f container --account-name account --auth-mode login
若要檢查根目錄的 ACL 和黏性位設定,也就是容器層級 ACL 和黏性位設定,請使用下列命令:
az storage fs access show -p / -f container --account-name account --auth-mode login
以下是範例輸出:
在回應 JSON 主體中,將焦點放在
permissions
。 它通常包含具有額外 「+」 符號的 9 或 10 位。 如需這些字母的詳細資訊,請參閱 使用者和身分識別。上述範例指出已啟用所有用戶許可權,並啟用黏性位。 如需如何讀取此許可權表示法的詳細資訊,請參閱 傳統 Unix 許可權的表示法。
第九個字母有四個可能的值:“-”、“x”、“t” 和 “T”。 如果此字母的值是 「t」 或 「T」,表示已啟用黏性位。 “t” 是已啟用黏性位的 “x”,而 “T” 是 “-” 且已啟用黏性位。
“rwxrwxrwt” 可透過下列內容來說明:
- 已為擁有者啟用 r、w 和 x 許可權。
- 已針對擁有群組啟用 r、w 和 x 許可權。
- 已為其他用戶啟用 r、w 和 x 許可權,並啟用黏性位。
若要進一步瞭解,以下是 “rwxr-xr-T” 的另一個範例:
- 已為擁有者啟用 r、w 和 x 許可權。
- 已針對擁有群組啟用 r 和 x 許可權。
- 僅針對其他使用者啟用 r 許可權,並啟用黏性位。
根據 許可權的簡短表單,簡短表單許可權是針對每三個字母群組計算(“r” 為 4、“w” 為 2 和 “x ”as 1)。 因此,“rw-rwx--x” 將等於 4+2+0、4+2+1、0+0+1、671。 根據此計算規則,您只需要在開頭新增第四個字母。 如果已啟用黏性位,請將它設定為 1。 如果黏性位已停用,請將它設定為 0。
以下列出一些範例:
- rwxrwxrwt => 1777
- rwxr-xr-T => 1754
- rw-rwx--x => 0671
停用/啟用黏性位設定
若要停用/啟用黏性位設定,請將許可權設定為預期的值。
用來修改此設定的 Azure 帳戶必須具有目標 ADLS Gen2 儲存器帳戶上的記憶體 Blob 數據擁有者角色。 有許多可能的方法可以修改黏性位設定。 以下是支援的 SDK:
SDK | 支援的版本 | 其他相關資訊 |
---|---|---|
REST API | 2019-12-12 和更新版本的 API 版本 | 路徑 |
Az PowerShell 模組 | 5.6.0 和更新版本 | 使用 PowerShell 管理 Azure Data Lake Storage Gen2 中的 ACL |
Azure CLI | 2.38.0 和更新版本 | 使用 Azure CLI 管理 Azure Data Lake Storage Gen2 中的 ACL |
.NET SDK | 12.14.0 和更新版本 | 使用 .NET 管理 Azure Data Lake Storage Gen2 中的 ACL |
Java SDK | 12.11.0 和更新版本 | 使用 Java 管理 Azure Data Lake Storage Gen2 中的 ACL |
Python SDK | 12.8.0 和更新版本 | 使用 Python 管理 Azure Data Lake Storage Gen2 中的 ACL |
JavaScript SDK | 12.11.0-beta.1 和更新版本 | 在 Node.js 中使用 JavaScript SDK 來管理 Azure Data Lake Storage Gen2 中的 ACL |
HDFS CLI | 3.3.3 和更新版本 | 搭配 Data Lake Storage Gen2 和 Apache Hadoop 3.3.3 使用 HDFS CLI – HDFS 許可權指南 |
以下是使用 Azure CLI 停用/啟用黏性位設定的範例。
使用在目標 ADLS Gen2 儲存體帳戶上具有記憶體 Blob 數據擁有者角色指派的帳戶登入 Azure 入口網站。
從 Azure 入口網站 選取 Cloud Shell。
若要將容器/資料夾目錄的 ACL 和黏性位設定設為 “rwxrwxrwt” 許可權,並啟用黏性位,請使用下列命令:
az storage fs access set --permissions rwxrwxrwt -p folder -f container --account-name account --auth-mode login
若要修改根目錄的設定,也就是容器層級 ACL 和黏性位設定,請使用下列命令:
az storage fs access set --permissions rwxrwxrwt -p / -f container --account-name account --auth-mode login
上
{permission notation}
一個命令中的 可以同時接受long和short-form表示法。 這表示下列命令也限定:az storage fs access set --permissions 1776 -p folder -f container --account-name account --auth-mode login
以下為範例輸出:
與我們連絡,以取得說明
如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。