チュートリアル:カスタム ポリシー定義の作成Tutorial: Create a custom policy definition

カスタム ポリシー定義を使用すると、顧客が Azure を使用するための独自のルールを定義できます。A custom policy definition allows customers to define their own rules for using Azure. これらのルールは通常、次のものを適用します。These rules often enforce:

  • セキュリティの実行Security practices
  • コスト管理Cost management
  • 組織固有のルール (名前付けや場所など)Organization-specific rules (like naming or locations)

カスタム ポリシーを作成するうえでのビジネス ドライバーがどのようなものであっても、新しいカスタム ポリシーを定義する手順は同じです。Whatever the business driver for creating a custom policy, the steps are the same for defining the new custom policy.

カスタム ポリシーを作成する前に、ポリシーのサンプルを見て、ニーズに一致するポリシーが既に存在するかどうかを確認してください。Before creating a custom policy, check the policy samples to see if a policy that matches your needs already exists.

カスタム ポリシーの作成手順は次のとおりです。The approach to creating a custom policy follows these steps:

  • ビジネス要件を特定するIdentify your business requirements
  • 各要件を Azure リソースのプロパティにマップするMap each requirement to an Azure resource property
  • プロパティをエイリアスにマップするMap the property to an alias
  • 使用する効果を決定するDetermine which effect to use
  • ポリシー定義を作成するCompose the policy definition

前提条件Prerequisites

Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。If you don't have an Azure subscription, create a free account before you begin.

要件を特定するIdentify requirements

ポリシー定義を作成する前に、ポリシーの意図を理解しておくことが重要です。Before creating the policy definition, it's important to understand the intent of the policy. このチュートリアルでは、一般的な大企業のセキュリティ要件を目標として利用して、必要な手順を説明します。For this tutorial, we'll use a common enterprise security requirement as the goal to illustrate the steps involved:

  • 各ストレージ アカウントで HTTPS が有効になっていることEach storage account must be enabled for HTTPS
  • 各ストレージ アカウントで HTTP が無効になっていることEach storage account must be disabled for HTTP

ご自分の要件では、リソースの "適切な状態" と "不適切な状態" の両方を明確に特定する必要があります。Your requirements should clearly identify both the "to be" and the "not to be" resource states.

リソースの想定される状態は定義してありますが、非準拠リソースをどうするかはまだ定義していません。While we've defined the expected state of the resource, we've not yet defined what we want done with non-compliant resources. Azure Policy ではさまざまな効果がサポートされます。Azure Policy supports a number of effects. このチュートリアルで定義するビジネス要件では、ビジネス ルールに準拠しないリソースが作成されないようにします。For this tutorial, we'll define the business requirement as preventing the creation of resources if they aren't compliant with the business rules. この目標を達成するには、Deny 効果を使用します。To meet this goal, we'll use the Deny effect. また、特定の割り当てに対するポリシーを一時停止するオプションも必要です。We also want the option to suspend the policy for specific assignments. そのため、Disabled 効果を使用し、その効果をポリシー定義のパラメーターにします。As such, we'll use the Disabled effect and make the effect a parameter in the policy definition.

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

ビジネス要件に基づいて、Azure Policy を使用して監査する Azure リソースは、ストレージ アカウントです。Based on the business requirement, the Azure resource to audit with Azure Policy is a storage account. ただし、ポリシー定義で使用するプロパティはわかりません。However, we don't know the properties to use in the policy definition. Azure Policy では、リソースの JSON 表現に対して評価を行います。そのため、そのリソースで使用可能なプロパティを把握する必要があります。Azure Policy evaluates against the JSON representation of the resource, so we'll need to understand the properties available on that resource.

Azure リソースのプロパティを判別する方法はたくさんあります。There are many ways to determine the properties for an Azure resource. このチュートリアルでは、それぞれについて見ていきます。We'll look at each for this tutorial:

  • VS Code 用 Azure Policy 拡張機能Azure Policy extension for VS Code
  • Azure Resource Manager テンプレート (ARM テンプレート)Azure Resource Manager templates (ARM templates)
    • 既存のリソースのエクスポートExport existing resource
    • 作成エクスペリエンスCreation experience
    • クイック スタート テンプレート (GitHub)Quickstart templates (GitHub)
    • テンプレートのリファレンス ドキュメントTemplate reference docs
  • Azure Resource ExplorerAzure Resource Explorer

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

VS Code 拡張機能を使用すると、環境内のリソースを参照し、各リソースの Resource Manager プロパティを表示できます。The VS Code extension can be used to browse resources in your environment and see the Resource Manager properties on each resource.

ARM テンプレートARM templates

管理しようとしているプロパティが含まれる ARM を確認する方法はいくつかあります。There are several ways to look at an ARM that includes the property you're looking to manage.

ポータルにおける既存のリソースExisting resource in the portal

プロパティを見つける最も簡単な方法は、同じ種類の既存リソースを確認することです。The simplest way to find properties is to look at an existing resource of the same type. 適用する設定を使用して既に構成されているリソースには、比較対象の値もあります。Resources already configured with the setting you want to enforce also provide the value to compare against. その特定のリソースについて、Azure portal の ( [設定] にある) [テンプレートのエクスポート] ページを確認します。Look at the Export template page (under Settings) in the Azure portal for that specific resource.

警告

Azure portal によってエクスポートされた ARM テンプレートは、deployIfNotExists ポリシー定義の ARM テンプレートの deployment プロパティに直接接続できません。The ARM template exported by Azure portal can't be plugged straight into the deployment property for an ARM template in a deployIfNotExists policy definition.

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

これにより、ストレージ アカウントの場合、次の例のようなテンプレートが表示されます。Doing so for a storage account reveals a template similar to this example:

...
"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 に設定されています。Under properties is a value named supportsHttpsTrafficOnly set to false. このようなプロパティが、探していたプロパティです。This property looks like it may be the property we're looking for. また、このリソースの 種類Microsoft.Storage/storageAccounts です。Also, the type of the resource is Microsoft.Storage/storageAccounts. これにより、ポリシーをこの種類のリソースのみに制限できます。The type lets us limit the policy to only resources of this type.

ポータルでリソースを作成するCreate a resource in the portal

ポータルを使用するもう 1 つの方法は、リソースの作成エクスペリエンスです。Another way through the portal is the resource creation experience. ポータルを使用してストレージ アカウントを作成する際、 [詳細] タブに [安全な転送が必須] オプションがあります。While creating a storage account through the portal, an option under the Advanced tab is Security transfer required. このプロパティには、"無効" と "有効" のオプションがあります。This property has Disabled and Enabled options. 情報アイコンには追加のテキストがあり、このオプションが目的のプロパティであることを確認できます。The info icon has additional text that confirms this option is likely the property we want. ただし、ポータルのこの画面ではプロパティ名はわかりません。However, the portal doesn't tell us the property name on this screen.

[確認と作成] タブのページの下部に、 [Automation のテンプレートをダウンロードする] リンクがあります。On the Review + create tab, a link is at the bottom of the page to Download a template for automation. このリンクを選択すると、構成したリソースを作成するテンプレートが開きます。Selecting the link opens the template that creates the resource we configured. この場合は、2 つの重要な情報が表示されます。In this case, we see two key pieces of information:

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

この情報でわかるのは、プロパティの種類と、探しているプロパティが supportsHttpsTrafficOnly であるということです。This information tells us the property type and also confirms supportsHttpsTrafficOnly is the property we're looking for.

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

GitHub 上の Azure クイックスタート テンプレートには、さまざまなリソース用に構築された数百もの ARM テンプレートがあります。The Azure quickstart templates on GitHub has hundreds of ARM templates built for different resources. これらのテンプレートは、探しているリソースのプロパティを見つけるのに役立ちます。These templates can be a great way to find the resource property you're looking for. 探しているプロパティであるように見えて、別のものを制御しているプロパティである場合もあります。Some properties may appear to be what you're looking for, but control something else.

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

supportsHttpsTrafficOnly が適切なプロパティであるかどうかを検証するには、ARM テンプレート リファレンスで、ストレージ プロバイダーの ストレージ アカウント リソースについて確認します。To validate supportsHttpsTrafficOnly is correct property, check the ARM template reference for the storage account resource on the storage provider. プロパティ オブジェクトには、有効なパラメーターのリストがあります。The properties object has a list of valid parameters. [StorageAccountPropertiesCreateParameters-object] リンクを選択すると、許容されるプロパティの表が表示されます。Selecting the StorageAccountPropertiesCreateParameters-object link shows a table of acceptable properties. supportsHttpsTrafficOnly が存在し、その説明は探しているものと一致していてビジネス要件を満たします。supportsHttpsTrafficOnly is present and the description matches what we are looking for to meet the business requirements.

Azure Resource ExplorerAzure Resource Explorer

Azure リソースを探すもう 1 つの方法は、Azure Resource Explorer (プレビュー) を使用することです。Another way to explore your Azure resources is through the Azure Resource Explorer (Preview). このツールはお使いのサブスクリプションのコンテキストを使用するため、Web サイトで Azure 資格情報を使用して認証する必要があります。This tool uses the context of your subscription, so you need to authenticate to the website with your Azure credentials. 認証されると、プロバイダー、サブスクリプション、リソース グループ、リソースごとに参照できます。Once authenticated, you can browse by providers, subscriptions, resource groups, and resources.

ストレージ アカウントのリソースを見つけて、プロパティを確認します。Locate a storage account resource and look at the properties. ここでも、supportsHttpsTrafficOnly プロパティを確認できます。We see the supportsHttpsTrafficOnly property here as well. [ドキュメント] タブを選択すると、プロパティの説明が前にリファレンス ドキュメントで見たものと一致することを確認できます。Selecting the Documentation tab, we see that the property description matches what we found in the reference docs earlier.

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

リソースのプロパティを特定しましたが、このプロパティをエイリアスにマップする必要があります。We've identified the resource property, but we need to map that property to an alias.

Azure リソースのエイリアスを判別する方法はいくつかあります。There are a few ways to determine the aliases for an Azure resource. このチュートリアルでは、それぞれについて見ていきます。We'll look at each for this tutorial:

  • VS Code 用 Azure Policy 拡張機能Azure Policy extension for VS Code
  • Azure CLIAzure CLI
  • Azure PowerShellAzure PowerShell

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

VS Code 拡張機能の Azure Policy 拡張機能を使用すると、リソースを簡単に参照し、エイリアスを検出できます。The Azure Policy extension for VS Code extension makes it easy to browse your resources and discover aliases.

注意

VS Code 拡張機能では、Resource Manager モードのプロパティのみが公開され、リソースプロバイダー モードのプロパティは表示されません。The VS Code extension only exposes Resource Manager mode properties and doesn't display any Resource Provider mode properties.

Azure CLIAzure CLI

Azure CLI では、az provider コマンド グループを使用してリソースのエイリアスを探します。In Azure CLI, the az provider command group is used to search for resource aliases. これまでに Azure リソースについて取得した詳細に基づいて、Microsoft.Storage 名前空間でフィルター処理します。We'll filter for the Microsoft.Storage namespace based on the details we got about the Azure resource earlier.

# 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 という名前のストレージ アカウントでサポートされているエイリアスを確認します。In the results, we see an alias supported by the storage accounts named supportsHttpsTrafficOnly. このエイリアスが存在するということは、目的のビジネス要件を適用するためのポリシーを作成できるということです。This existence of this alias means we can write the policy to enforce our business requirements!

Azure PowerShellAzure PowerShell

Azure PowerShell では、Get-AzPolicyAlias コマンドレットを使用してリソースのエイリアスを探します。In Azure PowerShell, the Get-AzPolicyAlias cmdlet is used to search for resource aliases. これまでに Azure リソースについて取得した詳細に基づいて、Microsoft.Storage 名前空間でフィルター処理します。We'll filter for the Microsoft.Storage namespace based on the details we got about the Azure resource earlier.

# 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 という名前のストレージ アカウントでサポートされているエイリアスを確認します。Like Azure CLI, the results show an alias supported by the storage accounts named supportsHttpsTrafficOnly.

使用する効果を決定するDetermine the effect to use

非準拠リソースをどう処理するかを決定することは、最初に何を評価するかを決定することと同じくらい重要です。Deciding what to do with your non-compliant resources is nearly as important as deciding what to evaluate in the first place. 非準拠リソースに対して考えられる応答はそれぞれ、効果と呼ばれます。Each possible response to a non-compliant resource is called an effect. 効果は、非準拠リソースがログ記録されるか、ブロックされるか、追加されるデータがあるか、リソースを準拠状態に戻すために関連付けられているデプロイがあるかを制御します。The effect controls if the non-compliant resource is logged, blocked, has data appended, or has a deployment associated to it for putting the resource back into a compliant state.

この例では、非準拠リソースを Azure 環境で作成したくないため、必要な効果は Deny です。For our example, Deny is the effect we want as we don't want non-compliant resources created in our Azure environment. Audit は、ポリシーの効果を Deny に設定する前にポリシーの影響を判別するのに最適な効果です。Audit is a good first choice for a policy effect to determine what the impact of a policy is before setting it to Deny. 割り当てごとにより簡単に効果を変更できるようにする方法の 1 つは、効果をパラメーター化することです。One way to make changing the effect per assignment easier is to parameterize the effect. 詳細な方法については、「パラメーター」を参照してください。See parameters below for the details on how.

定義を作成するCompose the definition

これで、管理しようとしているもののプロパティの詳細とエイリアスがわかりました。We now have the property details and alias for what we plan to manage. 次は、ポリシー ルール自体を作成します。Next, we'll compose the policy rule itself. ポリシー言語に慣れていない場合は、ポリシー定義の構造に関するページでポリシー定義の構成方法を確認してください。If you aren't yet familiar with the policy language, reference policy definition structure for how to structure the policy definition. ポリシー定義の空のテンプレートは次のようになります。Here is an empty template of what a policy definition looks like:

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

MetadataMetadata

最初の 3 つのコンポーネントは、ポリシー メタデータです。The first three components are policy metadata. ルールを作成する目的がわかっているため、これらのコンポーネントに値を指定するのは簡単です。These components are easy to provide values for since we know what we are creating the rule for. Mode は、主にタグとリソースの場所に関するコンポーネントです。Mode is primarily about tags and resource location. タグをサポートするリソースに評価を制限する必要はないため、mode には all という値を使用します。Since we don't need to limit evaluation to resources that support tags, we'll use the all value for mode.

"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

評価の変更のためにパラメーターは使用していませんが、トラブルシューティング用にパラメーターを使用して 効果 を変更できるようにしたいと思います。While we didn't use a parameter for changing the evaluation, we do want to use a parameter to allow changing the effect for troubleshooting. effectType パラメーターを定義し、それを DenyDisabled のみに制限します。We'll define an effectType parameter and limit it to only Deny and Disabled. これら 2 つのオプションは、目的のビジネス要件に一致しています。These two options match our business requirements. 完成した parameters ブロックの例を次に示します。The finished parameters block looks like this example:

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

ポリシー規則Policy rule

ポリシー ルールの作成は、カスタム ポリシー定義を構築する際の最後の手順です。Composing the policy rule is the final step in building our custom policy definition. 次のテストのために、2 つのステートメントを特定しました。We've identified two statements to test for:

  • ストレージ アカウントの 種類Microsoft.Storage/storageAccountsThat the storage account type is Microsoft.Storage/storageAccounts
  • ストレージ アカウントの supportsHttpsTrafficOnlytrue ではないThat the storage account supportsHttpsTrafficOnly isn't true

これらのステートメントが両方とも true である必要があるので、allOf 論理演算子を使用します。Since we need both of these statements to be true, we'll use the allOf logical operator. 静的に宣言する代わりに、effectType パラメーターを effect に渡します。We'll pass the effectType parameter to the effect instead of making a static declaration. 完成したルールは次の例のようになります。Our finished rule looks like this example:

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

完成した定義Completed definition

ポリシーの 3 つの部分をすべて定義して、完成した定義を次に示します。With all three parts of the policy defined, here is our completed definition:

{
    "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')]"
            }
        }
    }
}

この完成した定義を使用して、新しいポリシーを作成できます。The completed definition can be used to create a new policy. ポータルと各 SDK (Azure CLI、Azure PowerShell、REST API) で定義の受け入れ方は異なるので、それぞれのコマンドを参照して適切な使用方法を確認してください。Portal and each SDK (Azure CLI, Azure PowerShell, and REST API) accept the definition in different ways, so review the commands for each to validate correct usage. 次に、パラメーター化した効果を使用して適切なリソースに割り当て、ストレージ アカウントのセキュリティを管理します。Then assign it, using the parameterized effect, to appropriate resources to manage the security of your storage accounts.

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

このチュートリアルのリソースに対する作業が完了した場合は、次の手順を使用して、ここで作成した割り当てまたは定義をすべて削除してください。If you're done working with resources from this tutorial, use the following steps to delete any of the assignments or definitions created above:

  1. Azure Policy ページの左側にある [作成] の下の [定義] (または割り当てを削除する場合は [割り当て] ) を選択します。Select Definitions (or Assignments if you're trying to delete an assignment) under Authoring in the left side of the Azure Policy page.

  2. 削除する新しいイニシアティブまたはポリシー定義 (または割り当て) を見つけます。Search for the new initiative or policy definition (or assignment) you want to remove.

  3. 行を右クリックするか、定義 (または割り当て) の末尾にある省略記号を選択し、 [定義の削除] (または [割り当ての削除] ) を選択します。Right-click the row or select the ellipses at the end of the definition (or assignment), and select Delete definition (or Delete assignment).

確認Review

このチュートリアルでは、以下のタスクを完了しました。In this tutorial, you successfully accomplished the following tasks:

  • ビジネス要件を特定するIdentified your business requirements
  • 各要件を Azure リソースのプロパティにマップするMapped each requirement to an Azure resource property
  • プロパティをエイリアスにマップするMapped the property to an alias
  • 使用する効果を決定するDetermined the effect to use
  • ポリシー定義を作成するComposed the policy definition

次のステップNext steps

次に、カスタム ポリシー定義を使用し、ポリシーを作成して割り当てます。Next, use your custom policy definition to create and assign a policy: