创建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),避免遗漏批量端口设置的情况。
测试步骤
- 将这个修正后的Policy部署到你的订阅,设置生效方式为
Deny。 - 尝试通过Azure门户创建VM并勾选“允许RDP访问”选项,此时应该会收到Policy拦截警告,无法完成部署。
- 再测试直接创建含3389入站规则的NSG,确认原有拦截逻辑依然正常工作。
内容的提问来源于stack exchange,提问作者dileep pappala
相关产品推荐
相关产品推荐

