求助:如何通过Azure Policy正确限制NSG的Any/Any RDP与SSH访问
排查Azure NSG策略问题:阻止任意源的SSH/RDP规则
我来帮你排查下当前策略的问题,核心是逻辑完全搞反了,还有几个关键细节没覆盖到,导致策略根本没按你预期的方式工作:
现有策略的核心问题
逻辑反转
你当前的策略逻辑是:当NSG规则的源地址不是*,同时目标端口是22/3389时执行拒绝。这就导致你想要允许的「受限源IP的SSH/RDP规则」被误拒绝,而你要阻止的「Any源的SSH/RDP规则」因为not equals *条件不成立,整个allOf判断失效,策略完全不会触发拒绝动作。未覆盖数组类型字段
Azure NSG规则支持用数组形式配置地址/端口,比如sourceAddressPrefixes(多源地址)、destinationPortRanges(多目标端口),你的策略只检查了单个值的字段,漏掉了数组场景下的*检测。缺少关键过滤条件
你没有限定规则是**入站(Inbound)和允许访问(Allow)**的情况——出站的SSH/RDP规则或者拒绝类型的规则,其实不需要做限制。
修正后的策略代码
下面是符合你需求的策略:仅当SSH/RDP规则的源地址被明确限制时允许创建,阻止任意源(*或Internet)的入站允许规则。
{ "if": { "allOf": [ { "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].direction", "equals": "Inbound" }, { "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].access", "equals": "Allow" }, { "anyOf": [ { "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRange", "in": ["22", "3389"] }, { "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRanges[*]", "in": ["22", "3389"] } ] }, { "anyOf": [ { "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].sourceAddressPrefix", "in": ["*", "Internet"] }, { "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].sourceAddressPrefixes[*]", "in": ["*", "Internet"] } ] } ] }, "then": { "effect": "deny" } }
策略逻辑说明
- 第一/第二个条件:仅针对入站且允许访问的规则,排除出站、拒绝规则的干扰;
- 第三个条件:同时覆盖单个目标端口(
destinationPortRange)和多目标端口数组(destinationPortRanges[*])的场景,检测是否包含22或3389; - 第四个条件:覆盖单个源地址(
sourceAddressPrefix)和多源地址数组(sourceAddressPrefixes[*])的场景,检测是否是*或等价的Internet; - 当所有条件满足时触发拒绝,正好实现你的需求:允许有明确源IP限制的SSH/RDP规则,阻止任意源的规则。
验证方法
你可以通过以下方式测试策略:
- 尝试创建「源地址为
*、目标端口22/3389的入站允许规则」,应该会被策略阻止; - 尝试创建「源地址为指定IP(比如你的办公公网IP)、目标端口22/3389的入站允许规则」,应该可以正常创建。
内容的提问来源于stack exchange,提问作者javierma14
相关产品推荐
相关产品推荐

