如何限制Azure特定服务主体仅创建带指定标签的资源?
问题修正方案
错误原因
- 资源类型使用错误:
azurerm_resource_policy_assignment用于将策略绑定到VM、存储账户这类Azure资源,无法绑定服务主体(服务主体属于Azure AD身份,不属于Azure资源范畴)。 - 策略规则未限定目标主体:原策略会拦截所有用户/身份的资源组创建操作,未实现仅针对特定服务主体生效的需求。
修正后的Terraform配置(tf.json)
{ "azurerm_policy_definition": { "custom_policy": { "name": "deny-resource-group-creation", "display_name": "Deny resource group creation without required tag for specific SP", "policy_type": "Custom", "mode": "All", "policy_rule": "{ \"if\": {\n \"allOf\": [\n {\n \"field\": \"type\",\n \"equals\": \"Microsoft.Resources/subscriptions/resourceGroups\"\n },\n {\n \"not\": {\n \"field\": \"tags['bla']\",\n \"equals\": \"bla\"\n }\n },\n {\n \"field\": \"identity.principalId\",\n \"equals\": \"${azuread_service_principal.cloud_sp.id}\"\n }\n ]\n },\n \"then\": {\n \"effect\": \"deny\"\n }}" } }, "azurerm_policy_assignment": { "resource_group_creation_policy_assignment": { "name": "resource-group-creation-policy-assignment", "scope": "/subscriptions/${azurerm_subscription.main.id}", "policy_definition_id": "${azurerm_policy_definition.custom_policy.id}" } } }
关键修改说明
- 新增主体校验规则:在策略规则中添加
identity.principalId校验,确保仅当请求由目标服务主体发起时,策略才会触发拒绝操作。 - 更换策略分配资源:使用
azurerm_policy_assignment替代azurerm_resource_policy_assignment,并指定scope为目标订阅ID,让策略覆盖整个订阅内的资源组创建操作。若需限定到特定资源组,可将scope改为对应资源组的ID。
注意事项
- 确保目标服务主体已通过RBAC获得创建资源组的权限,否则权限不足会先被RBAC拦截,策略无法触发。
- Azure策略生效存在延迟,通常需要15-30分钟左右才能完全生效。
内容的提问来源于stack exchange,提问作者Amal Khalaily
相关产品推荐
相关产品推荐

