在 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) 权限以及子文件夹写入和执行 (WX) 权限。
  • 在子文件夹启用粘滞位。
  • 尝试创建或上传新文件( 例如,test.txt)到 ADLS Gen2 存储帐户文件夹路径 容器/folder/child-folder/

在此方案中,你会收到 403 拒绝访问授权错误。

此错误发生的原因有两个:

  • 你没有足够的权限访问文件夹路径。
  • 你有足够的权限,但启用粘滞位会导致你不是此文件夹路径的所有者。

确定粘滞位是否导致 403 访问被拒绝错误

验证文件夹和父文件夹的 ACL 设置,然后将其与 ACL 权限相关的常见方案进行比较。 如果权限足够,则 403 错误可能是由粘滞位引起的。

使用 Azure CLI 验证粘滞位设置

可以通过多种方式检查此设置,例如 REST API 调用、PowerShell 命令和 Azure CLI。 建议使用 Azure CLI 选项,因为它不需要安装任何额外的软件,并且命令易于理解。

若要使用 Azure CLI 验证粘滞位设置,请执行以下步骤:

  1. 使用帐户登录到Azure 门户。 确保此帐户在 ADLS Gen2 存储帐户上分配了存储 Blob 数据所有者角色。

  2. 从Azure 门户中选择 Cloud Shell

    Azure 门户中的 Cloud Shell 按钮的屏幕截图。

  3. 使用以下命令获取容器/文件夹目录的 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”为 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 版本 Path
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 及更高版本 将 HDFS CLI 与 Data Lake Storage Gen2Apache Hadoop 3.3.3 配合使用 – HDFS 权限指南

下面是使用 Azure CLI 禁用/启用粘滞位设置的示例。

  1. 使用在目标 ADLS Gen2 存储帐户上分配存储 Blob 数据所有者角色的帐户登录到Azure 门户。

  2. 从Azure 门户中选择 Cloud Shell

    Azure 门户中的 Cloud Shell 按钮的屏幕截图。

  3. 若要将容器/文件夹目录的 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} 一个命令可以接受长表示法和短格式表示法。 这意味着以下命令也是限定的:

    az storage fs access set --permissions 1776 -p folder -f container --account-name account --auth-mode login
    

    下面是示例输出:

    命令输出示例的屏幕截图。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区