Azure Policy配置疑问:禁止移除VM用户分配标识却影响VM创建
问题
需要创建一个Deny效果的Azure Policy,目标是阻止移除虚拟机(VM)的用户分配标识,但当前配置存在两个问题:
- 使用Terraform创建VM并分配标识时,该策略会限制VM的创建;
- 曾尝试通过指定PUT方法让Terraform能创建VM,但此时仍能成功移除VM的用户分配标识。
需求是:仅对已存在的VM的修改操作生效,不影响VM创建,且仅在修改/PUT请求时触发,请问该需求是否可行?
现有Policy代码如下:
{ "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Compute/virtualMachines" }, { "field": "tags['network_environment']", "in": "[parameters('allowedEnvironments')]" } ] }, "then": { "effect": "deny", "details": { "type": "Microsoft.Compute/virtualMachines", "existenceCondition": { "allOf": [ { "not": { "field": "identity.type", "contains": "UserAssigned" } }, { "not": { "field": "identity.userAssignedIdentities", "containsKey": "[parameters('userAssignedIdentityResourceId')]" } } ] } } } }
解决方案
该需求完全可行,核心是通过区分资源创建与修改操作,并精准校验修改前后的标识状态来实现。
修改思路
- 过滤操作类型:仅对PUT请求(修改操作)生效,排除POST请求(创建操作),避免影响Terraform创建VM的流程;
- 校验状态变更:确保当VM原本已包含指定用户分配标识时,修改请求不能移除该标识。
修正后的Policy代码
{ "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Compute/virtualMachines" }, { "field": "tags['network_environment']", "in": "[parameters('allowedEnvironments')]" }, { "field": "request.method", "equals": "PUT" }, { "not": { "field": "identity.userAssignedIdentities", "containsKey": "[parameters('userAssignedIdentityResourceId')]" } } ] }, "then": { "effect": "deny", "details": { "existenceCondition": { "allOf": [ { "field": "identity.type", "contains": "UserAssigned" }, { "field": "identity.userAssignedIdentities", "containsKey": "[parameters('userAssignedIdentityResourceId')]" } ] } } } }
代码说明
request.method过滤规则:仅对PUT修改请求生效,直接排除创建VM的POST操作,解决策略限制VM创建的问题;if块中的not containsKey判断:捕获修改请求中不再包含指定用户分配标识的场景;existenceCondition验证:确认该VM在修改前原本就存在指定的用户分配标识;- 只有当以上条件同时满足(即试图移除已存在的指定标识),策略才会触发Deny效果,既不影响VM创建,也能有效阻止标识被移除。
内容的提问来源于stack exchange,提问作者Srishti garg
相关产品推荐
相关产品推荐

