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

创建Azure Policy拒绝启用RDP端口的VM及NSG生效异常求助

解决Azure Policy无法拦截创建VM时自动开启RDP端口的问题

问题原因

你当前的Policy只针对Microsoft.Network/networkSecurityGroups或其安全规则做校验,但通过VM创建向导勾选“允许RDP访问”时,Azure会在同一个部署流程里同时创建VM、关联的NSG以及自动添加RDP规则。因为原Policy没把VM资源纳入评估范围,所以漏掉了这种间接创建NSG规则的场景。

修正后的Policy配置

需要扩展Policy规则,同时覆盖两种场景:直接创建含RDP规则的NSG,以及创建会自动添加RDP规则的VM。

完整Policy JSON代码

{
  "mode": "Indexed",
  "policyRule": {
    "if": {
      "anyOf": [
        // 场景1:直接创建/修改NSG,包含入站允许3389端口的规则
        {
          "allOf": [
            {
              "field": "type",
              "equals": "Microsoft.Network/networkSecurityGroups"
            },
            {
              "count": {
                "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
                "where": {
                  "allOf": [
                    {
                      "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].direction",
                      "equals": "Inbound"
                    },
                    {
                      "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].access",
                      "equals": "Allow"
                    },
                    {
                      "anyOf": [
                        {
                          "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRange",
                          "equals": "3389"
                        },
                        {
                          "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRanges[*]",
                          "equals": "3389"
                        }
                      ]
                    }
                  ]
                }
              },
              "greaterOrEquals": 1
            }
          ]
        },
        // 场景2:创建VM时自动开启RDP(即关联的NSG会被自动添加3389规则)
        {
          "allOf": [
            {
              "field": "type",
              "equals": "Microsoft.Compute/virtualMachines"
            },
            {
              "value": "[if(contains(field('Microsoft.Compute/virtualMachines/networkProfile.networkInterfaces[*].id'), '/networkInterfaces/'), resourceId('Microsoft.Network/networkInterfaces', split(last(split(field('Microsoft.Compute/virtualMachines/networkProfile.networkInterfaces[*].id'), '/')), '/')[0]), '')]",
              "exists": true,
              "match": {
                "field": "Microsoft.Network/networkInterfaces/networkSecurityGroup.id",
                "exists": true,
                "match": {
                  "count": {
                    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
                    "where": {
                      "allOf": [
                        {
                          "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].direction",
                          "equals": "Inbound"
                        },
                        {
                          "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].access",
                          "equals": "Allow"
                        },
                        {
                          "anyOf": [
                            {
                              "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRange",
                              "equals": "3389"
                            },
                            {
                              "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRanges[*]",
                              "equals": "3389"
                            }
                          ]
                        }
                      ]
                    }
                  },
                  "greaterOrEquals": 1
                }
              }
            }
          ]
        }
      ]
    },
    "then": {
      "effect": "Deny"
    }
  },
  "parameters": {}
}

核心调整点

  • 加入VM资源校验:新增对Microsoft.Compute/virtualMachines的评估,通过关联关系检查VM对应的网络接口和NSG是否自动添加了RDP规则。
  • 跨资源关联验证:用Policy的match函数把VM、网络接口、NSG串联起来,确保间接创建的规则也能被检测到。
  • 覆盖所有端口配置方式:同时检查单个端口(destinationPortRange)和端口数组(destinationPortRanges),避免遗漏批量端口设置的情况。

测试步骤

  1. 将这个修正后的Policy部署到你的订阅,设置生效方式为Deny。
  2. 尝试通过Azure门户创建VM并勾选“允许RDP访问”选项,此时应该会收到Policy拦截警告,无法完成部署。
  3. 再测试直接创建含3389入站规则的NSG,确认原有拦截逻辑依然正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:48:08