获取 Azure 资源的符合性数据

Azure Policy 的最大优势之一在于它针对订阅或订阅管理组中的资源提供的见解和控制度。 此控制措施可用于防止在错误的位置创建资源,强制使用通用且一致的标记,或审核现有资源以确保配置和设置正确。 在所有情况下,数据都由 Azure Policy 生成,使你能够了解环境的符合性状态。

在查看合规性数据之前,请务必了解 Azure Policy 中的符合性状态

可通过多种方式访问策略和计划分配生成的符合性信息:

在探讨符合性报告方法之前,让我们了解符合性信息的更新时间和频率,以及触发评估周期的事件。

评估触发器

已完成的评估周期的结果通过 PolicyStatesPolicyEvents 操作在 Microsoft.PolicyInsights 资源提供程序中获取。 有关 Azure Policy Insights REST API 操作的详细信息,请参阅 。

已分配的策略和计划的评估会在各种事件后发生:

  • 最近已将策略或计划分配到某个范围。 将分配应用于定义的范围大约需要五分钟,然后会根据新分配的策略或计划对适用的资源启动评估周期。 根据使用的效果,将资源标记为合规、不合规、豁免或未知。 针对大范围的资源评估的大型策略或计划可能需要花费一段时间,因此,在评估周期何时完成方面,无法预先定义预期目标。 完成评估后,更新的符合性结果会在门户和 SDK 中提供。

  • 更新了已分配到某个范围的策略或计划。 此场景的评估周期和计时与新的范围分配相同。

  • 资源将通过 Azure 资源管理器、REST API 或受支持的 SDK 部署到包含分配的范围或在其中进行更新。 在此场景中,个体资源的效果事件(追加、审核、拒绝、部署)和符合性状态将在大约 15 分钟后出现在门户与 SDK 中。 此事件不会导致对其他资源进行评估。

  • 管理组层次结构中创建或移动订阅(资源类型 Microsoft.Resources/subscriptions),并有一个针对订阅资源类型的已分配策略定义。 评估订阅支持的效果(audit、auditIfNotExist、deployIfNotExists、modify),日志记录和任何修正操作大约需要 30 分钟。

  • 创建、更新或删除了策略豁免。 在此方案中,会为定义的豁免范围评估相应的分配。

  • 标准符合性评估周期。 分配每隔 24 小时自动重新评估一次。 涉及大量资源的大型策略或计划可能需要花费一段时间,因此,在评估周期何时完成方面,无法预先定义预期目标。 完成评估后,更新的符合性结果会在门户和 SDK 中提供。

  • 来宾配置资源提供程序通过受管理资源更新了符合性详细信息。

  • 按需扫描

注意

根据设计,Azure Policy 免除 Microsoft.Resources 资源提供程序 (RP) 下的所有资源的策略评估,但可以评估的订阅和资源组除外。

按需评估扫描

可以使用 Azure CLI、Azure PowerShell、对 REST API 的调用或通过使用 Azure Policy 符合性扫描 GitHub 操作来启动对订阅或资源组的评估扫描。 此扫描是一个异步过程。

按需评估扫描 - GitHub 操作

使用 Azure Policy 符合性扫描操作可从 GitHub 工作流中触发对一个或多个资源、资源组或订阅的按需评估扫描,并基于资源的符合性状态来限制该工作流。 还可以将该工作流配置为按计划的时间运行,从而在方便时获取最新的符合性状态。 或者,GitHub Actions 还可以生成有关已扫描资源的合规性状态报告,以便进一步分析或存档。

以下示例对订阅运行符合性扫描。

on:
  schedule:
    - cron:  '0 8 * * *'  # runs every morning 8am
jobs:
  assess-policy-compliance:
    runs-on: ubuntu-latest
    steps:
    - name: Login to Azure
      uses: azure/login@v1
      with:
        creds: ${{secrets.AZURE_CREDENTIALS}}

    - name: Check for resource compliance
      uses: azure/policy-compliance-scan@v0
      with:
        scopes: |
          /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

有关详细信息和工作流示例,请参阅“适用于 Azure Policy 符合性扫描的 GitHub Actions”存储库

按需评估扫描 - Azure CLI

符合性扫描从 az policy state trigger-scan 命令开始。

默认情况下,az policy state trigger-scan 开始评估当前订阅中的所有资源。 若要对特定资源组开始评估,请使用 resource-group 参数。 以下示例启动对 MyRG 资源组的当前订阅的符合性扫描:

az policy state trigger-scan --resource-group "MyRG"

利用 no-wait 参数,可以选择在继续之前不等待异步过程完成。

按需评估扫描 - Azure PowerShell

符合性扫描从 Start-AzPolicyComplianceScan cmdlet 开始。

默认情况下,Start-AzPolicyComplianceScan 开始评估当前订阅中的所有资源。 若要对特定资源组进行评估,请使用 ResourceGroupName 参数。 以下示例启动对 MyRG 资源组的当前订阅的符合性扫描:

Start-AzPolicyComplianceScan -ResourceGroupName 'MyRG'

你可以让 PowerShell 在提供结果输出前等待完成异步调用,或者将其作为作业在后台运行。 若要通过 PowerShell 作业在后台运行符合性扫描,请使用“Asob”参数,并将值设置为对象,例如本示例中的 $job

$job = Start-AzPolicyComplianceScan -AsJob

你可以通过检查 $job 对象来检查作业的状态。 作业类型为 Microsoft.Azure.Commands.Common.AzureLongRunningJob。 使用 $job 对象上的 Get-Member 查看可用的属性和方法。

在运行符合性扫描时,检查 $job 对象会输出结果,如下所示:

$job

Id     Name              PSJobTypeName     State         HasMoreData     Location             Command
--     ----              -------------     -----         -----------     --------             -------
2      Long Running O... AzureLongRunni... Running       True            localhost            Start-AzPolicyCompliance...

符合性扫描完成后,“状态”属性更改为“已完成”。

按需评估扫描 - REST

作为异步进程,启动扫描的 REST 终结点不是等到扫描完成才能响应。 而是提供一个 URI,用于查询请求的评估的状态。

在每个 REST API URI 中,包含替换为自己的值所使用的变量:

  • {YourRG} - 替换为资源组的名称
  • {subscriptionId} - 替换为订阅 ID

扫描支持评估订阅或资源组中的资源。 使用以下 URI 结构,通过 REST API POST 命令开始按范围扫描:

  • 订阅

    POST https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/triggerEvaluation?api-version=2019-10-01
    
  • 资源组

    POST https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{YourRG}/providers/Microsoft.PolicyInsights/policyStates/latest/triggerEvaluation?api-version=2019-10-01
    

该调用返回“202 Accepted”状态。 响应标头中包含 Location 属性,格式如下:

https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/asyncOperationResults/{ResourceContainerGUID}?api-version=2019-10-01

以静态方式为请求的范围生成了 {ResourceContainerGUID}。 如果某个范围已在运行按需扫描,则不会启动新扫描。 而是为新请求的状态提供相同的 {ResourceContainerGUID} 位置 URL。 在评估过程中,位置 URI 的 REST API GET 命令返回“202 Accepted”状态 。 评估扫描完成后,返回“200 OK”状态。 已完成的扫描的正文为 JSON 响应,其状态为:

{
    "status": "Succeeded"
}

门户

Azure 门户展示了一个图形体验用于可视化和了解环境中的符合性状态。 在“策略”页上,“概述”选项提供了策略和计划符合性的可用范围的详细信息。 除了符合性状态和每个分配的计数以外,该页还包含一个图表,显示过去七天的符合性。 “符合性”页包含上述大量相同信息(图表除外),但提供附加的筛选和排序选项。

“合规性”页面、筛选选项和详细信息的屏幕截图。

由于策略或计划可分配到不同的范围,因此表中包含每个分配的范围,以及分配的定义类型。 还提供每个分配项中不合规资源和不合规策略的数量。 选择表中的某个策略或计划可以更深入地了解该特定分配的合规性。

“合规性详细信息”页面的屏幕截图,包括计数和资源合规性详细信息。

“资源符合性”选项卡上的资源列表显示当前分配的现有资源的评估状态。 此选项卡默认为“不符合”,但是可以进行筛选。 由创建资源的请求触发的事件(追加、审核、拒绝、部署、修改)会显示在“事件”选项卡下。

“合规性详细信息”页面上“事件”选项卡的屏幕截图。

对于资源提供程序模式资源,在“资源符合性”选项卡上,选择资源,或右键单击行并选择“查看符合性详细信息”,即可打开组件符合性详细信息 。 该页面还提供了选项卡,以查看分配给此资源、事件、组件事件和更改历史记录的策略。

资源提供程序模式分配“组件合规性”选项卡及合规性详细信息的屏幕截图。

返回资源符合性页面,选择并按住(或右键单击)要收集其更多详细信息的事件所在的行,然后选择“显示活动日志”。 活动日志页将会打开,其中的搜索结果经过预先筛选,显示分配和事件的详细信息。 活动日志提供了有关这些事件的更多上下文和信息。

Azure Policy 活动和评估的活动日志屏幕截图。

注意

可以在门户中通过 Azure Resource Graph 查询导出合规性结果。

命令行

可以使用 REST API(包括使用 ARMClient)、Azure PowerShell 和 Azure CLI 来检索门户中提供的相同信息。 有关 REST API 的完整详细信息,请参阅 Azure Policy 参考文章。

对于 REST API 示例,使用 ARMClient 或类似工具来处理对 Azure 的身份验证。

汇总结果

使用 REST API 时,可以按容器、定义或分配进行汇总。 下面是使用 Azure 策略见解的按订阅汇总功能在订阅级别执行的汇总示例:

POST https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/summarize?api-version=2019-10-01

输出将汇总订阅。 在以下示例输出中,汇总的符合性位于 value.results.nonCompliantResourcesvalue.results.nonCompliantPolicies 下面。 此请求提供更多详细信息,包括构成不合规数的每个分配,以及每个分配的定义信息。 层次结构中的每个策略对象提供一个可用于获取该级别的更多详细信息的 queryResultsUri。

{
    "@odata.context": "https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#summary",
    "@odata.count": 1,
    "value": [{
        "@odata.id": null,
        "@odata.context": "https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#summary/$entity",
        "results": {
            "queryResultsUri": "https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$from=2018-05-18 04:28:22Z&$to=2018-05-19 04:28:22Z&$filter=ComplianceState eq 'NonCompliant'",
            "nonCompliantResources": 15,
            "nonCompliantPolicies": 1
        },
        "policyAssignments": [{
            "policyAssignmentId": "/subscriptions/{subscriptionId}/resourcegroups/rg-tags/providers/microsoft.authorization/policyassignments/37ce239ae4304622914f0c77",
            "policySetDefinitionId": "",
            "results": {
                "queryResultsUri": "https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$from=2018-05-18 04:28:22Z&$to=2018-05-19 04:28:22Z&$filter=ComplianceState eq 'NonCompliant' and PolicyAssignmentId eq '/subscriptions/{subscriptionId}/resourcegroups/rg-tags/providers/microsoft.authorization/policyassignments/37ce239ae4304622914f0c77'",
                "nonCompliantResources": 15,
                "nonCompliantPolicies": 1
            },
            "policyDefinitions": [{
                "policyDefinitionReferenceId": "",
                "policyDefinitionId": "/providers/microsoft.authorization/policydefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62",
                "effect": "deny",
                "results": {
                    "queryResultsUri": "https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$from=2018-05-18 04:28:22Z&$to=2018-05-19 04:28:22Z&$filter=ComplianceState eq 'NonCompliant' and PolicyAssignmentId eq '/subscriptions/{subscriptionId}/resourcegroups/rg-tags/providers/microsoft.authorization/policyassignments/37ce239ae4304622914f0c77' and PolicyDefinitionId eq '/providers/microsoft.authorization/policydefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62'",
                    "nonCompliantResources": 15
                }
            }]
        }]
    }]
}

查询资源

在上面的示例中,value.policyAssignments.policyDefinitions.results.queryResultsUri 提供了一个示例 URI,用于特定策略定义的所有不符合资源。 在 $filter 值中,ComplianceState 等于 (eq)“NonCompliant”,PolicyAssignmentId 是针对策略定义,然后针对 PolicyDefinitionId 本身指定的。 在筛选器中包含 PolicyAssignmentId 的原因是,PolicyDefinitionId 可能在具有不同范围的多个策略或计划分配中存在。 通过指定 PolicyAssignmentId 和 PolicyDefinitionId,可以明确指定想要查找的结果。 以前,我们使用了 latest 作为 PolicyStates,因此将起始截止时间范围自动设置成了过去 24 小时。

https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$from=2018-05-18 04:28:22Z&$to=2018-05-19 04:28:22Z&$filter=ComplianceState eq 'NonCompliant' and PolicyAssignmentId eq '/subscriptions/{subscriptionId}/resourcegroups/rg-tags/providers/microsoft.authorization/policyassignments/37ce239ae4304622914f0c77' and PolicyDefinitionId eq '/providers/microsoft.authorization/policydefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62'

为简洁起见,以下示例响应已被截断,只显示一个不符合资源。 详细响应包含有关资源、策略或计划以及分配的多个数据片段。 请注意,还可以查看已将哪些分配参数传递给了策略定义。

{
    "@odata.context": "https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest",
    "@odata.count": 15,
    "value": [{
        "@odata.id": null,
        "@odata.context": "https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
        "timestamp": "2018-05-19T04:41:09Z",
        "resourceId": "/subscriptions/{subscriptionId}/resourceGroups/rg-tags/providers/Microsoft.Compute/virtualMachines/linux",
        "policyAssignmentId": "/subscriptions/{subscriptionId}/resourceGroups/rg-tags/providers/Microsoft.Authorization/policyAssignments/37ce239ae4304622914f0c77",
        "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62",
        "effectiveParameters": "",
        "ComplianceState": "NonCompliant",
        "subscriptionId": "{subscriptionId}",
        "resourceType": "/Microsoft.Compute/virtualMachines",
        "resourceLocation": "chinanorth2",
        "resourceGroup": "RG-Tags",
        "resourceTags": "tbd",
        "policyAssignmentName": "37ce239ae4304622914f0c77",
        "policyAssignmentOwner": "tbd",
        "policyAssignmentParameters": "{\"tagName\":{\"value\":\"costCenter\"},\"tagValue\":{\"value\":\"Contoso-Test\"}}",
        "policyAssignmentScope": "/subscriptions/{subscriptionId}/resourceGroups/RG-Tags",
        "policyDefinitionName": "1e30110a-5ceb-460c-a204-c1c3969c6d62",
        "policyDefinitionAction": "deny",
        "policyDefinitionCategory": "tbd",
        "policySetDefinitionId": "",
        "policySetDefinitionName": "",
        "policySetDefinitionOwner": "",
        "policySetDefinitionCategory": "",
        "policySetDefinitionParameters": "",
        "managementGroupIds": "",
        "policyDefinitionReferenceId": ""
    }]
}

查看事件

创建或更新资源时,将生成策略评估结果。 结果称为“策略事件”。 使用以下 URI 查看与订阅关联的最近策略事件。

https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyEvents/default/queryResults?api-version=2019-10-01

结果应如以下示例所示:

{
    "@odata.context": "https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyEvents/$metadata#default",
    "@odata.count": 1,
    "value": [{
        "@odata.id": null,
        "@odata.context": "https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyEvents/$metadata#default/$entity",
        "NumAuditEvents": 16
    }]
}

有关查询策略事件的详细信息,请参阅 Azure Policy 事件参考文章。

Azure CLI

适用于 Azure Policy 的 Azure CLI 命令组涵盖 REST 或 Azure PowerShell 中提供的大多数操作。 有关可用命令的完整列表,请参阅 Azure CLI - Azure Policy 概述

示例:获取不符合资源数最多的、最前面的已分配策略的状态摘要。

az policy state summarize --top 1

响应的上半部分如以下示例所示:

{
    "odatacontext": "https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#summary/$entity",
    "odataid": null,
    "policyAssignments": [{
            "policyAssignmentId": "/subscriptions/{subscriptionId}/providers/microsoft.authorization/policyassignments/e0704696df5e4c3c81c873e8",
            "policyDefinitions": [{
                "effect": "audit",
                "policyDefinitionGroupNames": [
                    ""
                ],
                "policyDefinitionId": "/subscriptions/{subscriptionId}/providers/microsoft.authorization/policydefinitions/2e3197b6-1f5b-4b01-920c-b2f0a7e9b18a",
                "policyDefinitionReferenceId": "",
                "results": {
                    "nonCompliantPolicies": null,
                    "nonCompliantResources": 398,
                    "policyDetails": [{
                        "complianceState": "noncompliant",
                        "count": 1
                    }],
                    "policyGroupDetails": [{
                        "complianceState": "noncompliant",
                        "count": 1
                    }],
                    "queryResultsUri": "https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$from=2020-07-14 14:01:22Z&$to=2020-07-15 14:01:22Z and PolicyAssignmentId eq '/subscriptions/{subscriptionId}/providers/microsoft.authorization/policyassignments/e0704696df5e4c3c81c873e8' and PolicyDefinitionId eq '/subscriptions/{subscriptionId}/providers/microsoft.authorization/policydefinitions/2e3197b6-1f5b-4b01-920c-b2f0a7e9b18a'",
                    "resourceDetails": [{
                            "complianceState": "noncompliant",
                            "count": 398
                        },
                        {
                            "complianceState": "compliant",
                            "count": 4
                        }
                    ]
                }
            }],
    ...

示例:获取最近评估的资源的状态记录(默认按时间戳的降序排序)。

az policy state list --top 1
[
  {
    "complianceReasonCode": "",
    "complianceState": "Compliant",
    "effectiveParameters": "",
    "isCompliant": true,
    "managementGroupIds": "{managementgroupId}",
    "odatacontext": "https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
    "odataid": null,
    "policyAssignmentId": "/subscriptions/{subscriptionId}/providers/microsoft.authorization/policyassignments/securitycenterbuiltin",
    "policyAssignmentName": "SecurityCenterBuiltIn",
    "policyAssignmentOwner": "tbd",
    "policyAssignmentParameters": "",
    "policyAssignmentScope": "/subscriptions/{subscriptionId}",
    "policyAssignmentVersion": "",
    "policyDefinitionAction": "auditifnotexists",
    "policyDefinitionCategory": "tbd",
    "policyDefinitionGroupNames": [
      ""
    ],
    "policyDefinitionId": "/providers/microsoft.authorization/policydefinitions/aa633080-8b72-40c4-a2d7-d00c03e80bed",
    "policyDefinitionName": "aa633080-8b72-40c4-a2d7-d00c03e80bed",
    "policyDefinitionReferenceId": "identityenablemfaforownerpermissionsmonitoring",
    "policyDefinitionVersion": "",
    "policyEvaluationDetails": null,
    "policySetDefinitionCategory": "security center",
    "policySetDefinitionId": "/providers/Microsoft.Authorization/policySetDefinitions/1f3afdf9-d0c9-4c3d-847f-89da613e70a8",
    "policySetDefinitionName": "1f3afdf9-d0c9-4c3d-847f-89da613e70a8",
    "policySetDefinitionOwner": "",
    "policySetDefinitionParameters": "",
    "policySetDefinitionVersion": "",
    "resourceGroup": "",
    "resourceId": "/subscriptions/{subscriptionId}",
    "resourceLocation": "",
    "resourceTags": "tbd",
    "resourceType": "Microsoft.Resources/subscriptions",
    "subscriptionId": "{subscriptionId}",
    "timestamp": "2020-07-15T08:37:07.903433+00:00"
  }
]

示例:获取所有不符合虚拟网络资源的详细信息。

az policy state list --filter "ResourceType eq 'Microsoft.Network/virtualNetworks'"
[
  {
    "complianceReasonCode": "",
    "complianceState": "NonCompliant",
    "effectiveParameters": "",
    "isCompliant": false,
    "managementGroupIds": "{managementgroupId}",
    "odatacontext": "https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
    "odataid": null,
    "policyAssignmentId": "/subscriptions/{subscriptionId}/providers/microsoft.authorization/policyassignments/e0704696df5e4c3c81c873e8",
    "policyAssignmentName": "e0704696df5e4c3c81c873e8",
    "policyAssignmentOwner": "tbd",
    "policyAssignmentParameters": "",
    "policyAssignmentScope": "/subscriptions/{subscriptionId}",
    "policyAssignmentVersion": "",
    "policyDefinitionAction": "audit",
    "policyDefinitionCategory": "tbd",
    "policyDefinitionGroupNames": [
      ""
    ],
    "policyDefinitionId": "/subscriptions/{subscriptionId}/providers/microsoft.authorization/policydefinitions/2e3197b6-1f5b-4b01-920c-b2f0a7e9b18a",
    "policyDefinitionName": "2e3197b6-1f5b-4b01-920c-b2f0a7e9b18a",
    "policyDefinitionReferenceId": "",
    "policyDefinitionVersion": "",
    "policyEvaluationDetails": null,
    "policySetDefinitionCategory": "",
    "policySetDefinitionId": "",
    "policySetDefinitionName": "",
    "policySetDefinitionOwner": "",
    "policySetDefinitionParameters": "",
    "policySetDefinitionVersion": "",
    "resourceGroup": "RG-Tags",
    "resourceId": "/subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Microsoft.Network/virtualNetworks/RG-Tags-vnet",
    "resourceLocation": "chinanorth2",
    "resourceTags": "tbd",
    "resourceType": "Microsoft.Network/virtualNetworks",
    "subscriptionId": "{subscriptionId}",
    "timestamp": "2020-07-15T08:37:07.901911+00:00"
  }
]

示例:获取在特定日期后发生的、与不符合虚拟网络资源相关的事件。

az policy state list --filter "ResourceType eq 'Microsoft.Network/virtualNetworks'" --from '2020-07-14T00:00:00Z'
[
  {
    "complianceReasonCode": "",
    "complianceState": "NonCompliant",
    "effectiveParameters": "",
    "isCompliant": false,
    "managementGroupIds": "{managementgroupId}",
    "odatacontext": "https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
    "odataid": null,
    "policyAssignmentId": "/subscriptions/{subscriptionId}/providers/microsoft.authorization/policyassignments/e0704696df5e4c3c81c873e8",
    "policyAssignmentName": "e0704696df5e4c3c81c873e8",
    "policyAssignmentOwner": "tbd",
    "policyAssignmentParameters": "",
    "policyAssignmentScope": "/subscriptions/{subscriptionId}",
    "policyAssignmentVersion": "",
    "policyDefinitionAction": "audit",
    "policyDefinitionCategory": "tbd",
    "policyDefinitionGroupNames": [
      ""
    ],
    "policyDefinitionId": "/subscriptions/{subscriptionId}/providers/microsoft.authorization/policydefinitions/2e3197b6-1f5b-4b01-920c-b2f0a7e9b18a",
    "policyDefinitionName": "2e3197b6-1f5b-4b01-920c-b2f0a7e9b18a",
    "policyDefinitionReferenceId": "",
    "policyDefinitionVersion": "",
    "policyEvaluationDetails": null,
    "policySetDefinitionCategory": "",
    "policySetDefinitionId": "",
    "policySetDefinitionName": "",
    "policySetDefinitionOwner": "",
    "policySetDefinitionParameters": "",
    "policySetDefinitionVersion": "",
    "resourceGroup": "RG-Tags",
    "resourceId": "/subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Microsoft.Network/virtualNetworks/RG-Tags-vnet",
    "resourceLocation": "chinanorth2",
    "resourceTags": "tbd",
    "resourceType": "Microsoft.Network/virtualNetworks",
    "subscriptionId": "{subscriptionId}",
    "timestamp": "2020-07-15T08:37:07.901911+00:00"
  }
]

Azure PowerShell

适用于 Azure Policy 的 Azure PowerShell 模块在 PowerShell 库中以 Az.PolicyInsights 的形式提供。 使用 PowerShellGet,可以使用 Install-Module -Name Az.PolicyInsights 安装模块(请确保已安装了最新版 Azure PowerShell):

# Install from PowerShell Gallery via PowerShellGet
Install-Module -Name Az.PolicyInsights

# Import the downloaded module
Import-Module Az.PolicyInsights

# Login with Connect-AzAccount
Connect-AzAccount -Environment AzureChinaCloud

该模块拥有以下 cmdlet:

  • Get-AzPolicyStateSummary
  • Get-AzPolicyState
  • Get-AzPolicyEvent
  • Get-AzPolicyRemediation
  • Remove-AzPolicyRemediation
  • Start-AzPolicyRemediation
  • Stop-AzPolicyRemediation

示例:获取不符合资源数最多的、最前面的已分配策略的状态摘要。

PS> Get-AzPolicyStateSummary -Top 1

NonCompliantResources : 15
NonCompliantPolicies  : 1
PolicyAssignments     : {/subscriptions/{subscriptionId}/resourcegroups/RG-Tags/providers/micros
                        oft.authorization/policyassignments/37ce239ae4304622914f0c77}

示例:获取最近评估的资源的状态记录(默认按时间戳的降序排序)。

PS> Get-AzPolicyState -Top 1

Timestamp                  : 5/22/2018 3:47:34 PM
ResourceId                 : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Mi
                             crosoft.Network/networkInterfaces/linux316
PolicyAssignmentId         : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Mi
                             crosoft.Authorization/policyAssignments/37ce239ae4304622914f0c77
PolicyDefinitionId         : /providers/Microsoft.Authorization/policyDefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62
ComplianceState            : NonCompliant
SubscriptionId             : {subscriptionId}
ResourceType               : /Microsoft.Network/networkInterfaces
ResourceLocation           : chinanorth2
ResourceGroup              : RG-Tags
ResourceTags               : tbd
PolicyAssignmentName       : 37ce239ae4304622914f0c77
PolicyAssignmentOwner      : tbd
PolicyAssignmentParameters : {"tagName":{"value":"costCenter"},"tagValue":{"value":"Contoso-Test"}}
PolicyAssignmentScope      : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags
PolicyDefinitionName       : 1e30110a-5ceb-460c-a204-c1c3969c6d62
PolicyDefinitionAction     : deny
PolicyDefinitionCategory   : tbd

示例:获取所有不符合虚拟网络资源的详细信息。

PS> Get-AzPolicyState -Filter "ResourceType eq '/Microsoft.Network/virtualNetworks'"

Timestamp                  : 5/22/2018 4:02:20 PM
ResourceId                 : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Mi
                             crosoft.Network/virtualNetworks/RG-Tags-vnet
PolicyAssignmentId         : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Mi
                             crosoft.Authorization/policyAssignments/37ce239ae4304622914f0c77
PolicyDefinitionId         : /providers/Microsoft.Authorization/policyDefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62
ComplianceState            : NonCompliant
SubscriptionId             : {subscriptionId}
ResourceType               : /Microsoft.Network/virtualNetworks
ResourceLocation           : chinanorth2
ResourceGroup              : RG-Tags
ResourceTags               : tbd
PolicyAssignmentName       : 37ce239ae4304622914f0c77
PolicyAssignmentOwner      : tbd
PolicyAssignmentParameters : {"tagName":{"value":"costCenter"},"tagValue":{"value":"Contoso-Test"}}
PolicyAssignmentScope      : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags
PolicyDefinitionName       : 1e30110a-5ceb-460c-a204-c1c3969c6d62
PolicyDefinitionAction     : deny
PolicyDefinitionCategory   : tbd

示例:获取在某个特定日期之后发生的与不符合的虚拟网络资源相关的事件,转换为 CSV 对象,并导出到文件。

$policyEvents = Get-AzPolicyEvent -Filter "ResourceType eq '/Microsoft.Network/virtualNetworks'" -From '2020-09-19'
$policyEvents | ConvertTo-Csv | Out-File 'C:\temp\policyEvents.csv'

$policyEvents 对象的输出类似于以下输出:

Timestamp                  : 9/19/2020 5:18:53 AM
ResourceId                 : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Mi
                             crosoft.Network/virtualNetworks/RG-Tags-vnet
PolicyAssignmentId         : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Mi
                             crosoft.Authorization/policyAssignments/37ce239ae4304622914f0c77
PolicyDefinitionId         : /providers/Microsoft.Authorization/policyDefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62
ComplianceState            : NonCompliant
SubscriptionId             : {subscriptionId}
ResourceType               : /Microsoft.Network/virtualNetworks
ResourceLocation           : chinaeast
ResourceGroup              : RG-Tags
ResourceTags               : tbd
PolicyAssignmentName       : 37ce239ae4304622914f0c77
PolicyAssignmentOwner      : tbd
PolicyAssignmentParameters : {"tagName":{"value":"costCenter"},"tagValue":{"value":"Contoso-Test"}}
PolicyAssignmentScope      : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags
PolicyDefinitionName       : 1e30110a-5ceb-460c-a204-c1c3969c6d62
PolicyDefinitionAction     : deny
PolicyDefinitionCategory   : tbd
TenantId                   : {tenantId}
PrincipalOid               : {principalOid}

可以结合 Azure PowerShell cmdlet Get-AzADUser 使用 PrincipalOid 字段来获取特定的用户。 请将 {principalOid} 替换为在前一示例中获取的响应。

PS> (Get-AzADUser -ObjectId {principalOid}).DisplayName
Trent Baker

Azure Monitor 日志

如果带有来自 Activity Log Analytics 解决方案AzureActivityLog Analytics 工作区已绑定到订阅,也可以使用简单的 Kusto 查询和 AzureActivity 表来查看对新资源和已更新资源的评估中的不符合性结果。 借助 Azure Monitor 日志中的详细信息,可对警报进行配置,以监视不符合情况。

Azure Monitor 日志的屏幕截图,其中显示了 AzureActivity 表中的 Azure Policy 操作。

Azure Resource Graph

合规性记录存储在 Azure Resource Graph (ARG) 中。 可以从 ARG 查询导出数据,以基于感兴趣的范围和策略生成自定义仪表板。 查看有关通过 ARG 导出合规性数据的示例查询

后续步骤