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 验证粘滞位设置,请执行以下步骤:
使用帐户登录到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”为 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 Gen2 和 Apache Hadoop 3.3.3 配合使用 – 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}
上一个命令中的 可以接受长格式和短格式表示法。 这意味着以下命令也是限定的:az storage fs access set --permissions 1776 -p folder -f container --account-name account --auth-mode login
下面是一个示例输出:
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈