确定导致非符合性的原因
当 Azure 资源被确定为不符合策略规则时,了解该资源的哪一部分不符合规则很有用。 这也有助于了解哪项更改改变了以前合规的资源,导致它现在不合规。 可通过两种方法查找此信息:
合规性详细信息
当资源不符合时,“策略符合性”页中将提供该资源的符合性详细信息。 符合性详细信息窗格包含以下信息:
- 名称、类型、位置和资源 ID 等资源详细信息。
- 上次评估当前策略分配时的合规性状态和时间戳。
- 资源不合规的原因列表。
重要
由于不符合资源的符合性详细信息显示该资源属性的当前值,因此用户必须对资源类型进行读取操作。 例如,如果不合规资源是 Microsoft.Compute/virtualMachines
,则用户必须具有 Microsoft.Compute/virtualMachines/read
操作。 如果用户没有进行所需操作,则会显示访问错误。
若要查看符合性详细信息,请执行以下步骤:
在 Azure 门户中选择“所有服务”,然后搜索并选择“策略”,启动 Azure Policy 服务。
在“概览”或“符合性”页,选择“符合性状态”为“不符合”的策略 。
在“策略合规性”页的“资源合规性”选项卡中,选择并按住(或右键单击)或直接选择“合规性状态”为“不合规”的资源的省略号。 然后选择“查看符合性详细信息”。
“符合性详细信息”窗格显示对当前策略分配最近进行的计算得出的信息。 在此示例中,发现字段“
Microsoft.Sql/servers/version
”为“12.0”,而策略定义预期为“14.0”。 如果资源不符合有多种原因,则此窗格将列出每个原因。对于“
auditIfNotExists
”或“deployIfNotExists
”策略定义,详细信息包括“details.type”属性和任何可选属性。 有关列表,请参阅 auditIfNotExists 属性和 deployIfNotExists 属性。 “上一个计算资源”为定义的“详细信息”部分中的相关资源。部分
deployIfNotExists
定义示例:{ "if": { "field": "type", "equals": "[parameters('resourceType')]" }, "then": { "effect": "deployIfNotExists", "details": { "type": "Microsoft.Insights/metricAlerts", "existenceCondition": { "field": "name", "equals": "[concat(parameters('alertNamePrefix'), '-', resourcegroup().name, '-', field('name'))]" }, "existenceScope": "subscription", "deployment": { ... } } } }
注意
为保护数据,当属性值为“secret”时,当前值显示星号。
这些详细信息将解释资源当前不合规的原因,但不显示何时对该资源做出了更改,导致它不合规。
符合性原因
常规资源管理器模式合规性原因
原因 | 条件 |
---|---|
当前值必须包含目标值作为关键值。 | containsKey 或不为 notContainsKey |
当前值必须包含目标值。 | contains 或不为 notContains |
当前值必须等于目标值。 | equals 或不为 notEquals |
当前值必须小于目标值。 | less 或不为 greaterOrEquals |
当前值必须大于或等于目标值。 | greaterOrEquals 或不为 less |
当前值必须大于目标值。 | greater 或不为 lessOrEquals |
当前值必须小于或等于目标值。 | lessOrEquals 或不为 greater |
当前值必须存在。 | exists |
当前值必须在目标值中。 | in 或不为 notIn |
当前值必须与目标值类似。 | like 或不为 notLike |
当前值必须与目标值匹配(区分大小写)。 | match 或不为 notMatch |
当前值必须与目标值匹配(不区分大小写)。 | matchInsensitively 或不为 notMatchInsensitively |
当前值不得包含目标值作为关键值。 | notContainsKey 或不为 containsKey |
当前值不得包含目标值。 | notContains 或不为 contains |
当前值不得等于目标值。 | notEquals 或不为 equals |
不能存在当前值。 | 不能为 exists |
当前值不得存在于目标值中。 | notIn 或不为 in |
当前值不得与目标值类似。 | notLike 或不为 like |
当前值不得与目标值匹配(区分大小写)。 | notMatch 或不为 match |
当前值不得与目标值匹配(不区分大小写)。 | notMatchInsensitively 或不为 matchInsensitively |
没有与策略定义中的效果详细信息匹配的相关资源。 | 类型在 then.details.type 中定义,且与策略规则“if”部分定义的资源相关的资源不存在。 |
Azure Policy 资源提供程序模式合规性原因
下表将每个Microsoft.PolicyInsights
资源提供程序模式原因代码映射到其相应的说明:
合规性原因代码 | 错误消息和说明 |
---|---|
NonModifiablePolicyAlias | NonModifiableAliasConflict:在使用 API 版本“{apiVersion}”的请求中,别名“{alias}”不可修改。 如果在请求使用的 API 版本中,别名不支持“修改”效果或只支持不同令牌类型的“修改”效果,就会发生此错误。 |
AppendPoliciesNotApplicable | AppendPoliciesUnableToAppend:在使用 API 版本“{ apiVersion }”的请求中,别名“{ aliases }”不可修改。 如果在请求使用的 API 版本中,别名不支持“修改”效果或只支持不同令牌类型的“修改”效果,就会发生这种情况。 |
ConflictingAppendPolicies | ConflictingAppendPolicies:发现修改“{notApplicableFields}”字段的策略分配发生冲突。 策略标识符:“{policy}”。 请联系订阅管理员更新策略分配。 |
AppendPoliciesFieldsExist | AppendPoliciesFieldsExistWithDifferentValues:策略分配尝试追加已存在于请求中且含不同值的字段。 字段:“{existingFields}”。 策略标识符:“{policy}”。 请联系订阅管理员更新策略。 |
AppendPoliciesUndefinedFields | AppendPoliciesUndefinedFields:发现策略定义引用 API 版本“{apiVersion}”的未定义字段属性。 字段:“{nonExistingFields}”。 策略标识符:“{policy}”。 请联系订阅管理员更新策略。 |
MissingRegistrationForType | MissingRegistrationForResourceType:未针对资源类型“{ResourceType}”注册订阅。 请检查该资源类型是否存在,以及是否注册了该资源类型。 |
AmbiguousPolicyEvaluationPaths | 请求内容有一个或多个不明确的路径:策略“{1}”需要“{0}”。 |
InvalidResourceNameWildcardPosition | 无法评估与策略定义“{1}”相关的策略分配“{0}”。 ifNotExists 条件中的资源名称“{2}”在无效位置包含通配符“?”。 通配符只能独自位于段中名称的末尾,(例如 TopLevelResourceName/?)。 请修复策略或移除策略分配以取消阻止。 |
TooManyResourceNameSegments | 无法评估与策略定义“{1}”相关的策略分配“{0}”。 ifNotExists 条件中的资源名称“{2}”包含过多的名称段。 名称段数必须等于或小于类型段数(不包括资源提供程序命名空间)。 请修复策略定义,或移除策略分配以取消阻止。 |
InvalidPolicyFieldPath | 策略定义中的字段路径“{0}”无效。 字段路径不得包含空段。 它们只能包含字母数字字符,但用于拆分段的“.”字符和用于访问数组属性的“[*]”字符序列除外。 |
AKS 资源提供程序模式合规性原因
下表将每个Microsoft.Kubernetes.Data
资源提供程序模式原因映射到策略定义中约束模板的负责状态:
原因 | 约束模板原因说明 |
---|---|
Constraint/TemplateCreateFailed | 无法为策略定义创建资源,该策略定义的约束/模板与群集上现有约束/模板的资源元数据名称不匹配。 |
Constraint/TemplateUpdateFailed | 无法为策略定义创建资源,该策略定义的约束/模板与群集上现有约束/模板的资源元数据名称不匹配。 |
Constraint/TemplateInstallFailed | 约束/模板未能生成,并且无法安装在群集上以进行创建或更新操作。 |
ConstraintTemplateConflicts | 模板与一个或多个使用不同源的相同模板名称的策略定义存在冲突。 |
ConstraintStatusStale | 存在现有的“审核”状态,但 Gatekeeper 在过去一小时内未执行审核。 |
ConstraintNotProcessed | 没有状态,并且 Gatekeeper 在过去一小时内未执行审核。 |
InvalidConstraint/Template | 由于以下原因之一,资源被拒绝:约束模板 Rego 内容无效、YAML 无效或约束与约束模板之间的参数类型不匹配(在需要整数时提供字符串值)。 |
注意
对于群集上已有的策略分配和约束模板,如果该约束/模板失败,则通过维护现有的约束/模板来保护群集。 除非解决策略分配或加载项自我修复上的失败,否则群集将报告为不合规。 有关处理冲突的详细信息,请参阅约束模板冲突。
资源提供程序模式的组件详细信息
对于使用资源提供程序模式的分配,请选择不合规的资源,以查看其组件符合性记录。 “组件符合性”选项卡显示特定于资源提供程序模式的详细信息,例如组件名称、组件 ID 和类型。
来宾配置的合规性详细信息
对于“来宾配置”类别中的策略定义,虚拟机内可能有多个计算设置,你需要查看各个设置的详细信息。 例如,如果你正在审核一个安全设置列表,其中只有一个安全设置的状态为“不合规”,这时你需要了解具体哪些设置不合规以及不合规的原因。
你也可能无权直接登录到虚拟机,但需要报告虚拟机不符合的原因。
Azure 门户
首先遵循合规性详细信息部分中的相同步骤查看策略合规性详细信息。
在“符合性详细信息”窗格视图中,选择“上次计算的资源”链接。
“来宾分配”页显示所有可用的符合性详细信息。 视图中的每一行都代表在计算机中执行的计算。 “原因”列中显示描述来宾分配“不符合”原因的短语。 例如,如果要审核密码策略,“原因”列将显示包含每个设置当前值的文本。
大规模查看配置分配详细信息
来宾配置功能可以在 Azure Policy 分配之外使用。 例如,可以在部署计算机时分配配置。 若要查看租户中的所有来宾配置分配,请从 Azure 门户打开“来宾分配”页面。 若要查看详细的合规性信息,请使用“名称”列中的链接选择每个分配。
后续步骤
- 在 Azure Policy 示例中查看示例。
- 查看 Azure Policy 定义结构。
- 查看了解策略效果。
- 了解如何以编程方式创建策略。
- 了解如何获取符合性数据。
- 了解如何修正不符合的资源。
- 参阅使用 Azure 管理组来组织资源,了解什么是管理组。