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

如何通过Azure Policy验证VM是否安装指定扩展集?政策异常排查

解决Azure Policy仅评估第一个VM扩展的问题

大概率是你的Policy逻辑没处理好多扩展的遍历和匹配规则,或者用错了allOf/anyOf的组合,导致只校验第一个扩展就停止了。下面给你修正后的Policy和关键注意点:

修正后的完整Policy规则

{
  "mode": "Indexed",
  "policyRule": {
    "if": {
      "allOf": [
        {
          "field": "type",
          "equals": "Microsoft.Compute/virtualMachines"
        },
        {
          "field": "Microsoft.Compute/virtualMachines/storageProfile.osDisk.osType",
          "equals": "Windows"
        },
        {
          "not": {
            "allOf": [
              // 检查NetworkWatcherAgentWindows
              {
                "count": {
                  "field": "Microsoft.Compute/virtualMachines/extensions[*]",
                  "where": {
                    "allOf": [
                      {
                        "field": "Microsoft.Compute/virtualMachines/extensions[*].publisher",
                        "equals": "Microsoft.Azure.NetworkWatcher"
                      },
                      {
                        "field": "Microsoft.Compute/virtualMachines/extensions[*].type",
                        "equals": "NetworkWatcherAgentWindows"
                      }
                    ]
                  }
                },
                "greaterOrEquals": 1
              },
              // 检查ConfigurationforWindows
              {
                "count": {
                  "field": "Microsoft.Compute/virtualMachines/extensions[*]",
                  "where": {
                    "allOf": [
                      {
                        "field": "Microsoft.Compute/virtualMachines/extensions[*].publisher",
                        "equals": "Microsoft.Powershell"
                      },
                      {
                        "field": "Microsoft.Compute/virtualMachines/extensions[*].type",
                        "equals": "ConfigurationforWindows"
                      }
                    ]
                  }
                },
                "greaterOrEquals": 1
              },
              // 检查DependencyAgentWindows
              {
                "count": {
                  "field": "Microsoft.Compute/virtualMachines/extensions[*]",
                  "where": {
                    "allOf": [
                      {
                        "field": "Microsoft.Compute/virtualMachines/extensions[*].publisher",
                        "equals": "Microsoft.Azure.Monitoring.DependencyAgent"
                      },
                      {
                        "field": "Microsoft.Compute/virtualMachines/extensions[*].type",
                        "equals": "DependencyAgentWindows"
                      }
                    ]
                  }
                },
                "greaterOrEquals": 1
              },
              // 检查VMAccessAgent
              {
                "count": {
                  "field": "Microsoft.Compute/virtualMachines/extensions[*]",
                  "where": {
                    "allOf": [
                      {
                        "field": "Microsoft.Compute/virtualMachines/extensions[*].publisher",
                        "equals": "Microsoft.Compute"
                      },
                      {
                        "field": "Microsoft.Compute/virtualMachines/extensions[*].type",
                        "equals": "VMAccessAgent"
                      }
                    ]
                  }
                },
                "greaterOrEquals": 1
              },
              // 检查AzureDiskEncryption
              {
                "count": {
                  "field": "Microsoft.Compute/virtualMachines/extensions[*]",
                  "where": {
                    "allOf": [
                      {
                        "field": "Microsoft.Compute/virtualMachines/extensions[*].publisher",
                        "equals": "Microsoft.Azure.Security"
                      },
                      {
                        "field": "Microsoft.Compute/virtualMachines/extensions[*].type",
                        "equals": "AzureDiskEncryption"
                      }
                    ]
                  }
                },
                "greaterOrEquals": 1
              }
            ]
          }
        }
      ]
    },
    "then": {
      "effect": "audit"
    }
  },
  "parameters": {}
}

关键修正说明

  1. 用count函数遍历所有扩展:每个指定扩展都通过count统计VM上匹配的扩展数量,确保至少存在1个,避免只匹配第一个扩展的问题。
  2. 嵌套allOf逻辑:内层allOf要求所有指定扩展都满足存在条件,外层not表示只要有一个扩展缺失就触发审计(你可以根据需求改成deny或其他effect)。
  3. 准确匹配Publisher和Type:每个扩展的publisher必须和实际安装的一致,比如NetworkWatcherAgentWindows的发行商是Microsoft.Azure.NetworkWatcher,写错会导致匹配失败。
  4. 不干扰其他扩展:VM上的AzureSecurityCenter等其他扩展不会影响评估,因为我们只校验指定的5个扩展是否存在。

验证方法

  • 部署修正后的Policy,等待15-30分钟让Azure完成评估。
  • 找一台已知缺少某个指定扩展的Windows VM,查看Policy的合规状态,确认是否触发审计。
  • 如果还是有问题,用az vm extension list --resource-group <你的资源组名> --vm-name <VM名>命令查看VM上扩展的实际publisher和type,确保Policy里的参数完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 03:24:55