You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Policy配置疑问:禁止移除VM用户分配标识却影响VM创建

问题

需要创建一个Deny效果的Azure Policy,目标是阻止移除虚拟机(VM)的用户分配标识,但当前配置存在两个问题:

  1. 使用Terraform创建VM并分配标识时,该策略会限制VM的创建;
  2. 曾尝试通过指定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')]"
          }
        ]
      }
    }
  }
}

代码说明

  1. request.method 过滤规则:仅对PUT修改请求生效,直接排除创建VM的POST操作,解决策略限制VM创建的问题;
  2. if块中的not containsKey判断:捕获修改请求中不再包含指定用户分配标识的场景;
  3. existenceCondition验证:确认该VM在修改前原本就存在指定的用户分配标识;
  4. 只有当以上条件同时满足(即试图移除已存在的指定标识),策略才会触发Deny效果,既不影响VM创建,也能有效阻止标识被移除。

内容的提问来源于stack exchange,提问作者Srishti garg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:12:45