配置对容器和 blob 的匿名公共读取访问

Azure 存储支持对容器和 blob 进行可选的匿名公共读取访问。 默认情况下,系统从不允许匿名访问你的数据。 除非你显式启用匿名访问,否则对容器及其 blob 的所有请求都必须获得授权。 如果你将容器的公共访问级别设置配置为允许匿名访问,则客户端无需对请求进行授权便可读取该容器中的数据。

警告

为容器配置了公共访问时,任何客户端都可以读取该容器中的数据。 公共访问会带来潜在的安全风险,因此,如果你的方案不需要公共访问,Azure 建议你为存储帐户禁止它。 有关详细信息,请参阅阻止对容器和 Blob 的匿名公共读取访问

本文介绍了如何配置对容器及其 blob 的匿名公共读取访问。 有关如何从客户端应用程序匿名访问 blob 数据的信息,请参阅使用 .NET 匿名访问公共容器和 blob

关于匿名公共读取访问

默认情况下,系统始终禁止对你的数据进行公共访问。 有两个单独的设置会影响公共访问:

  1. 允许对存储帐户进行公共访问。 默认情况下,存储帐户允许具有适当权限的用户启用对容器的公共访问。 Blob 数据不可供公共访问,除非用户采取额外步骤显式配置了容器的公共访问设置。
  2. 配置容器的公共访问设置。 默认情况下,容器的公共访问设置被禁用,这意味着对容器或其数据的每个请求都需要授权。 具有适当权限的用户可以修改容器的公共访问设置,以便仅在允许对存储帐户进行匿名访问时才启用匿名访问。

下表总结了这两个设置如何共同影响对容器的公共访问。

公共访问设置 禁用对容器的公共访问(默认设置) 对容器的公共访问设置为“容器” 对容器的公共访问设置为“Blob”
禁止对存储帐户进行公共访问 不允许对存储帐户中的任何容器进行公共访问。 不允许对存储帐户中的任何容器进行公共访问。 存储帐户设置替代容器设置。 不允许对存储帐户中的任何容器进行公共访问。 存储帐户设置替代容器设置。
允许对存储帐户进行公共访问(默认设置) 不允许对此容器进行公共访问(默认配置)。 允许对此容器及其 blob 进行公共访问。 允许对此容器中的 blob 进行公共访问,但不允许对容器本身进行公共访问。

允许或禁止对存储帐户的公共读取访问

默认情况下,存储帐户配置为允许具有适当权限的用户启用对容器的公共访问。 当允许公共访问时,具有适当权限的用户可以修改容器的公共访问设置,以便启用对该容器中的数据的匿名公共访问。 Blob 数据从不可供公共访问,除非用户采取额外步骤显式配置了容器的公共访问设置。

请记住,默认情况下,对容器的公共访问始终关闭,必须显式配置才能允许匿名请求。 无论存储帐户的设置如何,你的数据将永远不可供公共访问,除非具有适当权限的用户执行此额外步骤以在容器上启用公共访问。

禁止对存储帐户的公共访问将阻止对该帐户中的所有容器和 blob 进行匿名访问。 如果禁止对帐户的公共访问,则无法将容器的公共访问设置配置为允许匿名访问。 为了提高安全性,Azure 建议你禁止对存储帐户的公共访问,除非你的方案要求用户匿名访问 blob 资源。

重要

禁止对存储帐户的公共访问将替代该存储帐户中所有容器的公共访问设置。 禁止对存储帐户的公共访问后,将来对该帐户的任何匿名请求都会失败。 在更改此设置之前,请务必了解这会对可能匿名访问存储帐户中数据的客户端应用程序带来的影响。 有关详细信息,请参阅阻止对容器和 Blob 的匿名公共读取访问

若要允许或禁止对存储帐户的公共访问,请配置帐户的 AllowBlobPublicAccess 属性。 此属性适用于使用 Azure 资源管理器部署模型创建的所有存储帐户。 有关详细信息,请参阅存储帐户概述

默认情况下,不会为存储帐户设置 AllowBlobPublicAccess 属性,在你显式设置此属性之前,它不会返回值。 当此属性值为 null 或为 true 时,存储帐户允许公共访问。

若要在 Azure 门户中允许或禁止对存储帐户的公共访问,请执行以下步骤:

  1. 导航到 Azure 门户中的存储帐户。

  2. 在“设置”下找到“配置”设置。

  3. 将“Blob 公共访问”设置为“启用”或“禁用”。

    屏幕截图显示了如何允许或禁止对帐户的 blob 公共访问

备注

禁止对存储帐户的公共访问不会影响该存储帐户中承载的任何静态网站。 $web 容器始终可供公共访问。

更新存储帐户的公共访问设置后,最多可能需要 30 秒才能完全传播更改。

允许或禁止 blob 公共访问需要 Azure 存储资源提供程序的 2019-04-01 版或更高版本。 有关详细信息,请参阅 Azure 存储资源提供程序 REST API

本部分中的示例展示了如何读取存储帐户的 AllowBlobPublicAccess 属性,以确定当前是允许还是禁止公共访问。 若要详细了解如何验证帐户的公共访问设置是否已配置为阻止匿名访问,请参阅修正匿名公共访问

为容器设置公共访问级别

若要授予匿名用户对容器及其 Blob 的读取访问权限,请首先允许对存储帐户的公共访问,然后设置容器的公共访问级别。 如果拒绝了对存储帐户的公共访问,你将无法配置对容器的公共访问。

如果允许对存储帐户的公共访问,则可以为容器配置以下权限:

  • 无公共读取访问权限: 只有经授权的请求可以访问容器及其 Blob。 此选项是所有新容器的默认设置。
  • 仅限对 Blob 的公共读取访问权限: 容器中的 Blob 可以通过匿名请求读取,但容器数据不可匿名访问。 匿名客户端无法枚举容器中的 Blob。
  • 对容器及其 Blob 的公共读取访问权限: 匿名请求可以读取容器和 blob 数据,但容器权限设置和容器元数据除外。 客户端可以通过匿名请求枚举容器中的 Blob,但无法枚举存储帐户中的容器。

无法更改单个 Blob 的公共访问级别。 只能在容器级别设置公共访问级别。 你可以在创建容器时设置容器的公共访问级别,也可以更新现有容器上的设置。

若要在 Azure 门户中更新一个或多个现有容器的公共访问级别,请执行以下步骤:

  1. 在 Azure 门户中导航到存储帐户概述。

  2. 在菜单边栏选项卡上的“Blob 服务”下,选择“容器”。

  3. 选择要对其设置公共访问级别的容器。

  4. 使用“更改访问级别”按钮显示公共访问权限设置。

  5. 从“公共访问级别”下拉列表中选择所需的公共访问级别,然后单击“确定”按钮应用对选定容器所做的更改。

    显示如何在门户中设置公共访问级别的屏幕截图。

如果禁止对存储帐户的公共访问,则无法设置容器的公共访问级别。 如果你尝试设置容器的公共访问级别,你会发现该设置被禁用,因为帐户不允许公共访问。

屏幕截图显示当公共访问被禁止时,不允许设置容器公共访问级别

检查一组容器的公共访问设置

可以通过列出容器并检查公共访问设置来检查为一个或多个存储帐户中的哪些容器配置了公共访问。 当存储帐户未包含大量容器时,或者当你检查少量存储帐户的设置时,此方法是一个可行的选项。 但是,如果你尝试枚举大量的容器,则性能可能会降低。

以下示例使用 PowerShell 获取某个存储帐户中所有容器的公共访问设置。 请记得将括号中的占位符值替换为你自己的值:

$rgName = "<resource-group>"
$accountName = "<storage-account>"

$storageAccount = Get-AzStorageAccount -ResourceGroupName $rgName -Name $accountName
$ctx = $storageAccount.Context

Get-AzStorageContainer -Context $ctx | Select Name, PublicAccess

后续步骤