Azure Policy を使って準拠していないリソースを修復するRemediate non-compliant resources with Azure Policy

deployIfNotExistsmodify に準拠していないリソースは、修復 を使って準拠状態にすることができます。Resources that are non-compliant to a deployIfNotExists or modify policy can be put into a compliant state through Remediation. 修復は、既存のリソースおよびサブスクリプションに割り当てられているポリシーの deployIfNotExists 効果や 変更操作 を実行するように Azure Policy に指示することによって実行されます。その割り当てが、管理グループ、サブスクリプション、リソース グループ、または個々のリソースのいずれに対するものかは関係ありません。Remediation is accomplished by instructing Azure Policy to run the deployIfNotExists effect or the modify operations of the assigned policy on your existing resources and subscriptions, whether that assignment is to a management group, a subscription, a resource group, or an individual resource. この記事では、Azure Policy による修復を理解して実行するために必要な手順を示します。This article shows the steps needed to understand and accomplish remediation with Azure Policy.

修復のセキュリティの仕組みHow remediation security works

deployIfNotExists ポリシー定義にあるテンプレートを実行するとき、Azure Policy では マネージド ID が使用されます。When Azure Policy runs the template in the deployIfNotExists policy definition, it does so using a managed identity. マネージド ID は Azure Policy によって各割り当てに対して作成されますが、どのようなロールをマネージド ID に付与するかについての詳細が必要です。Azure Policy creates a managed identity for each assignment, but must have details about what roles to grant the managed identity. マネージド ID にロールが存在しない場合、そのポリシーまたはイニシアチブの割り当て中にエラーが表示されます。If the managed identity is missing roles, an error is displayed during the assignment of the policy or an initiative. ポータルを使用している場合、割り当てが開始されると、Azure Policy によって、示されているロールが自動的にマネージド ID に付与されます。When using the portal, Azure Policy automatically grants the managed identity the listed roles once assignment starts. SDK を使用している場合、マネージド ID にロールを手動で付与する必要があります。When using SDK, the roles must manually be granted to the managed identity. マネージド ID の "場所" は、Azure Policy による操作に影響を与えません。The location of the managed identity doesn't impact its operation with Azure Policy.

マネージド ID に対して定義されたアクセス許可がない deployIfNotExists ポリシーのスクリーンショット。

重要

次のシナリオでは、割り当てのマネージド ID に手動でアクセスを許可しないと、修復デプロイが失敗します。In the following scenarios, the assignment's managed identity must be manually granted access or the remediation deployment will fail:

  • 割り当てが SDK によって作成された場合If the assignment is created through SDK
  • deployIfNotExists または modify によって変更されたリソースがポリシー割り当ての範囲外である場合If a resource modified by deployIfNotExists or modify is outside the scope of the policy assignment
  • テンプレートがポリシー割り当ての範囲外のリソースのプロパティにアクセスする場合If the template accesses properties on resources outside the scope of the policy assignment

ポリシー定義を設定するConfigure policy definition

最初の手順は、含まれているテンプレートのコンテンツを deployIfNotExistsmodify が正しくデプロイするために必要なロールを、ポリシー定義に定義することです。The first step is to define the roles that deployIfNotExists and modify needs in the policy definition to successfully deploy the content of your included template. details (詳細) プロパティで roleDefinitionIds プロパティを追加します。Under the details property, add a roleDefinitionIds property. このプロパティは、環境にあるロールに合致する一連の文字列です。This property is an array of strings that match roles in your environment. deployIfNotExists の例または modify の例に示す例を参照してください。For a full example, see the deployIfNotExists example or the modify examples.

"details": {
    ...
    "roleDefinitionIds": [
        "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/{roleGUID}",
        "/providers/Microsoft.Authorization/roleDefinitions/{builtinroleGUID}"
    ]
}

roleDefinitionIds プロパティは完全なリソース識別子を使用し、ロールの短い roleName は使用しません。The roleDefinitionIds property uses the full resource identifier and doesn't take the short roleName of the role. 環境にある「共同作成者」ロールの ID を取得するには、次のコードを使用します。To get the ID for the 'Contributor' role in your environment, use the following code:

az role definition list --name 'Contributor'

管理対象 ID を手動で設定します。Manually configure the managed identity

ポータルを使用して割り当てを作成する際、Azure Policy によって、マネージド ID の生成と roleDefinitionIds に定義されているロールのマネージド ID への付与の両方が実行されます。When creating an assignment using the portal, Azure Policy both generates the managed identity and grants it the roles defined in roleDefinitionIds. 次の条件では、管理対象 ID を作成し、アクセス許可を割り当てる手順を手動で行う必要があります:In the following conditions, steps to create the managed identity and assign it permissions must be done manually:

  • SDK (Azure PowerShell など) を使用している場合While using the SDK (such as Azure PowerShell)
  • 割り当てスコープの範囲外のリソースがテンプレートによって変更される場合When a resource outside the assignment scope is modified by the template
  • 割り当てスコープの範囲外のリソースがテンプレートによって読み取られる場合When a resource outside the assignment scope is read by the template

PowerShell で管理対象 ID を作成するCreate managed identity with PowerShell

ポリシーの割り当て時に管理対象 ID を作成するには、場所 を定義して、AssignIdentity を使用する必要があります。To create a managed identity during the assignment of the policy, Location must be defined and AssignIdentity used. 次の例では、組み込みポリシー Deploy SQL DB transparent data encryption の定義を取得して、ターゲット リソース グループを設定し、割り当てを作成しています。The following example gets the definition of the built-in policy Deploy SQL DB transparent data encryption, sets the target resource group, and then creates the assignment.

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

# Get the built-in "Deploy SQL DB transparent data encryption" policy definition
$policyDef = Get-AzPolicyDefinition -Id '/providers/Microsoft.Authorization/policyDefinitions/86a912f6-9a06-4e26-b447-11b16ba8659f'

# Get the reference to the resource group
$resourceGroup = Get-AzResourceGroup -Name 'MyResourceGroup'

# Create the assignment using the -Location and -AssignIdentity properties
$assignment = New-AzPolicyAssignment -Name 'sqlDbTDE' -DisplayName 'Deploy SQL DB transparent data encryption' -Scope $resourceGroup.ResourceId -PolicyDefinition $policyDef -Location 'westus' -AssignIdentity

この結果、$assignment 変数には管理対象 ID のプリンシパル ID とともに、ポリシー割り当てを作成するときに返される標準値が含まれます。The $assignment variable now contains the principal ID of the managed identity along with the standard values returned when creating a policy assignment. この変数には $assignment.Identity.PrincipalId を使ってアクセスできます。It can be accessed through $assignment.Identity.PrincipalId.

定義したロールを PowerShell を使って付与するGrant defined roles with PowerShell

新しい管理対象 ID に必要なロールを付与するには、Azure Active Directory からレプリケーションを完了しておく必要があります。The new managed identity must complete replication through Azure Active Directory before it can be granted the needed roles. 次の例では、レプリケーションを完了した後、roleDefinitionIds に対して $policyDef でポリシー定義を反復処理し、New-AzRoleAssignment を使用して、新しい管理対象 ID にロールを付与します。Once replication is complete, the following example iterates the policy definition in $policyDef for the roleDefinitionIds and uses New-AzRoleAssignment to grant the new managed identity the roles.

# Use the $policyDef to get to the roleDefinitionIds array
$roleDefinitionIds = $policyDef.Properties.policyRule.then.details.roleDefinitionIds

if ($roleDefinitionIds.Count -gt 0)
{
    $roleDefinitionIds | ForEach-Object {
        $roleDefId = $_.Split("/") | Select-Object -Last 1
        New-AzRoleAssignment -Scope $resourceGroup.ResourceId -ObjectId $assignment.Identity.PrincipalId -RoleDefinitionId $roleDefId
    }
}

定義したロールをポータルから付与するGrant defined roles through portal

ポータルを使用して、定義したロールを割り当てのマネージド ID に付与するには、アクセス制御 (IAM) を使用する方法と、ポリシーまたはイニシアチブの割り当てを編集して [保存] を選択する方法の 2 つがあります。There are two ways to grant an assignment's managed identity the defined roles using the portal, by using Access control (IAM) or by editing the policy or initiative assignment and selecting Save.

割り当ての管理対象 ID にロールを追加するには、次の手順に従います。To add a role to the assignment's managed identity, follow these steps:

  1. Azure portal で [すべてのサービス] を選択し、「Policy」を検索して選択することで、Azure Policy サービスを起動します。Launch the Azure Policy service in the Azure portal by selecting All services, then searching for and selecting Policy.

  2. Azure Policy ページの左側にある [割り当て] を選択します。Select Assignments on the left side of the Azure Policy page.

  3. マネージド ID がある割り当てを見つけて、その名前を選択します。Locate the assignment that has a managed identity and select the name.

  4. 編集ページで 割り当て ID を見つけます。Find the Assignment ID property on the edit page. 割り当て ID は以下のような ID です。The assignment ID will be something like:

    /subscriptions/{subscriptionId}/resourceGroups/PolicyTarget/providers/Microsoft.Authorization/policyAssignments/2802056bfc094dfb95d4d7a5
    

    管理対象 ID の名前は、割り当てリソース ID の最後の部分です。この例では 2802056bfc094dfb95d4d7a5 です。The name of the managed identity is the last portion of the assignment resource ID, which is 2802056bfc094dfb95d4d7a5 in this example. 割り当てリソース ID のこの部分をコピーします。Copy this portion of the assignment resource ID.

  5. ロールの定義で手動で追加する必要があるリソース、またはリソースの親コンテナー (リソース グループ、サブスクリプション、管理グループ) に移動します。Navigate to the resource or the resources parent container (resource group, subscription, management group) that needs the role definition manually added.

  6. リソース ページにある アクセス制御 (IAM) のリンクを選択して、アクセス制御ページの上部にある [+ Add role assignment](+ ロール割り当ての追加) を選択します。Select the Access control (IAM) link in the resources page and then select + Add role assignment at the top of the access control page.

  7. ポリシー定義から、 roleDefinitionIds に一致するロールを選択します。Select the appropriate role that matches a roleDefinitionIds from the policy definition. Assign access to は ''Azure AD user, group, or application という既定値の設定のままにします。Leave Assign access to set to the default of 'Azure AD user, group, or application'. [選択] ボックスで、前の手順で見つけた割り当てリソース ID の部分を貼り付けるか、入力します。In the Select box, paste or type the portion of the assignment resource ID located earlier. 検索が完了したら、同じ名前のオブジェクトを選択することで ID を選択し、 [保存] を選択します。Once the search completes, select the object with the same name to select ID and select Save.

修復タスクを作成するCreate a remediation task

ポータルを通じて修復タスクを作成するCreate a remediation task through portal

評価では、deployIfNotExists または modify 効果を持つポリシー割り当てによって、準拠していないリソースまたはサブスクリプションがあるかどうかが判定されます。During evaluation, the policy assignment with deployIfNotExists or modify effects determines if there are non-compliant resources or subscriptions. 準拠していないリソースまたはサブスクリプションが見つかった場合は、修復 ページにその詳細が表示されます。When non-compliant resources or subscriptions are found, the details are provided on the Remediation page. 準拠していないリソースまたはサブスクリプションがあるポリシーの一覧には、修復タスク をトリガーするオプションがあります。Along with the list of policies that have non-compliant resources or subscriptions is the option to trigger a remediation task. このオプションは、deployIfNotExists テンプレートまたは modify 操作からデプロイを作成するものです。This option is what creates a deployment from the deployIfNotExists template or the modify operations.

修復タスク を作成するには、次の手順に従います。To create a remediation task, follow these steps:

  1. Azure portal で [すべてのサービス] を選択し、「Policy」を検索して選択することで、Azure Policy サービスを起動します。Launch the Azure Policy service in the Azure portal by selecting All services, then searching for and selecting Policy.

    [すべてのサービス] で「Policy」 を検索している様子を示すスクリーンショット。

  2. Azure Policy ページの左側にある [修復] を選択します。Select Remediation on the left side of the Azure Policy page.

    [Policy] ページの修復ノードのスクリーンショット。

  3. deployIfNotExists および modify のポリシー割り当てのうち、準拠していないリソースがあるものはすべて、 [修復するポリシー] タブとデータ テーブルに含まれます。All deployIfNotExists and modify policy assignments with non-compliant resources are included on the Policies to remediate tab and data table. 準拠していないリソースがあるポリシーを選択します。Select on a policy with resources that are non-compliant. 新しい修復タスク ページが開きます。The New remediation task page opens.

    注意

    [修復タスク] ページは、 [コンプライアンス] ページからポリシーを見つけて選択し、 [修復タスクの作成] ボタンを選択して開くこともできます。An alternate way to open the remediation task page is to find and select the policy from the Compliance page, then select the Create Remediation Task button.

  4. [New remediation task](新しい修復タスク) ページで [Scope](スコープ) 省略記号ボタンを使って、ポリシーが割り当てられている子リソースを選択することで、修復するリソースをフィルター処理します (個々のリソース オブジェクトまでフィルター可能)。On the New remediation task page, filter the resources to remediate by using the Scope ellipses to pick child resources from where the policy is assigned (including down to the individual resource objects). また、 [場所] ドロップダウンを使って、リソースをさらにフィルター処理することもできます。Additionally, use the Locations drop-down to further filter the resources. 表に示されたリソースのみ修復されます。Only resources listed in the table will be remediated.

    修復ノードと、修復するリソースのグリッドのスクリーンショット。

  5. リソースのフィルター処理を終えたら、 [修復] を選択して、修復タスクを開始します。Begin the remediation task once the resources have been filtered by selecting Remediate. [修復タスク] タブに対するポリシー コンプライアンス ページが開いて、タスクの進行状況が表示されます。The policy compliance page opens to the Remediation tasks tab to show the state of the tasks progress. 修復タスクによって作成されたデプロイが、すぐに開始されます。Deployments created by the remediation task begin right away.

    [修復タスク] タブと、既存の修復タスクの進行状況を示すスクリーンショット。

  6. ポリシー コンプライアンス ページの [修復タスク] を選択すると、進行状況の詳細が表示されます。Select on the remediation task from the policy compliance page to get details about the progress. 修復されているリソースの一覧と共に、タスクに使用されたフィルターが表示されます。The filtering used for the task is shown along with a list of the resources being remediated.

  7. [修復タスク] ページで、リソースを右クリックして、修復タスクのデプロイまたはリソースのいずれかを表示します。From the Remediation task page, right-click on a resource to view either the remediation task's deployment or the resource. 行の末尾にある [関連イベント] を選択すると、エラー メッセージなどの詳細が表示されます。At the end of the row, select on Related events to see details such as an error message.

    [修復タスク] タブのリソースのコンテキスト メニューを示すスクリーンショット。

[修復タスク] を使ってデプロイされたリソースは、ポリシー コンプライアンス ページの [デプロイされたリソース] タブに追加されます。Resources deployed through a remediation task are added to the Deployed Resources tab on the policy compliance page.

Azure CLI を通じて修復タスクを作成するCreate a remediation task through Azure CLI

Azure CLI を使用して 修復タスク を作成するには、az policy remediation コマンドを使用します。To create a remediation task with Azure CLI, use the az policy remediation commands. {subscriptionId} をサブスクリプション ID に置き換え、{myAssignmentId}deployIfNotExists または modify のポリシー割り当て ID に置き換えます。Replace {subscriptionId} with your subscription ID and {myAssignmentId} with your deployIfNotExists or modify policy assignment ID.

# Login first with az login if not using Cloud Shell

# Create a remediation for a specific assignment
az policy remediation create --name myRemediation --policy-assignment '/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/policyAssignments/{myAssignmentId}'

その他の修復コマンドや例については、az ポリシーの修復 コマンドを参照してください。For other remediation commands and examples, see the az policy remediation commands.

Azure PowerShell を通じて修復タスクを作成するCreate a remediation task through Azure PowerShell

Azure PowerShell を使用して 修復タスク を作成するには、Start-AzPolicyRemediation コマンドを使用します。To create a remediation task with Azure PowerShell, use the Start-AzPolicyRemediation commands. {subscriptionId} をサブスクリプション ID に置き換え、{myAssignmentId}deployIfNotExists または modify のポリシー割り当て ID に置き換えます。Replace {subscriptionId} with your subscription ID and {myAssignmentId} with your deployIfNotExists or modify policy assignment ID.

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

# Create a remediation for a specific assignment
Start-AzPolicyRemediation -Name 'myRemedation' -PolicyAssignmentId '/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/policyAssignments/{myAssignmentId}'

その他の修復コマンドレットや例については、Az.PolicyInsights モジュールを参照してください。For other remediation cmdlets and examples, see the Az.PolicyInsights module.

Azure portal でポリシー割り当て時に修復タスクを作成するCreate a remediation task during policy assignment in the Azure portal

修復タスクを簡単に作成する方法は、ポリシーの割り当て時に Azure portal から行うことです。A streamlined way of creating a remediation task is to do so from the Azure portal during policy assignment. 割り当てるポリシー定義が deployIfNotExists または Modify 効果である場合、 [修復] タブのウィザードによって [修復タスクを作成する] オプションが提供されます。If the policy definition to assign is a deployIfNotExists or a Modify effect, the wizard on the Remediation tab offers a Create a remediation task option. このオプションを選択すると、ポリシーの割り当てと同時に修復タスクが作成されます。If this option is selected, a remediation task is created at the same time as the policy assignment.

次のステップNext steps