プログラムによるポリシーの作成

この記事では、ポリシーをプログラムで作成して管理する方法について説明します。 Azure Policy の定義によって、さまざまなルールや効果がリソースに適用されます。 適用することで、リソースは会社の標準やサービス レベル アグリーメントに準拠した状態で維持されます。

コンプライアンスについては、「コンプライアンス データの取得」を参照してください。

前提条件

開始する前に、次の前提条件が満たされていることを確認します。

  1. ARMClient をまだインストールしていない場合はインストールします。 Azure Resource Manager ベースの API に HTTP 要求を送信するツールです。

  2. Azure PowerShell モジュールを最新バージョンに更新します。 詳細については、Azure PowerShell モジュールのインストールに関するページを参照してください。 最新バージョンについて詳しくは、Azure PowerShell をご覧ください。

  3. Azure PowerShell を使用して Azure Policy Insights リソース プロバイダーを登録し、サブスクリプションがリソース プロバイダーで確実に動作することを検証します。 リソース プロバイダーを登録するには、リソース プロバイダーのアクションの登録操作を実行するためのアクセス許可が必要です。 この操作は、共同作成者ロールと所有者ロールに含まれます。 リソース プロバイダーを登録する以下のコマンドを実行します。

    Register-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights'
    

    リソース プロバイダーの登録と表示の詳細については、「リソース プロバイダーと種類」を参照してください。

  4. Azure CLI をまだインストールしていない場合はインストールします。 最新バージョンは、「Windows での Azure CLI のインストール」で入手できます。

ポリシー定義を作成して割り当てる

リソースの可視性を向上させるには、まず、ポリシーを作成してリソースに割り当てます。 次の手順では、ポリシーをプログラムで作成して割り当てる方法について説明します。 このサンプル ポリシーは、すべてのパブリック ネットワークに開かれているストレージ アカウントを、PowerShell、Azure CLI、および HTTP 要求を使用して監査します。

PowerShell でポリシー定義を作成して割り当てる

  1. 次の JSON スニペットを使用して、AuditStorageAccounts.jsonという名前の JSON ファイルを作成します。

    {
        "if": {
            "allOf": [{
                    "field": "type",
                    "equals": "Microsoft.Storage/storageAccounts"
                },
                {
                    "field": "Microsoft.Storage/storageAccounts/networkAcls.defaultAction",
                    "equals": "Allow"
                }
            ]
        },
        "then": {
            "effect": "audit"
        }
    }
    

    ポリシー定義の作成方法の詳細については、「Azure Policy の定義の構造」を参照してください。

  2. AuditStorageAccounts.json ファイルを使用し、次のコマンドを実行してポリシー定義を作成します。

    New-AzPolicyDefinition -Name 'AuditStorageAccounts' -DisplayName 'Audit Storage Accounts Open to Public Networks' -Policy 'AuditStorageAccounts.json'
    

    このコマンドは、Audit Storage Accounts Open to Public Networks という名前のポリシー定義を作成します。 使用できるその他のパラメーターの詳細については、「New-AzPolicyDefinition」を参照してください。

    場所のパラメーターを指定せずに呼び出す場合、New-AzPolicyDefinition は、既定により、セッション コンテキストの選択されたサブスクリプションにポリシー定義を保存することになります。 定義を別の場所に保存するには、次のパラメーターを使用します。

    • SubscriptionId -別のサブスクリプションに保存します。 GUID 値が必要です。
    • ManagementGroupName -管理グループに保存します。 string 値が必要です。
  3. ポリシー定義を作成したら、次のコマンドを実行してポリシー割り当てを作成できます。

    $rg = Get-AzResourceGroup -Name 'ContosoRG'
    $Policy = Get-AzPolicyDefinition -Name 'AuditStorageAccounts'
    New-AzPolicyAssignment -Name 'AuditStorageAccounts' -PolicyDefinition $Policy -Scope $rg.ResourceId
    

    ContosoRG を対象とするリソース グループの名前に置き換えます。

    New-AzPolicyAssignmentScope パラメーターは、管理グループ、サブスクリプション、リソース グループ、または単一のリソースに使用できます。 このパラメーターは、Get-AzResourceGroupResourceId プロパティが返す完全なリソース パスを使用します。 各コンテナーの Scope のパターンは、次のとおりです。 {rName}{rgName}{subId}、および {mgName} を、それぞれリソース名、リソース グループ名、サブスクリプション ID、および管理グループ名と置き換えます。 {rType} は、そのリソースのリソースの種類 (VM の場合は Microsoft.Compute/virtualMachines など) に置き換えられます。

    • リソース - /subscriptions/{subID}/resourceGroups/{rgName}/providers/{rType}/{rName}
    • リソース グループ - /subscriptions/{subId}/resourceGroups/{rgName}
    • サブスクリプション - /subscriptions/{subId}
    • 管理グループ - /providers/Microsoft.Management/managementGroups/{mgName}

Resource Manager PowerShell モジュールを使用したリソース ポリシーの管理の詳細については、「Az.Resources」をご覧ください。

ARMClient を使用してポリシー定義を作成して割り当てる

次の手順に従って、ポリシー定義を作成します。

  1. 次の JSON スニペットをコピーして JSON ファイルを作成します。 このファイルは次の手順で呼び出します。

    "properties": {
        "displayName": "Audit Storage Accounts Open to Public Networks",
        "policyType": "Custom",
        "mode": "Indexed",
        "description": "This policy ensures that storage accounts with exposure to Public Networks are audited.",
        "parameters": {},
        "policyRule": {
            "if": {
                "allOf": [{
                        "field": "type",
                        "equals": "Microsoft.Storage/storageAccounts"
                    },
                    {
                        "field": "Microsoft.Storage/storageAccounts/networkAcls.defaultAction",
                        "equals": "Allow"
                    }
                ]
            },
            "then": {
                "effect": "audit"
            }
        }
    }
    
  2. 次の呼び出しを使用して、ポリシー定義を作成します。

    # For defining a policy in a subscription
    armclient PUT "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/policyDefinitions/AuditStorageAccounts?api-version=2021-09-01" @<path to policy definition JSON file>
    
    # For defining a policy in a management group
    armclient PUT "/providers/Microsoft.Management/managementgroups/{managementGroupId}/providers/Microsoft.Authorization/policyDefinitions/AuditStorageAccounts?api-version=2021-09-01" @<path to policy definition JSON file>
    

    前の {subscriptionId} をサブスクリプションの ID と置き換えるか、{managementGroupId} を管理部グループの ID と置き換えます。

    クエリの構造の詳細については、Azure Policy の定義 - 作成または更新およびポリシー定義 - 管理グループでの作成または更新に関する記事をご覧ください。

次の手順を使用してポリシー割り当てを作成し、ポリシー定義をリソース グループ レベルに割り当てます。

  1. 次の JSON スニペットをコピーして、ポリシー割り当ての JSON ファイルを作成します。 例の <> 記号内の情報を独自の値に置き換えます。

    {
        "properties": {
            "description": "This policy assignment makes sure that storage accounts with exposure to Public Networks are audited.",
            "displayName": "Audit Storage Accounts Open to Public Networks Assignment",
            "parameters": {},
            "policyDefinitionId": "/subscriptions/<subscriptionId>/providers/Microsoft.Authorization/policyDefinitions/Audit Storage Accounts Open to Public Networks",
            "scope": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>"
        }
    }
    
  2. 次の呼び出しを使用して、ポリシー割り当てを作成します。

    armclient PUT "/subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.Authorization/policyAssignments/Audit Storage Accounts Open to Public Networks?api-version=2021-09-01" @<path to Assignment JSON file>
    

    例の <> 記号内の情報を独自の値に置き換えます。

    REST API への HTTP 呼び出しを作成する方法については、Azure REST API のリソースに関するページを参照してください。

Azure CLI でポリシー定義を作成して割り当てる

次の手順に従って、ポリシー定義を作成します。

  1. 次の JSON スニペットをコピーして、ポリシー割り当ての JSON ファイルを作成します。

    {
        "if": {
            "allOf": [{
                    "field": "type",
                    "equals": "Microsoft.Storage/storageAccounts"
                },
                {
                    "field": "Microsoft.Storage/storageAccounts/networkAcls.defaultAction",
                    "equals": "Allow"
                }
            ]
        },
        "then": {
            "effect": "audit"
        }
    }
    

    ポリシー定義の作成方法の詳細については、「Azure Policy の定義の構造」を参照してください。

  2. 次のコマンドを実行してポリシー定義を作成します。

    az policy definition create --name 'audit-storage-accounts-open-to-public-networks' --display-name 'Audit Storage Accounts Open to Public Networks' --description 'This policy ensures that storage accounts with exposures to public networks are audited.' --rules '<path to json file>' --mode All
    

    このコマンドは、Audit Storage Accounts Open to Public Networks という名前のポリシー定義を作成します。 使用できるその他のパラメーターの詳細については、「az policy definition create」を参照してください。

    場所のパラメーターを指定せずに呼び出す場合、az policy definition creation は、既定により、セッション コンテキストの選択されたサブスクリプションにポリシー定義を保存することになります。 定義を別の場所に保存するには、次のパラメーターを使用します。

    • subscription - 別のサブスクリプションに保存します。 サブスクリプション ID の GUID 値、またはサブスクリプション名の string 値を指定する必要があります。
    • management-group - 管理グループに保存します。 string 値が必要です。
  3. 次のコマンドを使用して、ポリシー割り当てを作成します。 例の <> 記号内の情報を独自の値に置き換えます。

    az policy assignment create --name '<name>' --scope '<scope>' --policy '<policy definition ID>'
    

    az policy assignment createscope パラメーターは、管理グループ、サブスクリプション、リソース グループ、または単一のリソースに使用できます。 このパラメーターは完全なリソース パスを使用します。 各コンテナーの scope のパターンは、次のとおりです。 {rName}{rgName}{subId}、および {mgName} を、それぞれリソース名、リソース グループ名、サブスクリプション ID、および管理グループ名と置き換えます。 {rType} は、そのリソースのリソースの種類 (VM の場合は Microsoft.Compute/virtualMachines など) に置き換えられます。

    • リソース - /subscriptions/{subID}/resourceGroups/{rgName}/providers/{rType}/{rName}
    • リソース グループ - /subscriptions/{subID}/resourceGroups/{rgName}
    • サブスクリプション - /subscriptions/{subID}
    • 管理グループ - /providers/Microsoft.Management/managementGroups/{mgName}

Azure Policy の定義 ID は、PowerShell で次のコマンドを実行して取得できます。

az policy definition show --name 'Audit Storage Accounts with Open Public Networks'

作成したポリシー定義のポリシー定義 ID は、次の例のようになります。

"/subscription/<subscriptionId>/providers/Microsoft.Authorization/policyDefinitions/Audit Storage Accounts Open to Public Networks"

Azure CLI を使用してリソース ポリシーを管理する方法の詳細については、Azure CLI リソース ポリシーに関する記事をご覧ください。

次のステップ

この記事のコマンドとクエリの詳細については、次の記事をご覧ください。