解决 Azure Blob 存储中的 403 错误

访问 Azure Blob 存储时,可能会遇到 HTTP 403 错误,导致客户端无法读取、写入或管理数据。 这些错误可能会导致各种配置或授权问题,包括角色分配、令牌设置、网络限制、加密策略等。 本文提供了全面的清单和故障排除指南,可帮助你识别 403 错误的根本原因并有效地解决这些问题。

大约 403 错误

403 错误是包含字符串403(例如)Forbidden (403)的 HTTP 状态代码。 每个 403 错误都附带更具体的错误代码,例如 UnauthorizedBlobOverwriteQueryParameterSasMandatory。 这些详细的错误代码有助于缩小问题原因的范围。 以下文章介绍了最常见的 403 错误类型:

403 错误可能由控制平面数据平面操作引起。 控制平面操作是通过 Azure 资源管理器发起的请求,例如创建存储帐户或更新其属性。 数据平面操作涉及向存储服务终结点发送请求,例如上传或下载 blob。 可以使用 Azure 资源日志查找错误详细信息,包括有关用于授权的安全主体、密钥或 SAS 的信息。

当凭据、令牌或身份验证方法出现问题时,将发生身份验证失败。

错误 原因和解决方案
错误消息
服务器无法验证该请求。 请确保授权标头的值构成正确,且包括签名。

错误代码
身份验证失败

错误详细信息
签名的到期时间 <date> 必须在签名开始时间之后 <date>
过期令牌:SAS 令牌已过过期时间。 生成具有未来过期时间的新 SAS 令牌。

时钟偏斜:系统之间的时间差异可能导致令牌提前过期。 请考虑将缓冲时间添加到过期时间。

将来的开始时间:如果 SAS 用于立即使用,请避免设置开始时间。
错误消息
服务器无法验证该请求。 请确保授权标头的值构成正确,且包括签名。

错误代码
认证失败

错误详细信息
HTTP 请求“xyz...”中找到的 MAC 签名与任何计算签名不同。
错误的帐户密钥:验证你使用的是存储帐户的正确主密钥或辅助密钥。

重新生成密钥:如果最近重新生成存储访问密钥,请使用新密钥更新应用程序。

编码问题:确保帐户密钥经过正确编码和格式化。
错误消息
服务器无法验证该请求。 请确保授权标头的值构成正确,且包括签名。

错误代码
身份验证失败

错误详细信息
SAS 字段“sv”格式不正确。
SAS 格式无效:使用官方 Azure SDK 或存储资源管理器等工具生成 SAS 令牌。

手动构造错误:如果手动构造 SAS 令牌,请验证所有必填字段及其格式。

版本不匹配:确保 sv (version) 参数与存储客户端库版本匹配。
错误消息
服务器无法验证该请求。 请确保授权标头的值构成正确,且包括签名。

错误代码
身份验证失败

错误详细信息
不允许在该资源层级使用指定的已签名资源
服务 SAS 与帐户 SAS:您正在使用服务 SAS(针对特定 blob/容器)进行帐户级操作。

范围不匹配:为作生成适当的 SAS 类型。 对帐户级操作(例如列出容器)使用 SAS 帐户,并将 SAS 服务用于特定的 blob/容器操作。
错误消息
此存储帐户不允许使用基于密钥的身份验证。

错误代码
基于密钥的认证不允许
策略限制:存储帐户已配置为禁止共享密钥身份验证。

切换到 Azure AD:使用 Azure Active Directory (Entra ID) 身份验证,而不是帐户密钥。

启用共享密钥:如果需要,在存储帐户配置中重新启用共享密钥访问。

当客户端具有有效的凭据,但请求操作的权限不足时,将发生授权失败。

错误 原因和解决方案
错误消息
此请求无权凭借此权限执行此操作。

错误代码
授权权限不匹配
缺少权限:SAS 令牌不包括所需的权限(读取、写入、删除、列表)。

操作要求:某些操作需要多个权限(例如覆盖写入 blob 需要写入和删除)。

检查 SAS 权限:验证 sp SAS 令牌中的(权限)字段包括所有必要的权限。

Azure RBAC 角色不足:用户或服务主体缺少操作所需的角色。

对于读取操作,请使用存储 Blob 数据读取器。
对于写入操作,请使用存储 Blob 数据贡献者权限。
对于管理操作,请使用存储 Blob 数据所有者。

角色分配范围:确保在适当的范围(订阅、资源组、存储帐户或容器)分配角色。
错误消息
此请求未获授权,无法使用此服务执行此操作。

错误代码
授权服务不匹配 (AuthorizationServiceMismatch)
服务类型错误:为不同的 Azure 存储服务创建了 SAS 令牌。

服务字段不匹配:检查 ss SAS 令牌中的(服务)字段。
使用b Blob 服务
使用 f 文件服务
用于 q 队列服务
使用 t 表服务。
错误消息
此请求无权执行此操作

错误代码
AuthorizationFailure
已禁用公用网络访问:存储帐户不允许公用网络访问。

IP 地址限制:IP 地址不包括在允许的 IP 范围中。

虚拟网络限制:访问仅限于特定的虚拟网络或子网。

防火墙规则:存储帐户防火墙正在阻止你的请求。

全面的诊断清单

如果您遇到前面部分未描述的错误,或者那些部分中描述的原因和解决方案没有帮助您解决问题,请使用此清单来识别原因并找到解决方案。

  • 安全文件传输 - 如果需要安全传输,请确保通过 HTTPS 发出请求。 (了解详细信息)。

  • Azure 基于角色的访问控制:验证安全主体是否具有正确的 Azure RBAC 角色。 (了解详细信息)。

  • 共享访问签名 (SAS) 令牌:检查令牌过期、权限和生成方法。 (阅读更多)。

  • 用户委派 SAS:确认用户委派 SAS 的必填字段、权限和密钥状态。 (阅读更多)。

  • 存储访问策略:查看存储的访问策略设置和传播延迟。 (阅读更多)。

  • 访问控制列表(ACL):确保客户端的 ACL 条目和权限正确。 (阅读更多)。

  • 共享密钥授权:如果使用帐户密钥,请确认是否允许共享密钥授权。 (了解详细信息)。

  • 公共网络终结点:检查公共终结点访问、防火墙规则和网络安全外围。 (阅读更多)。

  • 专用终结点:验证专用终结点子网和资源配置。 (阅读更多)。

  • 加密范围:查看加密范围设置和客户管理的密钥状态。 (阅读更多)。

  • 禁用的帐户:确认存储帐户或订阅未禁用。 (阅读更多)。

  • Azure DataBricks 和 Azure RBAC:将角色的范围限定为资源组、帐户或容器。 (阅读更多)。

  • 检查复制作的范围:检查帐户设置是否限制复制作的范围。 (了解详细信息)。

SAS 令牌

使用 SAS 令牌时出现 403 错误的常见原因包括:

  • 不适当的 SAS 令牌过期或开始时间: SAS 令牌的过期和开始时间未针对预期用途正确设置。

  • 缺少权限: 并不是所有必要的权限都为 SAS 令牌所选择。

  • 权限不足: 客户端尝试进行 SAS 令牌不允许的操作。 例如,客户端尝试使用仅允许读取操作的 SAS 向 Blob 写入数据。 某些操作需要额外的权限。 例如,若客户端要覆写 Blob,则 SAS 令牌必须允许写入和删除权限。

  • 令牌生成方法: SAS 令牌不是使用官方 SDK 或工具(如存储资源管理器)生成的。 若要避免签名字符串中的错误,请考虑使用官方 SDK 生成 SAS 令牌。 如果手动构造 SAS 令牌,请使用最新的存储服务版本和库。 请参阅 使用共享访问签名委派访问权限

  • 过期的 SAS 令牌: 客户端正在使用过期的 SAS 令牌。

  • 时钟倾斜: 生成 SAS 的主机与存储服务之间的时间差异很小,导致 SAS 无效或早于预期过期。

  • SAS 开始时间不正确: 如果 SAS 用于立即使用,请避免设置开始时间,因为时钟差异会使 SAS 尚无效。

  • 较短的到期时间: 设置较短的到期时间可能会导致由于时钟差异而过早过期。

  • 版本不匹配:sv SAS 令牌中的 (version) 参数应与正在使用的存储客户端库的版本匹配。 始终使用最新的库版本。

  • 重新生成访问密钥: 如果重新生成存储访问密钥,则任何现有的 SAS 令牌都可能会失效,尤其是那些过期时间较长的令牌。

  • 格式不正确的签名: SAS 或共享密钥签名的格式不正确、编码或包含无效参数。

  • 未经授权的 IP 地址: 请求源自 SAS 令牌未授权的 IP。 验证“sip”字段是否与客户端的 IP 地址匹配。

  • 存储访问策略的干扰 具有存储访问策略的容器可以替代 SAS 授予的权限。 例如,容器上的存储访问策略可能会撤销早于 SAS 到期日期和时间的权限。

使用 SAS 时,请参阅最佳做法。

用户授权 SAS 令牌

与用户委托 SAS 令牌关联的 403 错误的常见原因包括:

  • 缺少必填字段:确保存在特定于用户委派 SAS 的所有必填字段:skoidsktidsktske。 如果缺少任何身份验证,身份验证将失败。

  • 不支持的 API 版本: 用户委派 SAS 仅支持“2018-11-09”之后的 REST API 版本。

  • 无效令牌: SAS 令牌的开始时间(st)和结束时间(se)必须在委托密钥的开始时间(skt)和结束时间(ske)内。

  • 请求计时: 请求开始时间必须位于 SAS 令牌的有效时间范围内。

  • 签名不匹配: 客户端提供的 SAS 签名必须与存储服务生成的签名匹配。 例如,如果用于访问容器 Y,则为容器 X 创建的 SAS 将失败。

  • SAS 权限不足: SAS 令牌必须允许请求的操作。 例如,“读取”权限不能用于“写入”请求。 检查“sp”字段。

  • Azure RBAC 角色缺失: 用户必须具有请求操作所需的 Azure 角色。 例如,写入操作需要具有 Storage Blob Data Contributor 角色。

  • OAuth 身份验证: 确保 OAuth(Azure RBAC)授权能够通过所请求操作的验证。

  • 撤销的密钥 - 请求是在撤销用户委托密钥或已过期后发出的。

请参阅创建用户委派 SAS

存储访问策略

使用存储访问策略时,请查看以下项:

  • 策略设置 存储访问策略中定义的权限、开始时间和过期时间对于你的方案是正确的。

  • SAS 令牌 与策略关联的 SAS 令牌与预期权限和时间范围匹配。

应用或更新存储访问策略后,最多允许 30 秒使策略生效。 在此时间间隔内,与策略关联的任何 SAS 可能会失败,并出现 403(禁止)错误,直到策略处于活动状态。

若要了解详细信息,请参阅 定义存储的访问策略

访问控制列表 (ACL)

使用 ACL 授权访问文件和目录时,请查看以下项:

  • 安全主体成员身份 客户端使用的安全主体必须出现在目标文件或目录的 ACL 条目中。 如果 ACL 条目仅包含安全组,则主体必须是其中一个组的成员。

  • 正确的权限 与安全主体关联的 ACL 条目为预期作授予适当的权限级别。

  • 未设置粘滞位 ACL 有一个名为粘滞位的设置,这也可能导致 403 错误。 如果在目录中启用了粘滞位,则只有子项的所有者、目录的所有者或超级用户($superuser)可以删除或重命名子项。 若要了解详细信息,请参阅 在 ADLS Gen2 中启用粘附位后导致的 403 禁止访问授权错误

有关 ACL 的详细信息,请参阅 Azure Data Lake Storage Gen2 中的访问控制列表(ACL)。

公用网络终结点

如果客户端通过其公共终结点访问存储帐户时收到 403 错误,请查看以下项。

  • 防火墙规则 如果启用了防火墙规则,请确保客户端正在从允许的 IP 地址或子网发出请求。 如果存储帐户仅允许来自特定虚拟网络子网的流量,则禁止任何尝试从公用网络访问数据。 例如,如果用户尝试从 Azure 门户(使用浏览器的网络)或本地计算机访问存储帐户,则会出现 403 错误,除非将浏览器网络或本地计算机的 IP 地址添加到 IP 地址规则。 请参阅 Azure 存储防火墙规则

  • 源和目标访问 对于在存储帐户之间复制数据的作,客户端必须对源帐户和目标帐户具有网络访问权限。

  • Azure 服务访问 如果 403 错误源自需要与存储帐户后端交互的其他服务,请确认该服务已添加为允许 的资源实例 ,或者已配置受信任的 Azure 服务的网络安全异常。 请参阅 受信任的 Azure 服务

  • 网络安全外围规则 如果存储帐户是网络安全外围的一部分,则这些规则将覆盖防火墙设置。 即使防火墙允许客户端,限制性网络安全外围规则仍可能导致 403 错误。 启用资源日志以识别导致问题的规则。 请参阅网络安全外围的诊断日志

  • 服务终结点策略 如果为资源组、订阅或存储帐户定义了服务终结点策略,请查看策略规则。 要么移除策略,要么确保包括存储帐户。 更改服务终结点策略最多可能需要 15 分钟才能生效。 请参阅 Azure 存储的虚拟网络服务终结点策略

专用终结点

如果客户端通过专用终结点访问存储帐户时收到 403 错误,请查看以下项。

  • 域名系统 (DNS) 设置 确保存储帐户名称的 DNS 解析解析解析为专用 IP 地址。 DNS 配置可能会将存储帐户解析到公共终结点。 更新 DNS 配置,使网络中的客户端实际访问专用终结点。 请参阅 专用终结点的 DNS 更改

  • 中心虚拟网络连接 要从中心虚拟网络中的 VM 复制 Blob 至不同辐射虚拟网络中具有专用终结点的存储帐户,请确保网络连接并检查错误日志以解决可能的问题 CannotVerifyCopySource。 请参阅 使用专用终结点在中心辐射型体系结构中的存储帐户之间复制 Blob

  • 每个存储资源的专用终结点 确保存储帐户具有 Data Lake Storage 资源和 Blob 存储资源的专用终结点。 某些操作可能会在端点之间被重定向,因此需要这两个终端都存在。

  • 源和目标访问 在存储帐户之间复制 Blob 时,客户端必须对这两个帐户具有网络访问权限。 如果只对一个帐户使用专用链接,请确保也对另一个帐户进行网络访问。

有关常规故障排除,请参阅 排查 Azure 专用终结点连接问题

加密范围

使用加密范围时,请查看以下项。

已禁用帐户

如果尝试访问已禁用的存储帐户或订阅中的数据,则可能会出现 403 错误。 禁用订阅的常见原因包括信用卡过期、达到消费额度限制、逾期账单、超出信用卡额度或由帐户管理员取消订阅。

Azure Databricks 和 Azure RBAC 角色分配

如果订阅包含 Azure Databricks 命名空间,则可能会出现 403 错误。 限定为订阅的角色不会授予对 Blob 和队列数据的访问权限。 改为在资源组、存储帐户、容器或队列级别分配角色。

另请参阅