访问 Azure Blob 存储时,可能会遇到 HTTP 403 错误,导致客户端无法读取、写入或管理数据。 这些错误可能会导致各种配置或授权问题,包括角色分配、令牌设置、网络限制、加密策略等。 本文提供了全面的清单和故障排除指南,可帮助你识别 403 错误的根本原因并有效地解决这些问题。
大约 403 错误
403 错误是包含字符串403(例如)Forbidden (403)的 HTTP 状态代码。 每个 403 错误都附带更具体的错误代码,例如 UnauthorizedBlobOverwrite 或 QueryParameterSasMandatory。 这些详细的错误代码有助于缩小问题原因的范围。 以下文章介绍了最常见的 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 尚无效。
较短的到期时间: 设置较短的到期时间可能会导致由于时钟差异而过早过期。
版本不匹配:
svSAS 令牌中的 (version) 参数应与正在使用的存储客户端库的版本匹配。 始终使用最新的库版本。重新生成访问密钥: 如果重新生成存储访问密钥,则任何现有的 SAS 令牌都可能会失效,尤其是那些过期时间较长的令牌。
格式不正确的签名: SAS 或共享密钥签名的格式不正确、编码或包含无效参数。
未经授权的 IP 地址: 请求源自 SAS 令牌未授权的 IP。 验证“sip”字段是否与客户端的 IP 地址匹配。
存储访问策略的干扰 具有存储访问策略的容器可以替代 SAS 授予的权限。 例如,容器上的存储访问策略可能会撤销早于 SAS 到期日期和时间的权限。
使用 SAS 时,请参阅最佳做法。
用户授权 SAS 令牌
与用户委托 SAS 令牌关联的 403 错误的常见原因包括:
缺少必填字段:确保存在特定于用户委派 SAS 的所有必填字段:
skoid,sktid,skt和ske。 如果缺少任何身份验证,身份验证将失败。不支持的 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 专用终结点连接问题。
加密范围
使用加密范围时,请查看以下项。
加密范围设置重写 如果容器强制实施默认加密范围设置并且不允许替代,则上传具有不同加密范围的 Blob 会导致 403 错误。 只能在创建容器时设置替代禁止。 若要了解详细信息,请参阅 创建具有默认加密范围的容器。 若要检查是否禁止替代,请检查容器属性。 请参阅 使用 PowerShell 管理 Blob 容器 ,或使用 Azure CLI 管理 Blob 容器。
禁用的密钥 如果加密范围受客户管理的密钥保护,并且密钥处于禁用状态,则对该容器中数据的所有访问尝试都会失败,并出现 403 错误。 请参阅 撤销对使用客户管理的密钥的存储帐户的访问权限。
已禁用帐户
如果尝试访问已禁用的存储帐户或订阅中的数据,则可能会出现 403 错误。 禁用订阅的常见原因包括信用卡过期、达到消费额度限制、逾期账单、超出信用卡额度或由帐户管理员取消订阅。
Azure Databricks 和 Azure RBAC 角色分配
如果订阅包含 Azure Databricks 命名空间,则可能会出现 403 错误。 限定为订阅的角色不会授予对 Blob 和队列数据的访问权限。 改为在资源组、存储帐户、容器或队列级别分配角色。