Azure リソースのコンプライアンス データを取得する

Azure Policy の最大の利点の 1 つは、サブスクリプション内のリソースまたはサブスクリプションの管理グループを介して提供される分析情報と制御です。 この制御は、リソースが誤った場所に作成されるのを防いだり、一般的で一貫性のあるタグの使用を強制したり、既存のリソースの適切な構成と設定を監査したりするために使用できます。 どの場合でも Azure Policy によってデータが生成され、環境のコンプライアンス状態の理解に役立てることができます。

コンプライアンス データを確認する前に、Azure Policy のコンプライアンスの状態を理解することが重要です。

ポリシーとイニシアティブ割り当てによって生成されたコンプライアンス情報には、次のようないくつかの方法でアクセスすることができます。

コンプライアンスの報告方法を説明する前に、コンプライアンス情報がいつ更新されるかと、評価サイクルをトリガーする頻度とイベントについて説明します。

評価のトリガー

完了した評価サイクルの結果は、PolicyStates および PolicyEvents 操作を通じて Microsoft.PolicyInsights リソース プロバイダーで使用可能です。 Azure Policy Insights REST API の操作の詳細については、「Azure Policy Insights」を参照してください。

割り当てられたポリシーとイニシアティブの評価は、次のようなさまざまなイベントの結果として発生します。

  • ポリシーまたはイニシアティブがスコープに新たに割り当てられる。 割り当てが定義されたスコープに適用されるまでに約 5 分かかります。その後、新しく割り当てられたポリシーまたはイニシアチブに対して適用可能なリソースの評価サイクルが開始されます。 使用される効果に応じて、リソースは準拠、非準拠、除外、または不明としてマークされます。 大きなスコープのリソースに対する大きなポリシーまたはイニシアティブの評価には時間がかかるため、評価サイクルがいつ完了するかを事前に予想することはできません。 完了すると、更新されたコンプライアンス結果をポータルと SDK で使用できるようになります。

  • 既にスコープに割り当てられているポリシーまたはイニシアティブが更新される。 このシナリオでの評価サイクルとタイミングは、スコープへの新しい割り当ての場合と同じです。

  • Azure Resource Manager、REST API、またはサポート対象の SDK を介した割り当てで、リソースがスコープでデプロイまたは更新される。 このシナリオでは、個々のリソースに対する効果的なイベント (追加、監査、拒否、展開) とコンプライアンス ステータスの情報が、約 15 分後にポータルおよび SDKで利用可能です。 このイベントによって、他のリソースの評価が行われることはありません。

  • サブスクリプション (リソースの種類 Microsoft.Resources/subscriptions ) が、サブスクリプション リソースの種類をターゲットとしたポリシー定義が割り当てられているMicrosoft.Resources/subscriptions内で、作成または移動されています。 サブスクリプションでサポートされている影響 (audit、auditIfNotExist、deployIfNotExists、modify)、ログ記録、および修復アクションの評価には、約 30 分かかります。

  • ポリシー適用除外が作成、更新、または削除される。 このシナリオでは、定義された適用除外スコープに対して、対応する割り当てが評価されます。

  • 標準コンプライアンス評価サイクル。 24 時間に 1 回、割り当てが自動的に再評価されます。 多くのリソースの大きなポリシーまたはイニシアティブでは時間がかかることがあるため、評価サイクルがいつ完了するかを事前に予想することはできません。 完了すると、更新されたコンプライアンス結果をポータルと SDK で使用できるようになります。

  • マシン構成リソース プロバイダーは、管理対象リソースによってコンプライアンスの詳細で更新されます。

  • オンデマンド スキャン

注意

設計上、Azure Policy により、評価可能なサブスクリプションとリソース グループを除き、Microsoft.Resources リソース プロバイダー (RP) の下にあるすべてのリソースがポリシー評価から除外されます。

オンデマンドの評価スキャン

サブスクリプションまたはリソース グループの評価スキャンは、Azure CLI、Azure PowerShell、または REST API への呼び出しを使用して、または Azure Policy Compliance Scan GitHub アクションを使用して開始できます。 このスキャンは非同期プロセスです。

Note

すべての Azure リソース プロバイダーがオンデマンド評価スキャンをサポートしているわけではありません。 たとえば、現在、Azure Virtual Network Manager (AVNM) では、手動トリガーまたは標準ポリシー コンプライアンス評価サイクル (毎日のスキャン) はサポートされていません。

オンデマンド評価スキャン - GitHub アクション

Azure Policy Compliance Scan アクションを使用して、1 つまたは複数のリソース、リソース グループ、またはサブスクリプションに対して 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 Compliance Scan リポジトリの 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 コマンドレットを使用して開始されます。

既定では、Start-AzPolicyComplianceScan によって現在のサブスクリプションのすべてのリソースの評価が開始されます。 特定のリソース グループで評価を開始するには、ResourceGroupName パラメーターを使用します。 次の例では、MyRG リソース グループの現在のサブスクリプションで対応スキャンを開始します。

Start-AzPolicyComplianceScan -ResourceGroupName 'MyRG'

PowerShell で非同期呼び出しが完了するのを待ってから、結果の出力を提供したり、ジョブとしてバックグラウンドで実行したりすることができます。 PowerShell ジョブを使用して、バックグラウンドで対応スキャンを実行するには、AsJob パラメーターを使用して、次の例の のようにオブジェクトに値を設定します。

$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} - サブスクリプション ID で置き換えます

スキャンは、サブスクリプションまたはリソース グループ内のリソースの評価をサポートしています。 次の URI の構造を使用して、REST API の POST コマンドでスコープによるスキャンを開始します。

  • サブスクリプション

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

    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}{ResourceContainerGUID}の URI が提供されます。 場所の URI に対する REST API の GET コマンドは、評価の進行中に「202 受理されました」を返します。 評価スキャンが完了すると、「200 OK」の状態を返します。 完了済みスキャンの本文は、状態を含む JSON 応答です。

{
    "status": "Succeeded"
}

オンデマンドの評価スキャン - Visual Studio Code

Visual Studio Code 用の Azure Policy 拡張機能では、特定のリソースに対して評価スキャンを実行できます。 このスキャンは、Azure PowerShell と REST メソッドとは異なり、同期プロセスです。 詳細と手順については、VS Code 拡張機能を使用したオンデマンド評価に関する記事を参照してください。

ポータル

Azure portal には、環境のコンプライアンス状態を視覚化して理解するためのグラフィカルなエクスペリエンスが表示されます。 [ポリシー] ページの [概要] オプションでは、ポリシーとイニシアティブの両方のコンプライアンスに関して、利用可能なスコープの詳細が表示されます。 コンプライアンス状態および割り当てごとの数と共に、過去 7 日間のコンプライアンスを示すグラフが含まれます。 [コンプライアンス] ページには、この同じ情報の大部分 (グラフを除く) が含まれていますが、フィルター処理と並べ替えのオプションが追加されています。

フィルター処理のオプションと詳細が表示されている [コンプライアンス] ページのスクリーンショット。

ポリシーまたはイニシアティブは異なるスコープに割り当てることができるため、表には、各割り当てのスコープと割り当てられた定義の種類が含まれます。 各割り当ての準拠していないリソースおよび準拠していないポリシーの数も提供されます。 表のポリシーまたはイニシアティブを選択すると、その特定の割り当てのコンプライアンスに関する詳しい情報が表示されます。

数とリソース コンプライアンスの詳細が表示されている [ポリシー準拠状況の詳細] ページのスクリーンショット。

[リソース コンプライアンス] タブのリソース リストには、現在の割り当てに対する既存のリソースの評価状態が表示されます。 タブでは既定で [非対応] に設定されますが、これをフィルター処理することができます。 リソースの作成要求によってトリガーされるイベント (追加、監査、拒否、デプロイ、変更) は、 [イベント] タブに表示されます。

[ポリシー準拠状況の詳細] ページの [イベント] タブのスクリーンショット。

のリソースについては、[リソースのコンプライアンス] タブで、リソースを選択するか、行を右クリックして [ポリシー準拠状況の詳細] を選択すると、コンポーネントのコンプライアンスの詳細が表示されます。 このページには、このリソースに割り当てられているポリシー、イベント、コンポーネント イベント、変更履歴を表示するためのタブも用意されています。

[Component Compliance]\(コンポーネントのコンプライアンス\) タブと、リソース プロバイダー モードの割り当てに対するコンプライアンスの詳細のスクリーンショット。

リソースのコンプライアンス ページに戻って、詳細情報を収集するイベントの行を選択したままにし (または右クリックし)、 [アクティビティ ログの表示] を選択します。 アクティビティ ログ ページが開き、事前にフィルター処理されて、割り当ておよびイベントの詳細が検索して表示されます。 アクティビティ ログは、これらのイベントに関するより詳細なコンテキストと情報を提供します。

Azure Policy アクティビティおよび評価のアクティビティ ログのスクリーンショット。

注意

コンプライアンスの結果は、Azure Resource Graph クエリを使用してポータルからエクスポートできます。

コマンド ライン

ポータルで入手できるのと同じ情報を、REST API (ARMClient などを使用)、Azure PowerShell、Azure CLI を使用して取得できます。 REST API の完全な詳細については、Azure Policy リファレンスを参照してください。 REST API のリファレンス ページには、各操作に緑色の [使ってみる] ボタンがあり、ブラウザーで直接試すことができます。

REST API の例については、ARMClient または同様のツールを使用して Azure に対する認証を処理します。

結果の要約

REST API を使用すると、コンテナー、定義、または割り当てごとに要約を実行できます。 Azure Policy Insights の [Summarize For Subscription] (サブスクリプションの要約) を使用した、サブスクリプション レベルでの要約の例を次に示します。

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 は 'NonCompliant' に等しく (eq)、PolicyAssignmentId がポリシー定義に対して指定され、その後 PolicyDefinitionId 自体が指定されています。 フィルターに PolicyAssignmentId を含める理由は、PolicyDefinitionId がさまざまなスコープの複数のポリシーまたはイニシアティブ割り当てに存在する可能性があるためです。 PolicyAssignmentId と PolicyDefinitionId の両方を指定することにより、必要とする結果を明示することができます。 以前は、PolicyStates に latest を使用しました。この場合、直前の 24 時間の from および to 時間枠が自動的に設定されます。

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'

以下の応答例は、簡潔にするため、1 つの準拠していないリソースを示すようにトリミングされています。 詳細な応答には、リソース、ポリシーまたはイニシアティブ、および割り当てに関するいくつかのデータがあります。 ポリシー定義にどの割り当てパラメーターが渡されたかを確認することもできることに注意してください。

{
    "@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 Policy のイベントに関する API リファレンスの記事を参照してください。

Azure CLI

Azure Policy の Azure CLI コマンド グループは、REST または Azure PowerShell で使用可能なほとんどの操作に対応しています。 使用可能なコマンドの完全な一覧については、Azure CLI の Azure Policy の概要に関する記事をご覧ください。

例:準拠していないリソースの数が最も多い、最上位の割り当てられているポリシーの状態の要約を取得する。

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

Azure Policy 用の Azure PowerShell モジュールは、PowerShell ギャラリーで Az.PolicyInsights として入手できます。 PowerShellGet では、Install-Module -Name Az.PolicyInsights を使用してモジュールをインストールできます (最新の Install-Module -Name Az.PolicyInsights がインストールされていることを確認してください)。

# 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

モジュールには次のコマンドレットがあります。

  • 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}

PrincipalOid フィールドは、Azure PowerShell コマンドレット を使用して特定のユーザーを取得するために使用できます。 {principalOid} を、前の例で取得した応答に置き換えます。

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

Azure Monitor ログ

サブスクリプションに関連付けられた Activity Log Analytics ソリューションからの を使用した Log Analytics ワークスペースがある場合は、単純な Kusto クエリと テーブルを使用して、新規および更新されたリソースの評価から非準拠の結果を表示することもできます。 Azure Monitor ログの詳細情報を使用して、非準拠を監視するようにアラートを構成できます。

AzureActivity テーブルに Azure Policy アクションを表示している Azure Monitor ログのスクリーンショット。

Azure Resource Graph

コンプライアンス レコードは Azure Resource Graph (ARG) に格納されます。 ARG クエリからデータをエクスポートして、目的のスコープとポリシーに基づいてカスタマイズされたダッシュボードを作成できます。 ARG を使用してコンプライアンス データをエクスポートするためのサンプル クエリを確認してください。

次のステップ