Azure Policy を使って準拠していないリソースを修復する
deployIfNotExists
または modify
効果を持つポリシーに準拠していないリソースは、修復を使用して準拠状態にすることができます。 修復は、既存のリソースとサブスクリプションに割り当てられたポリシーの deployIfNotExists
テンプレートまたは modify
テンプレートをデプロイする修復タスクを使用して修復が完了します。これはその割り当てが管理グループ、サブスクリプション、リソース グループ、個人リソース上にあるかどうかには関係ありません。 この記事では、Azure Policy による修復を理解して実行するために必要な手順を示します。
修復のアクセス制御の仕組み
deployIfNotExists
ポリシーの評価時に Azure Policy によりテンプレートのデプロイが開始される場合、または modify
ポリシーの評価時にリソースが変更される場合には、これらの操作にはポリシーの割り当てに関連付けられているマネージド ID が使用されます。 ポリシーの割り当てでは、Azure リソースの承認にマネージド ID が使用されます。 ポリシー サービスによって作成されたシステム割り当てマネージド ID、またはユーザーによって指定されるユーザー割り当て ID のいずれかを使用できます。 マネージド ID には、リソースを修復するために必要な最小の Azure ロールベースのアクセス制御 (Azure RBAC) ロールを割り当てる必要があります。 マネージド ID にロールが存在しない場合、そのポリシーまたはイニシアチブの割り当て中に、ポータルにエラーが表示されます。 ポータルを使用すると、割り当てが開始されると、一覧表示されているロールが Azure Policy によって自動的にマネージド ID に付与されます。 Azure ソフトウェア開発キット (SDK) を使用する場合、ロールはマネージド ID に手動で付与する必要があります。 マネージド ID の場所は、Azure Policy を使用する操作に影響を与えません。
Note
また、ポリシー定義を変更しても、割り当てや関連付けられているマネージド ID は自動的に更新されません。
修復セキュリティは、次の手順で構成できます。
ポリシー定義を設定する
前提条件として、ポリシー定義で、含まれているテンプレートのコンテンツを deployIfNotExists
と modify
が正常にデプロイする必要のあるロールが定義されている必要があります。 組み込みのポリシー定義にはこれらのロールが事前に設定されているため、アクションは必要ありません。 カスタム ポリシー定義の場合、details
プロパティの下に、 roleDefinitionIds
プロパティを追加します。 このプロパティは、環境にあるロールに合致する一連の文字列です。 完全な例については、deployIfNotExists または modify を参照してください。
"details": {
...
"roleDefinitionIds": [
"/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/{roleGUID}",
"/providers/Microsoft.Authorization/roleDefinitions/{builtinroleGUID}"
]
}
roleDefinitionIds
プロパティは完全なリソース識別子を使用し、ロールの短い roleName
を受け取りません。 環境内の投稿者ロールの ID を取得するには、次の Azure CLI コードを使用します:
az role definition list --name "Contributor"
重要
ポリシー定義内に roleDefinitionIds
を定義したり、マネージド ID に手動でアクセス許可を割り当てたりするときは、アクセス許可の範囲が可能な限り狭いセットとなるよう制限することをお勧めします。 その他のベスト プラクティスについては、「マネージド ID のベスト プラクティスに関する推奨事項」を参照してください。
マネージド ID を構成する
Azure Policy の各割り当ては、1 つのマネージド ID にのみ関連付けることができます。 ただし、マネージド ID には複数のロールを割り当てることができます。 構成は 2 つの手順で行われます。最初にシステム割り当てまたはユーザー割り当てマネージド ID を作成してから、必要なロールを付与します。
Note
ポータルを使用してマネージド ID を作成すると、ロールがマネージド ID に自動的に付与されます。 ポリシー定義で roleDefinitionIds
を後から編集する場合は、ポータルでも新しいアクセス許可を手動で付与する必要があります。
マネージド ID を作成する
ポータルを使用して割り当てを作成する場合、Azure Policy では、システム割り当てマネージド ID を生成して、ポリシー定義の roleDefinitionIds
に定義されているロールを付与できます。 または、同じロール割り当てを受け取るユーザー割り当てマネージド ID を指定することもできます。
ポータルでシステム割り当てマネージド ID を設定するには、次の手順を実行します。
割り当ての作成または編集のビューにある [修復] タブの [マネージド ID の種類] で [システム割り当てマネージド ID] が選択されていることを確認します。
マネージド ID が置かれる場所を指定します。
スコープは割り当てスコープから継承されるため、システム割り当てマネージド ID のスコープを割り当てないでください。
ポータルでユーザー割り当てマネージド ID を設定するには、次の手順を実行します。
割り当ての作成または編集のビューにある [修復] タブの [マネージド ID の種類] で [ユーザー割り当てマネージド ID] が選択されていることを確認します。
マネージド ID がホストされるスコープを指定します。 マネージド ID のスコープは、割り当てのスコープと同等である必要はありませんが、同じテナント内に存在している必要があります。
[既存のユーザー割り当て ID] でマネージド ID を選択します。
定義されたロールを使用してマネージド ID にアクセス許可を付与する
重要
必要な修復タスクを実行するために必要なアクセス許可がマネージド ID にない場合、ポータルでのみ、それにアクセス許可が自動的に付与されます。 ポータルを使用してマネージド ID を作成する場合は、この手順をスキップできます。
その他のすべての方法では、ロールを追加して割り当てのマネージド ID に手動でアクセス権を付与する必要があります。そうしないと、修復のデプロイは失敗します。
手動アクセス許可を必要とするシナリオの例は次のとおりです。
- 割り当てが Azure ソフトウェア開発キット (SDK) を使用して作成された場合
deployIfNotExists
またはmodify
によって変更されたリソースがポリシー割り当ての範囲外である場合- テンプレートがポリシー割り当ての範囲外のリソースのプロパティにアクセスする場合
ポータルを使用して、定義したロールを割り当てのマネージド ID に付与するには、アクセス制御 (IAM) を使用する方法と、ポリシーまたはイニシアチブの割り当てを編集して [保存] を選択する方法の 2 つがあります。
割り当ての管理対象 ID にロールを追加するには、次の手順に従います。
Azure portal で [すべてのサービス] を選択し、「Policy」を検索して選択することで、Azure Policy サービスを起動します。
Azure Policy ページの左側にある [割り当て] を選択します。
マネージド ID がある割り当てを見つけて、その名前を選択します。
編集ページで割り当て ID を見つけます。 割り当て ID は次の例のようになります:
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/2802056bfc094dfb95d4d7a5
管理対象 ID の名前は、割り当てリソース ID の最後の部分です。この例では
2802056bfc094dfb95d4d7a5
です。 割り当てリソース ID のこの部分をコピーします。ロールの定義で手動で追加する必要があるリソース、またはリソースの親コンテナー (リソース グループ、サブスクリプション、管理グループ) に移動します。
リソース ページにあるアクセス制御 (IAM) のリンクを選択して、アクセス制御ページの上部にある [+ Add role assignment](+ ロール割り当ての追加) を選択します。
ポリシー定義から、
roleDefinitionIds
に一致する適切なロールを選択します。 アクセスの割当先セットは、ユーザー、グループ、またはアプリケーション' の既定値に設定されたままにします。 [選択] ボックスで、前の手順で見つけた割り当てリソース ID の部分を貼り付けるか、入力します。 検索が完了したら、同じ名前のオブジェクトを選択することで ID を選択し、 [保存] を選択します。
修復タスクを作成する
Azure portal で [すべてのサービス] を選択し、 [Policy] を検索して選択することで、Azure Policy サービスを起動します。
手順 1: 修復タスクの作成を開始する
ポータルを使用して修復タスクを作成するには、3 つの方法があります。
オプション 1: [修復] ページから修復タスクを作成する
Azure Policy ページの左側にある [修復] を選択します。
すべての
deployIfNotExists
ポリシーとmodify
ポリシーの割り当ては、[修復するポリシー] タブに表示されます。非準拠のリソースがあるリソースを選択して、[新しい修復タスク] ページを開きます。手順に従って、修復タスクの詳細を指定します。
オプション 2: 準拠していないポリシー割り当てから修復タスクを作成する
Azure Policy ページの左側にある [コンプライアンス] を選択します。
deployIfNotExists
またはmodify
効果を含む非準拠ポリシーまたはイニシアティブの割り当てを選択します。ページの上部にある [修復タスクの作成] ボタンを選択して、[新しい修復タスク] ページを開きます。
手順に従って、修復タスクの詳細を指定します。
オプション 3: ポリシー割り当て時に修復タスクを作成する
割り当てるポリシーまたはイニシアティブ定義に deployIfNotExists
または modify
効果がある場合、ウィザードの [修復] タブに、ポリシーの割り当てと同時に修復タスクを作成するための [修復タスクの作成] オプションが表示されます。
Note
これは修復タスクを作成するための最も合理化されたアプローチであり、"サブスクリプション" に割り当てられたポリシー用にサポートされています。 "管理グループ" に割り当てられているポリシーの場合、評価でリソースのコンプライアンスが決定された後、オプション 1 またはオプション 2 を使用して修復タスクを作成する必要があります。
ポータルの割り当てウィザードから、[修復] タブに移動します。[修復タスクの作成] のチェック ボックスをオンにします。
修復タスクをイニシアチブの割り当てから開始した場合は、ドロップダウンから修復するポリシーを選択します。
マネージド ID を構成し、ウィザードの残りの部分に入力します。 修復タスクは割り当て作成時に作成されます。
手順 2: 修復タスクの詳細を指定する
この手順は、オプション 1 またはオプション 2 を使用して修復タスクの作成を開始する場合にのみ適用されます。
修復タスクをイニシアチブの割り当てから開始した場合は、ドロップダウンから修復するポリシーを選択します。 一度に 1 つの修復タスクを使用して、1 つの
deployIfNotExists
またはmodify
ポリシーを修復できます。必要に応じて、ページで [修復の設定] を変更します。 各設定の制御について、詳しくは修復タスクの構造をご覧ください。
同じページで [スコープ] 省略記号ボタンを使って、ポリシーが割り当てられている子リソースを選択することで、修復するリソースをフィルター処理します (個々のリソース オブジェクトまで可能)。 また、 [場所] ドロップダウン リストを使って、リソースをさらにフィルター処理することもできます。
[修復] 選択して、リソースがフィルター処理された後に修復タスクを開始します。 [修復タスク] タブに対するポリシー コンプライアンス ページが開いて、タスクの進行状況が表示されます。 修復タスクによって作成されたデプロイが、すぐに開始されます。
手順 3: 修復タスクの進行状況を追跡する
[修復] ページの [修復タスク] タブに移動します。 修復タスクを選択すると、使用されているフィルター処理の詳細、現在の状態、修復されるリソースの一覧が表示されます。
修復タスクの詳細ページで、リソースを右クリックして、修復タスクのデプロイまたはリソースのいずれかを表示します。 行の末尾にある [関連イベント] を選択して、エラー メッセージなどの詳細を確認します。
修復タスクを使ってデプロイされたリソースは、ポリシー割り当ての詳細ページの [デプロイされたリソース] タブに追加されます。
次のステップ
- Azure Policy のサンプルを確認します。
- 「Azure Policy の定義の構造」を確認します。
- 「Policy の効果について」を確認します。
- プログラムによってポリシーを作成する方法を理解します。
- コンプライアンス データを取得する方法を学習します。
- 「Azure 管理グループのリソースを整理する」で、管理グループとは何かを確認します。