排查 Azure 存储帐户防火墙授权错误

简介

强化存储帐户的数据平面访问是增强安全性的常见做法。但是,当使用具有虚拟网络 (VNET) 集成的 Azure 资源,或从专用 IP 或其他租户访问存储终结点时,如果来源未正确列入白名单,则可能会发生授权错误。本文探讨导致此类错误的常见场景并提供可行的解决方法。


常见授权错误场景

场景 1:从其他区域访问

当发出调用的来源位于不同的 Azure 区域时,通常可以通过将来源的 公用 IP 地址 添加到存储帐户防火墙来解决。


场景 2:同一区域访问失败

来自同一 Azure 区域的请求通常使用 Azure 专用 IP 地址 ,而不是公用 IP。在这种情况下,将公用 IP 列入白名单将会失败。请参阅 配置 Azure 存储防火墙和虚拟网络 以了解更多详情。


场景 3:将访问限制到特定子网

如果资源没有公用 IP,但客户希望将访问限制到特定子网,则可能会因可见性限制而遇到问题。存储帐户防火墙可能不会显示目标子网,需要由具有 参与者 RBAC 访问权限 或更高权限的人手动列入白名单。


场景 4:从不同的 Azure 租户访问

当尝试访问存储帐户的资源属于不同的 Azure 租户时,需要采取额外步骤将来源子网列入白名单。


解决步骤

添加来自其他租户的子网

要将来自不同 Azure 租户的虚拟网络中的子网列入白名单,必须使用 VirtualNetworkResourceId 参数。需要按以下形式指定子网 URI:

/subscriptions/<subscription-ID>/resourceGroups/<resourceGroup-Name>/providers/Microsoft.Network/virtualNetworks/<vNet-name>/subnets/<subnet-name>

PowerShell 命令示例

要获取子网 URI,请使用以下命令:

$subnet = Get-AzVirtualNetwork -ResourceGroupName "myresourcegroup" -Name "myvnet" | Get-AzVirtualNetworkSubnetConfig -Name "mysubnet"

如果用户在源租户中没有足够的访问权限来执行此命令,他们可以通过检查 Azure 中 VNET 资源的 JSON 正文来检索子网 URI。这需要对该资源拥有 控制平面 READ 访问权限 。


启用存储服务终结点

在将子网列入白名单之前,请确保 Microsoft.Storage 或 Microsoft.Storage.Global 服务终结点已启用。这可以通过 Azure PowerShell、CLI 或 Azure 门户来完成。有关分步说明,请参阅 配置 Azure 存储防火墙和虚拟网络。

列入白名单的命令示例

获取子网 URI 后,使用以下命令添加网络规则:

Add-AzStorageAccountNetworkRule -ResourceGroupName "myresourcegroup" -AccountName "mystorageaccount" -VirtualNetworkResourceId $subnet

验证

要验证连接,请使用 curl 命令,并使用 SAS 令牌:

curl https://storageaccountname.blob.core.windows.net/container/hello.txt?<SAS token>

提示:

  •  -v 标志在 curl 命令中可启用详细输出,这有助于识别 HTTP 响应,例如 403 Forbidden。删除该标志可获得更简洁的输出。

下面的示例将显示目标存储帐户防火墙中的子网 

提示: 高亮显示的警告可以安全地忽略,它与对已列入白名单的子网的 READ 控制平面访问有关,数据平面访问将被允许。 


其他注意事项

  1. 服务终结点启用:启用存储服务终结点可能会导致暂时的连接中断。有关更多信息,请参阅 Azure 虚拟网络服务终结点。
  2. 专用终结点:专用终结点会绕过防火墙网络规则,因为它们依赖 DNS 以及通过已授权子网的连接。请参阅 使用专用终结点 – Azure 存储。
  3. 控制平面与数据平面:理解控制平面操作和数据平面操作之间的区别对于故障排查至关重要。在以下位置了解更多: 控制平面和数据平面操作。

结论

访问 Azure 存储终结点时的授权错误通常源于配置错误的防火墙规则或子网可见性不足。按照上述步骤,您可以有效地排查和解决这些问题,确保安全、无缝的数据平面访问。

发表评论