配置对容器和 Blob 的匿名读取访问权限
Azure 存储对容器和 blob 支持可选的匿名读取访问。 默认情况下,系统从不允许匿名访问你的数据。 除非你显式启用匿名访问,否则对容器及其 blob 的所有请求都必须获得授权。 如果你将容器的访问级别设置配置为允许匿名访问,则在未对请求进行授权的情况下,客户端可以读取该容器中的数据。
警告
为容器配置了匿名访问时,任何客户端都可以读取该容器中的数据。 匿名访问可能会造成安全风险,因此,如果你的方案不要求这种访问,我们建议你修正对存储帐户的匿名访问。
本文介绍了如何配置对容器及其 blob 的匿名读取访问。 有关如何修正匿名访问以获得最佳安全性的信息,请参阅以下文章之一:
默认情况下,系统始终禁止对数据进行匿名访问。 有两个单独的设置会影响匿名访问:
存储帐户的匿名访问设置。 Azure 资源管理器存储帐户提供了一个设置,用于允许或禁止对该帐户进行匿名访问。 Azure 建议禁止对存储帐户进行匿名访问,确保安全性最高。
当在帐户级别允许匿名访问时,无法对 blob 数据进行匿名读取访问,除非用户采取额外步骤显式配置了容器的匿名访问设置。
配置容器的匿名访问设置。 默认情况下,容器的匿名访问设置被禁用,这意味着对容器或其数据的每个请求都需要授权。 仅当允许了对存储帐户进行匿名访问时,具有适当权限的用户才能修改容器的匿名访问设置以启用匿名访问。
下表总结了这两个设置如何共同影响对容器的匿名访问。
容器的匿名访问级别设置为“专用”(默认设置) | 容器的匿名访问级别设置为“容器” | 容器的匿名访问级别设置为“Blob” | |
---|---|---|---|
禁止对存储帐户进行匿名访问 | 无法对存储帐户中的任何容器进行匿名访问。 | 无法对存储帐户中的任何容器进行匿名访问。 存储帐户设置替代容器设置。 | 无法对存储帐户中的任何容器进行匿名访问。 存储帐户设置替代容器设置。 |
允许对存储帐户进行匿名访问 | 无法对此容器进行匿名访问(默认配置)。 | 可以对此容器及其 blob 进行匿名访问。 | 可以对此容器中的 blob 进行匿名访问,但无法对容器本身进行匿名访问。 |
当允许存储帐户匿名访问并为特定容器配置匿名访问时,服务将接受读取该容器中 Blob 的请求,但不使用 Authorization
标头传递该请求,并在响应中返回 Blob 的数据。 但是,如果使用 Authorization
标头传递该请求,则会忽略存储帐户上的匿名访问,并且根据提供的凭据对请求进行授权。
如果允许对某个存储帐户进行匿名访问,则具有适当权限的用户可以修改容器的匿名访问设置,以启用对该容器中数据的匿名访问。 Blob 数据永远不可供匿名访问,除非用户采取额外步骤显式配置了容器的匿名访问设置。
请记住,默认情况下,对容器的匿名访问始终处于禁用状态,必须显式配置才能允许匿名请求。 无论存储帐户的设置如何,你的数据将永远不可供匿名访问,除非具有适当权限的用户执行此额外步骤,以在容器上启用匿名访问。
禁止对存储帐户进行匿名访问会覆盖该存储帐户中所有容器的访问设置,从而阻止对该帐户中的 Blob 数据进行匿名访问。 当不允许帐户匿名访问时,无法将容器的访问设置配置为允许匿名访问,并且未来对该帐户的任何匿名请求都将失败。 在更改此设置之前,请务必了解这会对可能匿名访问存储帐户中数据的客户端应用程序带来的影响。 有关详细信息,请参阅阻止对容器和 Blob 的匿名读取访问。
重要
禁止对存储帐户进行匿名访问后,使用匿名持有者质询的客户端会发现 Azure 存储返回 403 错误(禁止访问)而不是 401 错误(未经授权)。 建议将所有容器设为专用以缓解此问题。 有关修改容器的匿名访问设置的详细信息,请参阅设置容器的访问级别。
允许或禁止匿名访问需要 Azure 存储资源提供程序的 2019-04-01 版或更高版本。 有关详细信息,请参阅 Azure 存储资源提供程序 REST API。
若要为存储帐户设置 AllowBlobAnonymousAccess 属性,用户必须有权创建和管理存储帐户。 提供这些权限的 Azure 基于角色的访问控制 (Azure RBAC) 角色包含 Microsoft.Storage/storageAccounts/write 操作。 具有此操作的内置角色包括:
角色分配的范围必须设定为存储帐户级别或更高级别,以禁止对存储帐户进行匿名访问。 有关角色范围的详细信息,请参阅了解 Azure RBAC 的范围。
注意,请仅向需要创建存储帐户或更新其属性的权限的那些管理用户分配这些角色。 使用最小特权原则确保用户拥有完成任务所需的最少权限。 有关使用 Azure RBAC 管理访问权限的详细信息,请参阅 Azure RBAC 最佳做法。
这些角色未提供通过 Microsoft Entra ID 访问存储帐户中数据的访问权限。 但是,它们包含 Microsoft.Storage/storageAccounts/listkeys/action,可以授予对帐户访问密钥的访问权限。 借助此权限,用户可以使用帐户访问密钥访问存储帐户中的所有数据。
Microsoft.Storage/storageAccounts/listkeys/action 本身通过帐户密钥授予数据访问权限,但不授予用户更改存储帐户的 AllowBlobPublicAccess 属性的能力。 对于需要访问你的存储帐户中的数据但不能更改该存储帐户配置的用户,请考虑分配存储 Blob 数据参与者、存储 Blob 数据读取者或读取者和数据访问等角色。
备注
经典订阅管理员角色“服务管理员”和“共同管理员”具有 Azure 资源管理器所有者角色的等效权限。 “所有者”角色包含所有操作,因此具有这些管理角色之一的用户也可以创建存储帐户和管理帐户配置。 有关详细信息,请参阅 Azure 角色、Azure AD 角色和经典订阅管理员角色。
若要允许或禁止对存储帐户的匿名访问,请设置帐户的 AllowBlobPublicAccess 属性。 此属性适用于使用 Azure 资源管理器部署模型创建的所有存储帐户。 有关详细信息,请参阅存储帐户概述。
若要在 Azure 门户中允许或禁止对存储帐户的匿名访问,请执行以下步骤:
导航到 Azure 门户中的存储帐户。
在“设置”下找到“配置”设置。
将“允许 Blob 匿名访问”设置为“启用”或“禁用”。
备注
禁止对存储帐户的匿名访问不会影响该存储帐户中承载的任何静态网站。 $web 容器始终可供公共访问。
更新存储帐户的匿名访问设置后,可能需要长达 30 秒的时间才能完全传播所做的更改。
如果为容器配置了匿名访问,则对该容器中 blob 的读取请求无需经过授权。 但是,针对存储帐户配置的任何防火墙规则仍有效,并将使用配置的 ACL 阻止内联流量。
允许或禁止匿名访问需要 Azure 存储资源提供程序的 2019-04-01 版或更高版本。 有关详细信息,请参阅 Azure 存储资源提供程序 REST API。
本部分中的示例演示了如何读取存储帐户的 AllowBlobPublicAccess 属性,以确定当前是允许还是禁止匿名访问。 若要了解如何验证帐户的匿名访问设置是否已配置为阻止匿名访问,请参阅修正存储帐户的匿名访问。
若要授予匿名用户对容器及其 Blob 的读取访问权限,请首先允许对存储帐户的匿名访问,然后设置容器的匿名访问级别。 如果存储帐户拒绝匿名访问,则无法为容器配置匿名访问。
注意
Azure 建议不允许匿名访问存储帐户中的 Blob 数据。
如果允许对存储帐户的匿名访问,则可以为容器配置以下权限:
- 无公共读取访问权限: 只有经授权的请求可以访问容器及其 Blob。 此选项是所有新容器的默认设置。
- 仅针对 Blob 的公共读取访问:可通过匿名请求读取容器中的 Blob,但容器数据不可匿名使用。 匿名客户端无法枚举容器中的 Blob。
- 对容器及其 Blob 的公共读取访问权限: 匿名请求可以读取容器和 blob 数据,但容器权限设置和容器元数据除外。 客户端可以通过匿名请求枚举容器中的 Blob,但无法枚举存储帐户中的容器。
无法更改单个 Blob 的匿名访问级别。 只能在容器级别设置匿名访问级别。 可以在创建容器时设置容器的匿名访问级别,也可以更新现有容器上的设置。
若要在 Azure 门户中更新一个或多个现有容器的匿名访问级别,请执行以下步骤:
在 Azure 门户中导航到存储帐户概述。
在菜单边栏选项卡上的“数据存储”下,选择“容器”。
选择要对其设置匿名访问级别的容器。
使用“更改访问级别”按钮显示匿名访问权限设置。
从“匿名访问级别”下拉列表中选择所需的匿名访问级别,然后选择“确定”按钮以应用对选定容器所做的更改。
当存储帐户不允许匿名访问时,无法设置容器的匿名访问级别。 如果尝试设置容器的匿名访问级别,则该设置将被禁用,因为该帐户不允许匿名访问。
可以通过列出容器并检查匿名访问设置来检查为一个或多个存储帐户中的哪些容器配置了匿名访问。 当存储帐户不包含大量容器或者当你正在检查少量存储帐户的设置时,此方法是一个可行的选项。 但是,如果你尝试枚举大量的容器,则性能可能会降低。
以下示例使用 PowerShell 获取某个存储帐户中所有容器的匿名访问设置。 请记得将括号中的占位符值替换为你自己的值:
$rgName = "<resource-group>"
$accountName = "<storage-account>"
$storageAccount = Get-AzStorageAccount -ResourceGroupName $rgName -Name $accountName
$ctx = $storageAccount.Context
Get-AzStorageContainer -Context $ctx | Select Name, PublicAccess
启用 Data Lake Storage Gen2、网络文件系统 (NFS) 3.0 协议或 SSH 文件传输协议 (SFTP) 可能会影响对此功能的支持。 如果已启用这些功能中的某一项,请参阅 Azure 存储帐户中的 Blob 存储功能支持,以评估对此功能的支持。