如何阻止使用不合规现有Subnet创建Azure虚拟机?
如何阻止Azure虚拟机使用不合规的现有子网
要阻止虚拟机使用已关联“允许互联网访问”NSG的现有子网,你需要创建Deny类型的Azure自定义策略,针对虚拟机/网卡的创建/更新操作做合规检查。以下是具体实现步骤:
核心思路
通过Policy规则关联子网与对应的NSG,检查NSG是否存在允许互联网入站的规则。如果存在,直接拒绝虚拟机(或其网卡)的创建请求。
步骤1:编写自定义Policy规则
下面是一个示例Policy定义,逻辑是:
- 监控虚拟机网卡的创建/更新操作
- 提取网卡关联的子网ID
- 通过子网ID获取绑定的NSG
- 检查NSG是否包含入站允许
0.0.0.0/0的规则 - 若存在此类规则,触发Deny
{ "properties": { "displayName": "Deny VM creation using subnets with internet-accessible NSGs", "policyType": "Custom", "mode": "Indexed", "description": "Blocks creation of virtual machines (or their network interfaces) that use subnets associated with NSGs allowing inbound internet access.", "parameters": {}, "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Network/networkInterfaces" }, { "value": "[reference(concat('Microsoft.Network/virtualNetworks/', split(field('Microsoft.Network/networkInterfaces/ipConfigurations[0].subnet.id'), '/')[8], '/subnets/', split(field('Microsoft.Network/networkInterfaces/ipConfigurations[0].subnet.id'), '/')[10]), '2023-04-01').networkSecurityGroup.id]", "notEquals": "" }, { "count": { "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]", "where": { "allOf": [ { "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].direction", "equals": "Inbound" }, { "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].access", "equals": "Allow" }, { "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationAddressPrefix", "equals": "0.0.0.0/0" } ] } }, "greaterOrEquals": 1 } ] }, "then": { "effect": "Deny" } } } }
步骤2:部署并分配Policy
- 在Azure门户中进入Policy服务,选择定义 > + 自定义定义,粘贴上述JSON并完成创建。
- 找到刚创建的自定义Policy,选择分配,指定要应用的范围(订阅/资源组),按需设置排除项。
- 保存分配后,新的虚拟机创建请求如果使用不合规子网,会被直接阻止。
注意事项
- 该Policy仅阻止新创建或更新的虚拟机/网卡,不会影响已存在的不合规虚拟机。
- 若需要覆盖更复杂的NSG规则(比如包含
Internet服务标签、非精确0.0.0.0/0的前缀),可修改Policy中的destinationAddressPrefix条件,比如用contains或in匹配多种前缀。 - 测试阶段建议先将
effect设为Audit,验证规则逻辑无误后再改为Deny,避免误拦截正常业务。
内容的提问来源于stack exchange,提问作者Mahmood Abushaireh
相关产品推荐
相关产品推荐

