Azure 存储对容器和 blob 支持可选的匿名读取访问。 默认情况下,系统从不允许匿名访问你的数据。 除非你显式启用匿名访问,否则对容器及其 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。
禁止匿名访问的权限
要为存储账户设置 AllowBlobPublicAccess 属性,你需要创建和管理存储账户的权限。 提供这些权限的 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 数据读取者或 读取者和数据访问等角色。
注意
经典订阅管理员角色服务管理员和 Co-Administrator 包括 Azure 资源管理器 所有者 角色的等效功能。 “所有者”角色包含所有操作,因此具有这些管理角色之一的用户也可以创建存储帐户和管理帐户配置。 有关详细信息,请参阅 Azure 角色、Microsoft Entra 角色和经典订阅管理员角色。
设置存储帐户的 AllowBlobPublicAccess 属性
若要允许或禁止对存储帐户的匿名访问,请设置帐户的 AllowBlobPublicAccess 属性。 该属性适用于你通过 Azure 资源管理器 部署模型创建的所有存储账户。 有关详细信息,请参阅 存储帐户概述。
- Azure 门户
- PowerShell
- Azure CLI
- 模板
若要在 Azure 门户中允许或禁止对存储帐户的匿名访问,请执行以下步骤:
在 Azure 门户中,转到你的存储帐户。
在设置下找到配置设置。
将“允许 Blob 匿名访问”设置为“启用”或“禁用”。
注意
不允许对存储账户进行匿名访问不会影响该存储账户中托管的任何静态网站。 $web容器始终可公开访问。
更新存储账户的匿名访问设置后,变更可能要等长达30秒才能完全传播。
如果为容器配置了匿名访问,则对该容器中 blob 的读取请求无需经过授权。 不过,你为存储账户配置的任何防火墙规则仍然有效,并且会阻断与已配置ACL相关的流量。
以下示例展示了如何读取存储账户的 AllowBlobPublicAccess 属性,以判断当前是否允许匿名访问。 若要了解如何验证帐户的匿名访问设置是否已配置为阻止匿名访问,请参阅 修正存储帐户的匿名访问。
为容器设置匿名访问级别
若要授予匿名用户对容器及其 Blob 的读取访问权限,请首先允许对存储帐户的匿名访问,然后设置容器的匿名访问级别。 开始之前,确保账户层面允许匿名访问(通过 AllowBlobPublicAccess 属性),并且你对容器有写权限。 如果存储账户的匿名访问被拒绝,你就无法为容器配置匿名访问。
注意
Azure 建议不允许匿名访问存储帐户中的 Blob 数据。
当你允许存储账户匿名访问时,你可以配置一个具有以下权限的容器:
- 无公开阅读访问 (门户: 私密;PowerShell: 关闭):容器及其blob只能通过授权请求访问。 此选项是所有新容器的默认设置。
- 仅对 blobs 进行公开读取访问 (门户和 PowerShell: Blob):容器内的 blob 可以通过匿名请求读取,但容器数据无法匿名获取。 匿名客户端无法枚举容器中的 Blob。
- 容器及其 blob 的公开读取权限(门户和 PowerShell:Container):容器和 blob 数据可以通过匿名请求读取,但容器权限设置和容器元数据除外。 客户端可以通过匿名请求枚举容器中的 blob,但不能在存储账户中枚举容器。
无法更改单个 Blob 的匿名访问级别。 只需在容器层面设置匿名访问级别。 可以在创建容器时设置容器的匿名访问级别,也可以更新现有容器上的设置。
- Azure 门户
- PowerShell
- Azure CLI
- 模板
若要在 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 存储功能支持 ,以评估对此功能的支持。