403 在 ADLS Gen2 中启用粘滞位时出现访问被拒绝授权错误

本文可帮助你了解粘滞位,并提供在 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 存储帐户具有名为 container 的容器和名为 folder/child-folder 的文件夹路径。
  • 使用 ACL 作为授权方法。
  • 在 ADLS Gen2 存储帐户的 ACL 设置中,你配置了对根目录和 文件夹 的“执行 (X) ”权限,以及针对 子文件夹的“写入和执行 (WX) ”权限。
  • 粘滞位在 子文件夹上启用。
  • 尝试创建一个新文件或将其上传到 ADLS Gen2 存储帐户文件夹路径容器/folder/child-folder/ 中,例如 ,test.txt

在此方案中,你会收到 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 版本 路径
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 反馈社区提交产品反馈。