如何配置Azure Policy仅允许通过IaC方式创建Azure资源组
需求可行性结论
该需求完全可实现,核心通过Azure原生身份管控、策略管控能力组合实现,不需要额外采购第三方工具,最终可以做到除指定的Terraform Pipeline身份外,任何用户、其他服务主体都无法在订阅范围内创建资源组。
具体落地配置步骤
第一步:创建Pipeline专用服务主体
首先在Azure AD中注册独立的服务主体(SP),专门供集成Terraform的Azure Pipelines使用,禁止混用个人账号、其他业务系统的服务主体执行Terraform部署。将该服务主体配置为Azure Pipelines的Azure Resource Manager服务连接,赋予其订阅范围内的最小必要权限:包含资源组创建权限、Terraform管理生命周期内所需的对应资源操作权限即可,不要授予全局管理员、订阅所有者等高范围权限。同时严格限制该服务连接的访问权限,仅允许指定的IaC Pipeline调用,禁止其他Pipeline、个人用户获取该服务主体的凭证。第二步:部署订阅级拒绝式Azure Policy
自定义Azure策略定义,分配到目标订阅的根作用域,开启强制生效模式:- 策略匹配的操作类型为
Microsoft.Resources/subscriptions/resourceGroups/write,覆盖所有资源组创建、更新操作 - 策略判断逻辑:校验发起操作的主体ID,仅当主体是你提前创建的专用Pipeline服务主体时允许操作,其余主体发起的操作直接返回拒绝
- 配置必要的例外规则:一是排除Azure平台第一方托管服务主体的调用,避免影响Azure自带托管资源组的正常创建逻辑;二是可按需配置1-2个严格管控的应急破窗账号作为例外,这类账号默认保持禁用状态,仅在平台故障等紧急场景下临时启用,使用全程留痕审计。
刚上线策略的前1-2周可以先切换为审计模式,不实际拦截操作,仅记录所有非合规的资源组创建请求,梳理完所有合法例外场景后再开启强制拒绝,避免误伤正常业务。
- 策略匹配的操作类型为
第三步:约束Pipeline内的Terraform创建逻辑
在IaC Pipeline中增加前置校验规则,强制所有资源组必须通过Terraform的azurerm_resource_group资源声明创建:- 扫描Pipeline中所有执行脚本,禁止出现
az group create、New-AzResourceGroup等直接调用CLI/PS命令创建资源组的逻辑,一旦检测到直接阻断Pipeline运行 - 配置Terraform远程后端使用带版本控制、不可变锁的Azure存储账户存储状态文件,开启状态漂移检测,定期扫描实际资源和状态文件的差异,避免人工绕过Terraform改动资源组配置。
- 扫描Pipeline中所有执行脚本,禁止出现
第四步:配置审计告警闭环
开启订阅活动日志的诊断设置,将所有资源组操作、策略拦截日志同步到Log Analytics工作区,配置两类告警:- 所有被策略拒绝的资源组创建请求,实时推送给云管控团队
- 所有例外账号、非指定服务主体发起的资源组成功创建请求,触发高优先级告警,第一时间核实操作合法性
每月定期拉取审计日志做合规巡检,确保没有绕过管控的资源组创建行为。
关键注意事项
- 权限最小化是策略生效的基础:不要给普通用户、非IaC相关服务主体分配订阅级别的资源组写入权限,从权限层就缩小可绕过的范围
- 专用Pipeline服务主体的凭证要定期轮换,所有凭证仅存储在Azure Pipelines的加密服务连接、机密变量组中,严禁硬编码到代码仓库
- 不要随意扩大策略例外范围,所有例外账号、例外场景必须有明确的审批记录,定期清理不再需要的例外规则
内容的提问来源于stack exchange,提问作者Josh Ov
相关产品推荐
相关产品推荐

