如何配置Azure Policy例外规则,允许特定资源部署私有DNS区域
实现方法
1. 编辑现有禁止策略
找到你之前创建的「禁止部署私有DNS区域」策略,进入定义编辑界面。
2. 修改策略规则逻辑
原策略是直接拒绝所有Microsoft.Network/privateDnsZones类型资源的创建,现在需要添加例外条件,通过allOf+not+anyOf的逻辑组合,实现「除指定场景外一律禁止」的效果。
核心逻辑
拒绝创建私有DNS区域,除非满足以下任一条件:
- DNS区域名称匹配AKS、PostgreSQL灵活服务器对应的私有链接域名后缀
- DNS区域已关联到AKS或PostgreSQL灵活服务器的私有端点
替换后的策略规则(JSON片段)
将原策略中if部分替换为以下代码:
"if": { "allOf": [ { "field": "type", "equals": "Microsoft.Network/privateDnsZones" }, { "not": { "anyOf": [ // 允许AKS相关私有DNS区域(匹配常见私有链接后缀) { "field": "name", "like": "*privatelink.azurecr.io" }, { "field": "name", "like": "*privatelink.azurecontainer.io" }, // 允许PostgreSQL灵活服务器的私有DNS区域 { "field": "name", "like": "*privatelink.postgres.database.azure.com" }, // 允许关联到AKS/PostgreSQL灵活服务器私有端点的DNS区域 { "count": { "field": "Microsoft.Network/privateDnsZones/privateEndpoints[*]", "where": { "anyOf": [ { "field": "Microsoft.Network/privateDnsZones/privateEndpoints[*].privateLinkServiceId", "contains": "Microsoft.ContainerService/managedClusters/" }, { "field": "Microsoft.Network/privateDnsZones/privateEndpoints[*].privateLinkServiceId", "contains": "Microsoft.DBforPostgreSQL/flexibleServers/" } ] } }, "greaterOrEquals": 1 } ] } } ] }, "then": { "effect": "Deny" }
3. 关键逻辑说明
- 针对PostgreSQL单实例服务器:其私有端点对应的资源类型是
Microsoft.DBforPostgreSQL/servers,不在上述允许的私有端点资源类型列表中,因此关联的私有DNS区域会被正常拒绝。 - 私有端点关联判断是最精准的方式,避免了仅靠域名后缀可能出现的误判。
- 如果需要新增其他允许的资源类型,只需在
anyOf的私有端点判断部分添加对应的资源类型标识即可。
4. 生效与验证
保存策略定义后,更新对应的策略分配,确保新规则生效。建议先在测试环境中验证以下场景:
- 尝试创建AKS/PostgreSQL灵活服务器关联的私有DNS区域,应允许通过
- 尝试创建PostgreSQL单实例服务器关联的私有DNS区域,应被拒绝
内容的提问来源于stack exchange,提问作者Aryan Gupta
相关产品推荐
相关产品推荐

