Azure Blob 存储中 Azure 角色分配条件的安全注意事项

若要使用基于 Azure 属性的访问控制(Azure ABAC)完全保护资源,还必须保护 Azure 角色分配条件中使用的属性。 例如,如果条件基于文件路径,则应注意,如果主体具有重命名文件路径的无限制权限,则可能会泄露访问。

本文介绍了您在考虑角色分配条件时应该注意的安全事项。

重要

Azure 基于属性的访问控制 (Azure ABAC) 已正式发布 (GA),用于使用标准和高级存储帐户性能层中的 requestresourceenvironmentprincipal 属性控制对 Azure Blob 存储、Azure Data Lake Storage Gen2 和 Azure 队列的访问。 目前,“容器元数据”资源属性和“列出 Blob 操作的所含内容”请求属性处于预览状态。 有关 Azure 存储 ABAC 的完整功能状态信息,请参阅 Azure 存储中条件功能的状态

有关适用于 Beta 版、预览版或尚未正式发布的 Azure 功能的法律条款,请参阅 适用于 Microsoft azure 预览版的补充使用条款

使用其他授权机制

仅当使用 Azure RBAC 进行授权时,才会评估角色分配条件。 如果允许使用备用授权方法进行访问,则可以绕过这些条件:

同样,在具有分层命名空间(HNS)的存储帐户中使用访问控制列表(ACL)授予访问权限时,不会评估条件。

可以通过 禁用存储帐户的共享密钥授权 来防止共享密钥、帐户级 SAS 和服务级别 SAS 授权。 由于用户委派 SAS 依赖于 Azure RBAC,因此在使用此方法授权时会评估角色分配条件。

保护在条件中使用的存储特性

Blob 路径

将 blob 路径用作条件 的@Resource 属性时,还应阻止用户在使用具有分层命名空间的帐户时重命名 Blob 以访问文件。 例如,如果要基于 Blob 路径创作条件,还应限制用户对以下作的访问权限:

行动 DESCRIPTION
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/move/action 此作允许客户使用路径创建 API 重命名文件。
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action 此操作使能够访问各种文件系统和路径操作。

blob 索引标记

Blob 索引标记 用作存储中条件的自由格式属性。 如果使用这些标记创作任何访问条件,则还必须保护标记本身。 具体而言, Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/write DataAction 允许用户修改存储对象上的标记。 可以限制此操作,以防止用户操控标记键或值以获取对未经授权对象的访问权限。

此外,如果在条件中使用了 Blob 索引标记,则在通过单独的操作更新数据和关联的索引标记的情况下,数据可能会易受攻击。 可以在 Blob 写入操作中使用 @Request 条件,以要求在同一更新操作中设置索引标签。 此方法可以从数据写入存储的瞬间开始帮助保护数据。

复制的 Blob 上的标记

默认情况下,使用 复制 Blob API 或其任何变体时,Blob 索引标记不会从源 Blob 复制到目标。 若要在复制时保留 Blob 的访问权限范围,还应复制标签。

快照上的标记

无法修改 Blob 快照上的标记。 因此,在拍摄快照之前,必须更新 Blob 上的标记。 如果更改基础 Blob 上的标记,其快照上的标记仍将保持其以前的值。

如果在创建快照后修改了基本 Blob 上的标记,则基本 Blob 和快照的访问范围可能有所不同。

Blob 版本上的标记

通过放置 Blob放置块列表复制 Blob API 创建 Blob 版本时,不会复制 Blob 索引标记。 可以通过这些 API 的标头指定标记。

可以在当前基本 Blob 和每个 Blob 版本上单独设置标记。 修改基本 Blob 上的标记时,以前的版本的标记不会更新。 如果要使用标记更改 Blob 及其所有版本的访问范围,则必须在每个版本上更新标记。

版本与快照的查询和筛选限制

使用标记查询和筛选容器中的 Blob 时,响应中仅包含基本 Blob。 不会包含具有所请求的键和值的 Blob 版本或快照。

角色和权限

如果对 Azure 内置角色使用角色分配条件,则应仔细查看角色授予给主体的所有权限。

继承的角色分配

可以为管理组、订阅、资源组、存储帐户或容器配置角色分配,并按规定顺序在每个级别继承。 Azure RBAC 具有累加模型,因此有效权限是每个级别的角色分配的总和。 如果通过多个角色分配为某个主体分配了相同的权限,则会在每个级别根据每个分配单独评估使用该权限执行的操作的访问权限。

由于条件作为角色分配的条件实现,因此任何无条件角色分配都允许用户绕过条件。 假设你将“存储 Blob 数据参与者”角色分配给了订阅中的某个存储帐户的用户,但只将某个条件添加到了该存储帐户的分配。 结果是用户通过订阅级别的角色分配对存储帐户的访问权限不受限制。

因此,应针对资源层次结构中的所有角色分配一致地应用条件。

其他注意事项

写入 Blob 的条件操作

许多写入 Blob 的操作需要 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/writeMicrosoft.Storage/storageAccounts/blobServices/containers/blobs/add/action 权限。 内置角色(如 存储 Blob 数据所有者存储 Blob 数据参与者 )向安全主体授予这两个权限。

在为这些角色定义角色分配条件时,应该对这两个权限使用相同的条件,以确保写操作的访问限制一致。

“复制 Blob”和“从 URL 复制 Blob”的行为

对于复制 Blob从 URL 复制 Blob 操作,只会针对目标 Blob 评估使用 Blob 路径作为 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/write 操作及其子操作中的特性的 @Request 条件。

对于源 Blob 上的条件,将评估 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/read 操作上的 @Resource 条件。

另请参阅