确定导致非符合性的原因

当 Azure 资源被确定为不符合策略规则时,了解该资源的哪一部分不符合规则很有用。 这也有助于了解哪项更改改变了以前合规的资源,导致它现在不合规。 可通过两种方法查找此信息:

合规性详细信息

当资源不符合时,“策略符合性”页中将提供该资源的符合性详细信息。 符合性详细信息窗格包含以下信息:

  • 名称、类型、位置和资源 ID 等资源详细信息。
  • 上次评估当前策略分配时的合规性状态和时间戳。
  • 资源不合规的原因列表。

重要

由于不符合资源的符合性详细信息显示该资源属性的当前值,因此用户必须对资源类型进行读取操作。 例如,如果不合规资源是 Microsoft.Compute/virtualMachines,则用户必须具有 Microsoft.Compute/virtualMachines/read 操作。 如果用户没有进行所需操作,则会显示访问错误。

若要查看符合性详细信息,请执行以下步骤:

  1. 在 Azure 门户中选择“所有服务”,然后搜索并选择“策略”,启动 Azure Policy 服务。

  2. 在“概览”或“符合性”页,选择“符合性状态”为“不符合”的策略 。

  3. 在“策略合规性”页的“资源合规性”选项卡中,选择并按住(或右键单击)或直接选择“合规性状态”为“不合规”的资源的省略号。 然后选择“查看符合性详细信息”。

    Screenshot of the View compliance details link on the Resource compliance tab.

  4. “符合性详细信息”窗格显示对当前策略分配最近进行的计算得出的信息。 在此示例中,发现字段“Microsoft.Sql/servers/version”为“12.0”,而策略定义预期为“14.0”。 如果资源不符合有多种原因,则此窗格将列出每个原因。

    Screenshot of the Compliance details pane and reasons for non-compliance that current value is 12 and target value is 14.

    对于“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": {
            ...
          }
        }
      }
    }
    

    Screenshot of Compliance details pane for ifNotExists including evaluated resource count.

注意

为保护数据,当属性值为“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资源提供程序模式原因映射到策略定义中约束模板的负责状态:

Reason 约束模板原因说明
Constraint/TemplateCreateFailed 无法为策略定义创建资源,该策略定义的约束/模板与群集上现有约束/模板的资源元数据名称不匹配。
Constraint/TemplateUpdateFailed 无法为策略定义创建资源,该策略定义的约束/模板与群集上现有约束/模板的资源元数据名称不匹配。
Constraint/TemplateInstallFailed 约束/模板未能生成,并且无法安装在群集上以进行创建或更新操作。
ConstraintTemplateConflicts 模板与一个或多个使用不同源的相同模板名称的策略定义存在冲突。
ConstraintStatusStale 存在现有的“审核”状态,但 Gatekeeper 在过去一小时内未执行审核。
ConstraintNotProcessed 没有状态,并且 Gatekeeper 在过去一小时内未执行审核。
InvalidConstraint/Template 由于以下原因之一,资源被拒绝:约束模板 Rego 内容无效、YAML 无效或约束与约束模板之间的参数类型不匹配(在需要整数时提供字符串值)。

注意

对于群集上已有的策略分配和约束模板,如果该约束/模板失败,则通过维护现有的约束/模板来保护群集。 除非解决策略分配或加载项自我修复上的失败,否则群集将报告为不合规。 有关处理冲突的详细信息,请参阅约束模板冲突

资源提供程序模式的组件详细信息

对于使用资源提供程序模式的分配,请选择不合规的资源,以查看其组件符合性记录。 “组件符合性”选项卡显示特定于资源提供程序模式的详细信息,例如组件名称、组件 ID 和类型

Screenshot of Component Compliance dashboard and compliance details for assignments with a Resource Provider mode.

来宾配置的合规性详细信息

对于“来宾配置”类别中的策略定义,虚拟机内可能有多个计算设置,你需要查看各个设置的详细信息。 例如,如果你正在审核一个安全设置列表,其中只有一个安全设置的状态为“不合规”,这时你需要了解具体哪些设置不合规以及不合规的原因

你也可能无权直接登录到虚拟机,但需要报告虚拟机不符合的原因。

Azure 门户

首先遵循合规性详细信息部分中的相同步骤查看策略合规性详细信息。

在“符合性详细信息”窗格视图中,选择“上次计算的资源”链接。

Screenshot of viewing the auditIfNotExists definition compliance details.

“来宾分配”页显示所有可用的符合性详细信息。 视图中的每一行都代表在计算机中执行的计算。 “原因”列中显示描述来宾分配“不符合”原因的短语。 例如,如果要审核密码策略,“原因”列将显示包含每个设置当前值的文本。

Screenshot of the Guest Assignment compliance details.

大规模查看配置分配详细信息

来宾配置功能可以在 Azure Policy 分配之外使用。 例如,可以在部署计算机时分配配置。 若要查看租户中的所有来宾配置分配,请从 Azure 门户打开“来宾分配”页面。 若要查看详细的合规性信息,请使用“名称”列中的链接选择每个分配

Screenshot of the Guest Assignment page.

后续步骤