取得 Azure 資源的合規性資料

Azure 原則的其中一個最大優點,就是能夠針對訂用帳戶中的資源或訂用帳戶的管理群組,提供相關見解和控制權。 此控制權可用來防止在錯誤的位置建立資源、強制執行通用且一致的標記使用方式,或稽核現有的資源以取得適當的組態和設定。 在所有情況下,Azure 原則都會產生資料來讓您了解環境的合規性狀態。

檢閱合規性資料之前,請務必了解 Azure 原則中的合規性狀態

有數種方式可存取原則和計畫指派所產生的合規性資訊:

在查看這些報告合規性的方法之前,讓我們來看何時會更新合規性資訊,以及觸發評估週期的頻率和事件。

評估觸發程序

已完成評估週期的結果可透過 PolicyStatesPolicyEvents 作業在 Microsoft.PolicyInsights 資源提供者中可用。 如需有關 Azure 原則見解 REST API 之作業的詳細資訊,請參閱 Azure 原則見解

對指定原則和計畫的評估是各種事件的結果:

  • 將新的原則或計畫指派給範圍。 指派大約需要五分鐘的時間才能套用至定義的範圍,然後評估週期會針對新指派的原則或計畫開始適用資源。 根據所使用的效果,資源會標示為符合規範、不符合規範、豁免或未知。 針對大量資源評估的大型原則或計畫可能需要時間,因此沒有預先定義的評估週期何時完成的預期。 一旦完成,更新的合規性結果將在入口網站和 SDK 中可用。

  • 更新已指派給範圍的原則或計畫。 此案例的評估週期和時間與範圍的新指派相同。

  • 資源會透過 Azure Resource Manager、REST API 或支援的 SDK,在範圍內部署或更新指派。 在此案例中,大約 15 分鐘後,單個資源的效果事件 (附加、稽核、拒絕、部署) 和符合規範狀態資訊在入口網站和 SDK 中可用。 此事件不會引起對其他資源的評估。

  • 訂用帳戶 (資源類型Microsoft.Resources/subscriptions) 在管理群組階層 中建立或移動,並具有以訂用帳戶資源類型為目標的指派原則定義。 評估訂用帳戶支援的效果 (audit、auditIfNotExist、deployIfNotExists、modify)、記錄,以及任何補救動作大約需要 30 分鐘的時間。

  • 原則豁免已建立、更新或刪除。 在此案例中,系統會針對定義的豁免範圍評估對應的指派。

  • 標準合規性評估週期。 每 24 小時自動重新評估指派一次。 許多資源的大型原則或計畫可能需要時間,因此沒有預先定義的評估週期何時完成的預期。 一旦完成,更新的合規性結果將在入口網站和 SDK 中可用。

  • 由受控資源使用合規性詳細資訊更新機器設定資源提供者。

  • 隨需掃描

注意

根據設計,Azure 原則會使 Microsoft.Resources 資源提供者 (RP) 下的所有資源豁免於原則評估,除了訂用帳戶和資源群組之外,其可以加以評估。

隨選評估掃描

可透過 Azure CLI、Azure PowerShell、REST API 的呼叫,或使用 Azure 原則合規性掃描 GitHub Action (英文) 來啟動訂閱或資源群組的評估掃描。 這個掃描是一個非同步程序。

注意

並非所有 Azure 資源提供者都支援隨選評估掃描。 例如,Azure Virtual Network Manager (AVNM) 目前不支援手動觸發程序或標準原則合規性評估週期 (每日掃描)。

隨需評估掃描 - GitHub Action

在一或多個資源、資源群組或訂閱上使用 Azure 原則合規性掃描動作 (英文),從 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 原則合規性掃描存放庫的 GitHub Actions (英文)。

隨需評估掃描 - Azure CLI

合規性掃描是透過 az policy state trigger-scan 命令來啟動。

根據預設,az policy state trigger-scan 會針對目前訂用帳戶中的所有資源啟動評估。 若要針對特定的資源群組啟動評估,請使用 ResourceGroupName 參數。 下列範例會在目前的訂用帳戶中針對 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 作業來在背景執行合規性掃描,請使用 AsJob 參數並將值設定到物件上,例如此範例中的 $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...

當合規性掃描完成時,State 屬性會變更為 Completed

隨選評估掃描 - REST

作為非同步程序,啟動掃描的 REST 端點並不會等待掃描完成以回應。 相反地,它會提供 URI,可用來查詢要求之評估的狀態。

在每個 REST API URI 中有一些變數,需要您以自己的值取代它們:

  • {YourRG} - 以您的資源群組名稱取代
  • {subscriptionId} - 以您的訂用帳戶識別碼取代

掃描支援訂用帳戶或資源群組中的資源評估。 請使用 REST API POST 命令,運用下列 URI 結構來依據範圍啟動掃描:

  • 訂用帳戶

    POST https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/triggerEvaluation?api-version=2019-10-01
    
  • 資源群組

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

呼叫會傳回 202 已接受狀態。 包含在回應標頭中的是 Location 屬性,其格式如下:

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

{ResourceContainerGUID} 是針對要求的範圍以靜態方式所產生。 如果某個範圍已在執行隨選掃描,則不會啟動新的掃描。 相反地,系統會提供相同的 {ResourceContainerGUID}location URI 新要求以取得狀態。 針對 Location URI 的 REST API GET 命令會傳回 202 已接受,同時持續進行評估。 評估掃描完成時,會傳回 200 確定狀態。 完成掃描的主體是具有狀態的 JSON 回應:

{
    "status": "Succeeded"
}

隨需評估掃描 - Visual Studio Code

Visual Studio Code 的 Azure 原則延伸模組能夠執行特定資源的評估掃描。 此掃描是同步處理序,不同於 Azure PowerShell 與 REST 方法。 如需詳細資料與步驟,請參閱使用 VS Code 延伸模組進行隨需評估

入口網站

Azure 入口網站示範視覺化並了解您環境中合規性狀態的圖形化體驗。 在 [原則] 頁面上,[概觀] 選項提供有關原則和計畫合規性之可用範圍的詳細資料。 除了每個指派的合規性狀態和計數之外,還包含一個圖表,顯示過去七天的合規性。 [合規性] 頁面包含大部分相同的資訊 (圖表除外),但提供額外的篩選和排序選項。

Screenshot of Compliance page, filtering options, and details.

由於可以將一個原則或方案指派給不同的範圍,因此表格包含每個指派的範圍,以及所指派的定義類型。 也會提供每個指派的不符合規範的資源和不符合規範的原則數目。 選取資料表中的原則或計畫可讓您更深入地查看該特定指派的合規性。

Screenshot of Compliance Details page, including counts and resource compliant details.

[資源合規性] 索引標籤上的資源清單會顯示目前指派的現有資源評估狀態。 此索引標籤預設為 [不符合規範],但您可以進行篩選。 由要求所觸發來建立資源的事件 (附加、稽核、拒絕、部署、修改) 會顯示在 [事件] 索引標籤下。

Screenshot of the Events tab on Compliance Details page.

針對資源提供者模式資源,在 [資源合規性] 索引標籤上選取資源,或以滑鼠右鍵按一下資料列,然後選取 [檢視合規性詳細資料] 會開啟元件合規性詳細資料。 此頁面也會提供索引標籤以查看指派至此資源的原則、事件、元件事件,以及變更歷程記錄。

Screenshot of Component Compliance tab and compliance details for a Resource Provider mode assignment.

返回 [資源合規性] 頁面,選取並按住 (以滑鼠右鍵按一下) 您想要收集更多詳細資料的事件資料列,然後選取 [Show activity logs] \(顯示活動記錄\)。 活動記錄頁面隨即開啟,並會預先篩選至顯示指派和事件詳細資料的搜尋結果。 活動記錄檔提供有關這些事件的更多內容和資訊。

Screenshot of the Activity Log for Azure Policy activities and evaluations.

注意

合規性結果可以透過 Azure Resource Graph 查詢從入口網站匯出。

命令列

您可以使用 REST API (包括 ARMClient)、Azure PowerShell 與 Azure CLI 來擷取入口網站中所提供的相同資訊。 如需 REST API 的完整詳細資料,請參閱 Azure 原則參考。 REST API 參考頁面上有每個作業的 [試用] 綠色按鈕,可讓您直接在瀏覽器中試用。

使用 ARMClient 或類似工具來處理 REST API 範例的 Azure 驗證。

摘要結果

使用 REST API 時,可以由容器、定義或指派來執行摘要。 以下是使用 Azure 原則見解的對訂用帳戶進行摘要,在訂用帳戶層級進行摘要的範例:

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

此輸出會摘要訂用帳戶。 在下列範例輸出中,摘要的合規性位於 value.results.nonCompliantResourcesvalue.results.nonCompliantPolicies 下方。 此要求提供進一步詳細資料,包括組成不相容數目的每個指派及每個指派的定義資訊。 階層中的每個原則物件提供可在該層級用來取得更多詳細資料的 queryResultsUri

{
    "@odata.context": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#summary",
    "@odata.count": 1,
    "value": [{
        "@odata.id": null,
        "@odata.context": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#summary/$entity",
        "results": {
            "queryResultsUri": "https://management.azure.com/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.azure.com/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.azure.com/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 和 the PolicyDefinitionId,我們便可以明確指出要尋找的結果。 之前,針對 PolicyStates,我們使用了 latest,這會自動將 fromto 時間範圍設定為過去 24 小時。

https://management.azure.com/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.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest",
    "@odata.count": 15,
    "value": [{
        "@odata.id": null,
        "@odata.context": "https://management.azure.com/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": "westus2",
        "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.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyEvents/default/queryResults?api-version=2019-10-01

您的結果類似下列範例:

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

如需有關查詢原則事件的詳細資訊,請參閱 Azure 原則事件參考文章。

Azure CLI

適用於 Azure 原則的 Azure CLI 命令群組涵蓋 REST 或 Azure PowerShell 中可用的大部分作業。 如需可用命令的完整清單,請參閱 Azure CLI - Azure 原則概觀

範例:取得其不相容資源數目最高之最上層指派原則的狀態摘要。

az policy state summarize --top 1

回應的上半部分看起來像下列範例:

{
    "odatacontext": "https://management.azure.com/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.azure.com/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.azure.com/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.azure.com/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": "westus2",
    "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.azure.com/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": "westus2",
    "resourceTags": "tbd",
    "resourceType": "Microsoft.Network/virtualNetworks",
    "subscriptionId": "{subscriptionId}",
    "timestamp": "2020-07-15T08:37:07.901911+00:00"
  }
]

Azure PowerShell

在 PowerShell 資源庫中,會以 Az.PolicyInsights \(英文\) 的形式提供適用於 Azure 原則的 Azure PowerShell 模組。 您可以使用 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 if not using Cloud Shell
Connect-AzAccount

模組擁有下列 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           : westus2
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           : westus2
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           : eastus
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 監視器記錄

若您有一個 Log Analytics 工作區,其中來自活動記錄分析解決方案AzureActivity 已繫結至您的訂閱,則您也可以使用簡單的 Kusto 查詢與 AzureActivity 資料表,檢視來自最新資源及已更新資源之評估的不符合規範結果。 有了「Azure 監視器」記錄中的詳細資料,您便可以設定警示來監看不符合規範的情況。

Screenshot of Azure Monitor logs showing Azure Policy actions in the AzureActivity table.

Azure Resource Graph

合規性記錄會儲存在 Azure Resource Graph (ARG) 中。 資料可以從 ARG 查詢匯出,以根據感興趣的範圍和原則來形成自訂儀錶板。 檢閱我們的樣本查詢,透過 ARG 匯出合規性資料。

下一步