Azure Policy合规评估异常:已启用诊断的Azure Firewall被标记不合规
Azure Firewall诊断设置合规性策略问题排查与修复
问题描述
自定义Azure Policy用于检查Azure Firewall是否启用Logs和Metrics,但所有已开启诊断设置的实例均被标记为不合规,不合规提示异常显示:字段type的当前值与目标值均为"Microsoft.Network/azureFirewalls",却提示“当前值不得等于目标值”。
问题根源
原Policy存在两处核心逻辑错误:
- 存在条件的匹配逻辑错误:直接使用
logs[*].enabled和metrics[*].enabled等于true,要求所有日志类别和指标类别必须全部启用才合规,但实际场景中用户通常仅启用必要类别,或存在多个诊断设置分别管理日志/指标,这种写法会导致只要有一个类别未启用就判定不合规。 - 子资源检查范围不明确:未指定
existenceScope,Azure Policy对子资源的检查范围可能出现歧义,导致评估逻辑异常。
修复后的Policy JSON
{ "mode": "Indexed", "policyRule": { "if": { "field": "type", "equals": "Microsoft.Network/azureFirewalls" }, "then": { "effect": "[parameters('effect')]", "details": { "type": "Microsoft.Insights/diagnosticSettings", "existenceScope": "resource", "existenceCondition": { "allOf": [ { "anyOf": [ { "field": "Microsoft.Insights/diagnosticSettings/logs[*].enabled", "equals": "true" } ] }, { "anyOf": [ { "field": "Microsoft.Insights/diagnosticSettings/metrics[*].enabled", "equals": "true" } ] } ] } } } }, "parameters": { "effect": { "type": "String", "metadata": { "displayName": "Effect", "description": "Enable or disable the execution of the policy." }, "allowedValues": [ "Audit", "Disabled" ], "defaultValue": "Audit" } } }
关键修改说明
- 新增
existenceScope: resource:明确指定在当前Azure Firewall资源范围内检查诊断设置,消除范围歧义。 - 调整存在条件逻辑:将日志和指标的检查分别包裹在
anyOf中,确保至少有一个日志类别和至少有一个指标类别被启用即可判定合规,匹配实际使用场景。- 如果需要强制启用特定日志/指标类别,可进一步指定名称,例如检查应用规则日志:
{ "field": "Microsoft.Insights/diagnosticSettings/logs[?contains(name, 'AzureFirewallApplicationRule')].enabled", "equals": "true" }
- 如果需要强制启用特定日志/指标类别,可进一步指定名称,例如检查应用规则日志:
验证步骤
- 部署修复后的Policy,等待15-30分钟让评估生效。
- 手动触发重新评估:Azure门户进入「Policy」→「合规性」→ 点击「重新评估」。
- 查看合规性结果,确认已开启诊断设置的实例显示为合规。
内容的提问来源于stack exchange,提问作者Rakesh Singh
相关产品推荐
相关产品推荐

