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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 18:18:10