如何通过Azure Blueprint创建管理组级Deny Assignment阻止角色读取Blob Storage内容
Azure Terraform State 存储权限隔离方案解答
可行性确认
可以实现你的需求,Azure Blueprint 完全支持在管理组层级创建 Deny Assignment 完成权限拦截,也可以搭配其他 Azure 原生能力实现更灵活的配置。
你的场景本质是拆分存储账户的管理平面权限和数据平面权限,属于 Azure RBAC 原生支持的权限隔离逻辑,不需要额外的第三方工具。
具体实现方案
方案一:使用 Azure Blueprint 实现全局管控
- 在管理组层级的蓝图 artifacts 中添加 Deny Assignment 规则,作用范围覆盖你需要管控的所有订阅/资源组
- 拦截的操作指定为 Blob 数据平面的读写操作:
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read、Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write - 拦截对象指定为 Owner、Contributor 角色对应的所有安全主体
- 配置排除项,将你用于 Terraform 流水线的服务主体加入排除列表,仅允许该主体拥有 Blob 数据的读写权限
- 配置完成后,Owner、Contributor 角色的用户仅能对存储账户做管理操作(比如修改配置、调整容量、删除账户等),无法直接访问 Blob 内存储的 Terraform State 内容,也无法自行生成 SAS Token 绕过权限限制。
方案二:不用 Blueprint 的轻量化替代方案
如果不需要全局管控所有存储账户,也可以用以下配置实现同等效果:
- 存储账户关闭公共访问、禁用本地访问密钥,强制所有 Blob 访问走 Azure AD 身份验证
- 给 Owner、Contributor 角色仅分配
Storage Account Contributor权限,该权限仅包含存储账户管理平面操作权限,没有任何 Blob 数据的访问权限 - 单独给 Terraform 服务主体分配存储账户对应容器的
Storage Blob Data Contributor权限 - 可以额外搭配 Azure Policy 规则,禁止所有非指定的安全主体被分配 Blob 数据相关权限,避免用户自行放开权限。
注意事项
- Deny Assignment 的优先级高于所有 Allow 类型的 RBAC 权限,配置前务必确认要排除的服务主体清单,避免 Terraform 流水线无法读写 State 文件导致部署失败。
- 可以额外给存储账户开启 Blob 版本控制、软删除、资源锁,防止 State 文件被误操作损坏或丢失。
内容的提问来源于stack exchange,提问作者dschniepp
相关产品推荐
相关产品推荐

