チュートリアル:カスタム ポリシー定義の作成

カスタム ポリシー定義を使用すると、顧客が Azure を使用するための独自のルールを定義できます。 これらのルールは通常、次のものを適用します。

  • セキュリティの実行
  • コスト管理
  • 組織固有のルール (名前付けや場所など)

カスタム ポリシーを作成するうえでのビジネス ドライバーがどのようなものであっても、新しいカスタム ポリシーを定義する手順は同じです。

カスタム ポリシーを作成する前に、ポリシーのサンプルを見て、ニーズに一致するポリシーが既に存在するかどうかを確認してください。

カスタム ポリシーの作成手順は次のとおりです。

  • ビジネス要件を特定する
  • 各要件を Azure リソースのプロパティにマップする
  • プロパティをエイリアスにマップする
  • 使用する効果を決定する
  • ポリシー定義を作成する

前提条件

Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。

要件を特定する

ポリシー定義を作成する前に、ポリシーの意図を理解しておくことが重要です。 このチュートリアルでは、一般的な大企業のセキュリティ要件を目標として利用して、必要な手順を説明します。

  • 各ストレージ アカウントで HTTPS が有効になっていること
  • 各ストレージ アカウントで HTTP が無効になっていること

ご自分の要件では、リソースの "適切な状態" と "不適切な状態" の両方を明確に特定する必要があります。

リソースの想定される状態は定義してありますが、非準拠リソースをどうするかはまだ定義していません。 Azure Policy では多くの効果がサポートされます。 このチュートリアルで定義するビジネス要件では、ビジネス ルールに準拠しないリソースが作成されないようにします。 この目標を達成するには、Deny 効果を使用します。 また、特定の割り当てに対するポリシーを一時停止するオプションも必要です。 そのため、Disabled 効果を使用し、その効果をポリシー定義のパラメーターにします。

リソースのプロパティを判別する

ビジネス要件に基づいて、Azure Policy を使用して監査する Azure リソースは、ストレージ アカウントです。 ただし、ポリシー定義で使用するプロパティはわかりません。 Azure Policy では、リソースの JSON 表現に対して評価を行います。そのため、そのリソースで使用可能なプロパティを把握する必要があります。

Azure リソースのプロパティを判別する方法はたくさんあります。 このチュートリアルでは、それぞれについて見ていきます。

  • VS Code 用 Azure Policy 拡張機能
  • Azure Resource Manager テンプレート (ARM テンプレート)
    • 既存のリソースのエクスポート
    • 作成エクスペリエンス
    • クイック スタート テンプレート (GitHub)
    • テンプレートのリファレンス ドキュメント
  • Azure Resource Explorer

VS Code 拡張機能でリソースを表示する

VS Code 拡張機能を使用すると、環境内のリソースを参照し、各リソースの Resource Manager プロパティを表示できます。

ARM テンプレート

管理しようとしているプロパティが含まれる ARM テンプレートを確認する方法はいくつかあります。

ポータルにおける既存のリソース

プロパティを見つける最も簡単な方法は、同じ種類の既存リソースを確認することです。 適用する設定を使用して既に構成されているリソースには、比較対象の値もあります。 その特定のリソースについて、Azure portal の ( [設定] にある) [テンプレートのエクスポート] ページを確認します。

警告

Azure portal によってエクスポートされた ARM テンプレートは、deployIfNotExists ポリシー定義の ARM テンプレートの deployment プロパティに直接接続できません。

Azure portal にある既存リソースの Export テンプレート ページのスクリーンショット。

これにより、ストレージ アカウントの場合、次の例のようなテンプレートが表示されます。

...
"resources": [{
    "comments": "Generalized from resource: '/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/mystorageaccount'.",
    "type": "Microsoft.Storage/storageAccounts",
    "sku": {
        "name": "Standard_LRS",
        "tier": "Standard"
    },
    "kind": "Storage",
    "name": "[parameters('storageAccounts_mystorageaccount_name')]",
    "apiVersion": "2018-07-01",
    "location": "westus",
    "tags": {
        "ms-resource-usage": "azure-cloud-shell"
    },
    "scale": null,
    "properties": {
        "networkAcls": {
            "bypass": "AzureServices",
            "virtualNetworkRules": [],
            "ipRules": [],
            "defaultAction": "Allow"
        },
        "supportsHttpsTrafficOnly": false,
        "encryption": {
            "services": {
                "file": {
                    "enabled": true
                },
                "blob": {
                    "enabled": true
                }
            },
            "keySource": "Microsoft.Storage"
        }
    },
    "dependsOn": []
}]
...

properties の下にある supportsHttpsTrafficOnly という値は false に設定されています。 このようなプロパティが、探していたプロパティです。 また、このリソースの種類Microsoft.Storage/storageAccounts です。 これにより、ポリシーをこの種類のリソースのみに制限できます。

ポータルでリソースを作成する

ポータルを使用するもう 1 つの方法は、リソースの作成エクスペリエンスです。 ポータルを使用してストレージ アカウントを作成する際、 [詳細] タブに [安全な転送が必須] オプションがあります。 このプロパティには、"無効" と "有効" のオプションがあります。 情報アイコンには追加のテキストがあり、このオプションが目的のプロパティであることを確認できます。 ただし、ポータルのこの画面ではプロパティ名はわかりません。

[確認と作成] タブのページの下部に、 [Automation のテンプレートをダウンロードする] リンクがあります。 このリンクを選択すると、構成したリソースを作成するテンプレートが開きます。 この場合は、2 つの重要な情報が表示されます。

...
"supportsHttpsTrafficOnly": {
    "type": "bool"
}
...
"properties": {
    "accessTier": "[parameters('accessTier')]",
    "supportsHttpsTrafficOnly": "[parameters('supportsHttpsTrafficOnly')]"
}
...

この情報でわかるのは、プロパティの種類と、探しているプロパティが supportsHttpsTrafficOnly であるということです。

GitHub 上のクイック スタート テンプレート

GitHub 上の Azure クイックスタート テンプレートには、さまざまなリソース用に構築された数百もの ARM テンプレートがあります。 これらのテンプレートは、探しているリソースのプロパティを見つけるのに役立ちます。 探しているプロパティであるように見えて、別のものを制御しているプロパティである場合もあります。

リソースのリファレンス ドキュメント

supportsHttpsTrafficOnly が適切なプロパティであるかどうかを検証するには、ARM テンプレート リファレンスで、ストレージ プロバイダーのストレージ アカウント リソースについて確認します。 プロパティ オブジェクトには、有効なパラメーターのリストがあります。 [StorageAccountPropertiesCreateParameters-object] リンクを選択すると、許容されるプロパティの表が表示されます。 supportsHttpsTrafficOnly が存在し、その説明は探しているものと一致していてビジネス要件を満たします。

Azure Resource Explorer

Azure リソースを探すもう 1 つの方法は、Azure Resource Explorer (プレビュー) を使用することです。 このツールはお使いのサブスクリプションのコンテキストを使用するため、Web サイトで Azure 資格情報を使用して認証する必要があります。 認証されると、プロバイダー、サブスクリプション、リソース グループ、リソースごとに参照できます。

ストレージ アカウントのリソースを見つけて、プロパティを確認します。 ここでも、supportsHttpsTrafficOnly プロパティを確認できます。 [ドキュメント] タブを選択すると、プロパティの説明が前にリファレンス ドキュメントで見たものと一致することを確認できます。

プロパティのエイリアスを見つける

リソースのプロパティを特定しましたが、このプロパティをエイリアスにマップする必要があります。

Azure リソースのエイリアスを判別する方法はいくつかあります。 このチュートリアルでは、それぞれについて見ていきます。

  • VS Code 用 Azure Policy 拡張機能
  • Azure CLI
  • Azure PowerShell

VS Code 拡張機能でエイリアスを取得する

VS Code 拡張機能の Azure Policy 拡張機能を使用すると、リソースを簡単に参照し、エイリアスを検出できます。

Note

VS Code 拡張機能では、Resource Manager モードのプロパティのみが公開され、リソースプロバイダー モードのプロパティは表示されません。

Azure CLI

Azure CLI では、az provider コマンド グループを使用してリソースのエイリアスを探します。 これまでに Azure リソースについて取得した詳細に基づいて、Microsoft.Storage 名前空間でフィルター処理します。

# Login first with az login if not using Cloud Shell

# Get Azure Policy aliases for type Microsoft.Storage
az provider show --namespace Microsoft.Storage --expand "resourceTypes/aliases" --query "resourceTypes[].aliases[].name"

その結果から、supportsHttpsTrafficOnly という名前のストレージ アカウントでサポートされているエイリアスを確認します。 このエイリアスが存在するということは、目的のビジネス要件を適用するためのポリシーを作成できるということです。

Azure PowerShell

Azure PowerShell では、Get-AzPolicyAlias コマンドレットを使用してリソースのエイリアスを探します。 これまでに Azure リソースについて取得した詳細に基づいて、Microsoft.Storage 名前空間でフィルター処理します。

# Login first with Connect-AzAccount if not using Cloud Shell

# Use Get-AzPolicyAlias to list aliases for Microsoft.Storage
(Get-AzPolicyAlias -NamespaceMatch 'Microsoft.Storage').Aliases

Azure CLI と同様に、その結果から supportsHttpsTrafficOnly という名前のストレージ アカウントでサポートされているエイリアスを確認します。

使用する効果を決定する

非準拠リソースをどう処理するかを決定することは、最初に何を評価するかを決定することと同じくらい重要です。 非準拠リソースに対して考えられる応答はそれぞれ、効果と呼ばれます。 効果は、非準拠リソースがログ記録されるか、ブロックされるか、追加されるデータがあるか、リソースを準拠状態に戻すために関連付けられているデプロイがあるかを制御します。

この例では、非準拠リソースを Azure 環境で作成したくないため、必要な効果は Deny です。 Audit は、ポリシーの効果を Deny に設定する前にポリシーの影響を判別するのに最適な効果です。 割り当てごとにより簡単に効果を変更できるようにする方法の 1 つは、効果をパラメーター化することです。 詳細な方法については、「パラメーター」を参照してください。

定義を作成する

これで、管理しようとしているもののプロパティの詳細とエイリアスがわかりました。 次は、ポリシー ルール自体を作成します。 ポリシー言語に慣れていない場合は、ポリシー定義の構造に関するページでポリシー定義の構成方法を確認してください。 ポリシー定義の空のテンプレートは次のようになります。

{
    "properties": {
        "displayName": "<displayName>",
        "description": "<description>",
        "mode": "<mode>",
        "parameters": {
                <parameters>
        },
        "policyRule": {
            "if": {
                <rule>
            },
            "then": {
                "effect": "<effect>"
            }
        }
    }
}

Metadata

最初の 3 つのコンポーネントは、ポリシー メタデータです。 ルールを作成する目的がわかっているため、これらのコンポーネントに値を指定するのは簡単です。 Mode は、主にタグとリソースの場所に関するコンポーネントです。 タグをサポートするリソースに評価を制限する必要はないため、mode には all という値を使用します。

"displayName": "Deny storage accounts not using only HTTPS",
"description": "Deny storage accounts not using only HTTPS. Checks the supportsHttpsTrafficOnly property on StorageAccounts.",
"mode": "all",

パラメーター

評価の変更のためにパラメーターは使用していませんが、トラブルシューティング用にパラメーターを使用して効果を変更できるようにしたいと思います。 effectType パラメーターを定義し、それを DenyDisabled のみに制限します。 これら 2 つのオプションは、目的のビジネス要件に一致しています。 完成した parameters ブロックの例を次に示します。

"parameters": {
    "effectType": {
        "type": "string",
        "defaultValue": "Deny",
        "allowedValues": [
            "Deny",
            "Disabled"
        ],
        "metadata": {
            "displayName": "Effect",
            "description": "Enable or disable the execution of the policy"
        }
    }
},

ポリシー規則

ポリシー ルールの作成は、カスタム ポリシー定義を構築する際の最後の手順です。 次のテストのために、2 つのステートメントを特定しました。

  • ストレージ アカウントの種類Microsoft.Storage/storageAccounts
  • ストレージ アカウントの supportsHttpsTrafficOnlytrue ではない

これらのステートメントが両方とも true である必要があるので、allOf論理演算子を使用します。 静的に宣言する代わりに、effectType パラメーターを effect に渡します。 完成したルールは次の例のようになります。

"if": {
    "allOf": [
        {
            "field": "type",
            "equals": "Microsoft.Storage/storageAccounts"
        },
        {
            "field": "Microsoft.Storage/storageAccounts/supportsHttpsTrafficOnly",
            "notEquals": "true"
        }
    ]
},
"then": {
    "effect": "[parameters('effectType')]"
}

完成した定義

ポリシーの 3 つの部分をすべて定義して、完成した定義を次に示します。

{
    "properties": {
        "displayName": "Deny storage accounts not using only HTTPS",
        "description": "Deny storage accounts not using only HTTPS. Checks the supportsHttpsTrafficOnly property on StorageAccounts.",
        "mode": "all",
        "parameters": {
            "effectType": {
                "type": "string",
                "defaultValue": "Deny",
                "allowedValues": [
                    "Deny",
                    "Disabled"
                ],
                "metadata": {
                    "displayName": "Effect",
                    "description": "Enable or disable the execution of the policy"
                }
            }
        },
        "policyRule": {
            "if": {
                "allOf": [
                    {
                        "field": "type",
                        "equals": "Microsoft.Storage/storageAccounts"
                    },
                    {
                        "field": "Microsoft.Storage/storageAccounts/supportsHttpsTrafficOnly",
                        "notEquals": "true"
                    }
                ]
            },
            "then": {
                "effect": "[parameters('effectType')]"
            }
        }
    }
}

この完成した定義を使用して、新しいポリシーを作成できます。 ポータルと各 SDK (Azure CLI、Azure PowerShell、REST API) で定義の受け入れ方は異なるので、それぞれのコマンドを参照して適切な使用方法を確認してください。 次に、パラメーター化した効果を使用して適切なリソースに割り当て、ストレージ アカウントのセキュリティを管理します。

リソースをクリーンアップする

このチュートリアルのリソースに対する作業が完了した場合は、次の手順を使用して、ここで作成した割り当てまたは定義をすべて削除してください。

  1. Azure Policy ページの左側にある [作成] の下の [定義] (または割り当てを削除する場合は [割り当て] ) を選択します。

  2. 削除する新しいイニシアティブまたはポリシー定義 (または割り当て) を見つけます。

  3. 行を右クリックするか、定義 (または割り当て) の末尾にある省略記号を選択し、 [定義の削除] (または [割り当ての削除] ) を選択します。

確認

このチュートリアルでは、以下のタスクを完了しました。

  • ビジネス要件を特定する
  • 各要件を Azure リソースのプロパティにマップする
  • プロパティをエイリアスにマップする
  • 使用する効果を決定する
  • ポリシー定義を作成する

次のステップ

次に、カスタム ポリシー定義を使用し、ポリシーを作成して割り当てます。