Azure Policy需求:管理组级别拒绝创建CIDR重复的新VNet
管理组级别VNet CIDR重复检测的Azure Policy实现
需求说明
创建Azure Policy,当新创建的虚拟网络(VNet)的CIDR地址段与管理组级别下所有现有VNet的CIDR重复时,拒绝该VNet的创建,避免IP地址重叠引发的资源通信问题。
原示例的局限性
你提供的原Policy仅能检测当前订阅内的VNet CIDR,无法覆盖管理组下跨订阅的VNet资源,因此无法满足需求。
正确的Policy示例
以下是实现管理组级别CIDR重复检测的完整Policy定义:
{ "mode": "All", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Network/virtualNetworks" }, { "anyOf": [ { "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]", "in": "[listResources('Microsoft.Network/virtualNetworks', 'all', managementGroup().name).[*].addressSpace.addressPrefixes[*]]" } ] } ] }, "then": { "effect": "deny" } }, "parameters": {}, "metadata": { "category": "Network" } }
关键逻辑说明
- 资源类型匹配:通过
field: type匹配所有Microsoft.Network/virtualNetworks类型的资源,确保Policy仅作用于VNet创建/更新操作。 - 跨订阅VNet CIDR查询:使用
listResources函数,指定管理组范围(managementGroup().name),获取该管理组下所有订阅中所有VNet的CIDR地址段列表。 - 重复检测:通过
in运算符检查待创建VNet的任意CIDR是否存在于上述查询到的CIDR列表中,若存在则触发拒绝操作。
注意事项
- 分配范围:需将该Policy分配到目标管理组,而非单个订阅,确保覆盖所有下级订阅的VNet资源。
- 权限配置:分配Policy时需启用系统托管身份,并为该身份授予管理组范围内的Reader角色,确保其有权读取所有下级订阅的VNet资源信息。
- 重叠检测扩展:若需要检测CIDR地址段的重叠(而非精确重复,如
10.0.0.0/16与10.0.0.0/24),需使用ipRangeContains函数构建更复杂的逻辑判断。
内容的提问来源于stack exchange,提问作者Bolaji Yusuf
相关产品推荐
相关产品推荐

