如何配置Azure Policy阻止NSG创建公网RDP/SSH入站规则?
问题分析与解决方案
你的原策略失效主要有两个核心原因:
- 只检查了单值形式的地址前缀和端口范围,没覆盖Azure NSG支持的数组格式(比如
sourceAddressPrefixes、destinationPortRanges) - 未包含
Internet服务标签(JIT创建规则时可能会用这个标识互联网源)
修正后的自定义策略定义
{ "properties": { "displayName": "阻止创建允许任意互联网源访问RDP/SSH端口的NSG入站规则", "policyType": "Custom", "mode": "Indexed", "metadata": { "version": "1.1.0", "category": "网络安全组" }, "parameters": {}, "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Network/networkSecurityGroups/securityRules" }, { "field": "Microsoft.Network/networkSecurityGroups/securityRules/direction", "equals": "Inbound" }, { "field": "Microsoft.Network/networkSecurityGroups/securityRules/access", "equals": "Allow" }, { "anyOf": [ // 检查单值源地址前缀 { "field": "Microsoft.Network/networkSecurityGroups/securityRules/sourceAddressPrefix", "in": ["*", "0.0.0.0/0", "Internet"] }, // 检查数组形式的源地址前缀 { "count": { "field": "Microsoft.Network/networkSecurityGroups/securityRules/sourceAddressPrefixes[*]", "where": { "field": "Microsoft.Network/networkSecurityGroups/securityRules/sourceAddressPrefixes[*]", "in": ["*", "0.0.0.0/0", "Internet"] } }, "greaterOrEquals": 1 } ] }, { "anyOf": [ // 检查单值目标端口范围 { "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange", "in": ["22", "3389", "*"] }, // 检查数组形式的目标端口范围 { "count": { "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRanges[*]", "where": { "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRanges[*]", "in": ["22", "3389", "*"] } }, "greaterOrEquals": 1 }, // 检查端口范围包含22/3389的情况(比如1-65535) { "anyOf": [ { "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange", "contains": "22" }, { "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange", "contains": "3389" } ] } ] } ] }, "then": { "effect": "Deny" } } } }
关键修正点说明
- 覆盖数组格式:通过
count函数检查数组字段sourceAddressPrefixes和destinationPortRanges,确保只要数组中包含违规值就会被拦截。 - 加入服务标签:新增
Internet标签的检查,覆盖JIT自动创建规则的场景。 - 端口范围兼容:补充检查包含22/3389的端口范围(比如
1-65535),避免通过宽泛端口范围绕过规则。
更简便的实现方式
直接使用Azure内置策略:
- 限制RDP访问到批准的IP地址:内置策略ID为
e372f1c6-f971-4cb8-b8b0-f83d39278562,可配置允许的IP范围,自动拦截任意互联网源的RDP规则。 - 限制SSH访问到批准的IP地址:内置策略ID为
22730e10-96f6-4aac-ad84-9383d35b5917,功能类似,针对SSH端口。
如果需要同时拦截RDP和SSH,可将这两个内置策略分配到同一作用域,或者基于内置策略修改合并成一个自定义策略。
内容的提问来源于stack exchange,提问作者Elliot
相关产品推荐
相关产品推荐

