ワークロード ID に Azure へのアクセス権を付与する

完了

ワークロード ID は、単独では Azure 環境で何も実行できません。これは、ユーザーが操作する権限を与えられていない限り、Azure リソースを操作できないのと同じです。 このユニットでは、不要なアクセス許可の付与を回避しながら、ワークロード ID による Azure リソースのデプロイおよび構成を承認する方法について学習します。

ワークロード ID の認可

ここまでは、ワークロード ID の概要と、それらを使用して、Microsoft Entra ID に対してデプロイ ワークフローの身元を証明する方法に焦点を当ててきました。 これは、すべて "認証" に関するものです。

Microsoft Entra ID がワークロード ID を認証した後、次の疑問として浮かぶのは、このワークロード ID は何ができるのかということです。 これは "認可" の概念です。 これは、Azure のロールベースのアクセス制御 (RBAC) システム (場合により ID およびアクセス管理 (IAM) とも呼ばれる) の役割です。 Azure RBAC を使用すると、特定のリソース グループ、サブスクリプション、または管理グループへのアクセス権をワークロード ID に付与できます。

Note

ここでは、Azure RBAC システムを使用して、Azure リソース (ストレージ アカウント、Azure App Service プラン、仮想ネットワークなど) を作成および管理するためのアクセス権を付与するだけです。 また、Microsoft Entra ID には、独自のロール システムもあります。これは、"ディレクトリ ロール" と呼ばれることもあります。 これらのロールを使用して、Microsoft Entra ID を管理するためのアクセス許可をワークロード ID に付与します。 このモジュールでは、この件について詳しく説明しませんが、一部のドキュメントでは、両方の状況に対して "ロール" という用語が使用されている場合があるので注意してください。

ワークフローに適したロールの割り当てを選択する

ロールの割り当てには、ロールを割り当てるユーザー ("担当者")、担当者が実行できる内容 ("ロール")、ロールの割り当てが適用される 1 つまたは複数のリソース ("スコープ") という 3 つの重要な構成要素があります。

担当者

ワークロード ID を使用する場合は、それにロールを割り当てます。 ロールを割り当てるには、まず "サービス プリンシパル"を作成する必要があります。これにより、Azure でアプリケーション ロールを付与できるようになります。 サービス プリンシパルを作成したら、アプリケーション登録のアプリケーション ID を引き続き使用できます。

サービス プリンシパルを作成するには、az ad sp create コマンドを使用し、アプリケーション登録のアプリ ID を指定します。

az ad sp create --id A123b4567c-1234-1a2b-2b1a-1234abc12345

サービス プリンシパルを作成するには、New-AzADServicePrincipal コマンドレットを使用し、アプリケーション登録のアプリ ID を指定します。

New-AzADServicePrincipal -AppId A123b4567c-1234-1a2b-2b1a-1234abc12345

Role

割り当てるロールを判断するのに、多少労力が必要になる場合があります。 Azure には、一般的なロールがいくつかあります。

  • 閲覧者: 担当者は、リソースに関する情報を読み取ることができますが、それらを変更または削除することはできません。
  • 共同作成者:担当者は、リソースの作成、既存のリソースの読み取りと変更を行うことができます。 ただし、共同作成者は、リソースへのアクセス権を他のプリンシパルに付与することはできません。
  • 所有者: 他のプリンシパルへのアクセス権の付与など、リソースを完全に制御できます。

注意事項

ワークロード ID には、ジョブを実行するために必要な最小限のアクセス許可のみを付与してください。 ほとんどの場合、所有者ロールは、デプロイ ワークフローに対しては制限が緩すぎます。

また、機能のサブセットへのアクセス権を提供する特定のロールも多数あります。 独自の "カスタム ロールの定義" を作成して、割り当てるアクセス許可の正確な一覧を指定することもできます。

Note

カスタム ロールの定義は、Azure リソースへのアクセス許可を付与するための強力な方法ですが、取り扱いが難しい場合があります。 カスタム ロールの定義に追加する必要があるアクセス許可を正確に判断することは、必ずしも容易ではありません。 ロールの定義を誤って過度に制限したり、許容したりする可能性があります。

どうすればよいかわからない場合は、組み込みロールの定義のいずれかを使用することをお勧めします。 カスタム ロールの定義は、このモジュールの範囲を超えています。

Scope

ロールを割り当てる範囲を決定する必要があります。 この決定は、ワークロード ID によって変更できるリソースの数に影響します。 一般的なスコープは次のとおりです。

  • 単一リソース: 特定のリソースへのアクセス権を付与できます。 通常、デプロイ ワークフローでは、このスコープは使用されません。その理由は、ワークフローで、まだ存在しないリソースが作成されたり、複数のリソースが再構成されたりするためです。
  • リソース グループ: リソース グループ内のすべてのリソースへのアクセス権を付与できます。 共同作成者と所有者は、グループ内でリソースを作成することもできます。 これは、多くのデプロイ ワークフローに適したオプションです。
  • サブスクリプション: サブスクリプション内のすべてのリソースへのアクセス権を付与できます。 1 つのサブスクリプションに複数のアプリケーション、ワークロード、または環境がある場合、サブスクリプションのスコープへのアクセス許可を付与できます。 ただし、これは通常、デプロイ ワークフローに対しては制限が緩すぎます。 代わりに、ロールの割り当てのスコープをリソース グループに設定することを検討する必要があります (デプロイ ワークフローでリソース グループを作成する必要がある場合を除きます)。

ロールの割り当ては継承されることに注意してください。 サブスクリプションでロールを割り当てると、担当者は、そのサブスクリプション内のすべてのリソース グループとリソースにアクセスできます。

適切なロールの割り当ての選択

ロールの割り当ての要素について理解したので、シナリオに適した値を決定できます。 ここでは、考慮する必要がある一般的なガイドラインを示します。

  • できるだけ制限が厳しいロールを使用します。 ワークフローで、基本的な Bicep ファイルのデプロイのみ行い、ロールの割り当ては管理しない場合、所有者ロールは使用しないでください。

  • できるだけ狭いスコープを使用します。 ほとんどのワークフローでは、リソース グループへのリソースのデプロイのみが必要であるため、サブスクリプション スコープのロールの割り当ては付与しないでください。

  • 多くのワークフローでは、ロールの割り当ての適切な既定のオプションは、リソース グループ スコープでの共同作成者ロールです。

  • ワークフローで実行するすべての処理と、今後実行する可能性のあるすべての処理について検討します。 たとえば、Web サイトのデプロイ ワークフロー用のカスタム ロールの定義を作成することを検討し、App Service と Application Insights のみへのアクセス許可を付与するとします。 次の月に、Bicep ファイルに Azure Cosmos DB アカウントを追加することが必要になりましたが、このカスタム ロールでは Azure Cosmos DB リソースの作成はブロックされます。

    ロールの定義を繰り返し変更せずにすむように、組み込みロール、または組み込みロールの組み合わせを代わりに使用することが多くの場合より適切です。 Azure Policy を使用して、許可されたサービス、SKU、場所のガバナンス要件を適用することを検討します。

  • ワークフローをテストして、ロールの割り当てが機能することを確認します。

ロールの割り当ての混在と一致

異なるスコープで異なるアクセス許可を提供する複数のロールの割り当てを作成できます。 たとえば、ワークロード ID に、サブスクリプション全体をスコープとする閲覧者のロールを割り当てたとします。 同じワークロード ID に、特定のリソース グループに対する共同作成者のロールを別途割り当てたとします。 ワークロード ID でそのリソース グループを操作しようとしたとき、より制限の緩い割り当てが適用されます。

複数の環境の使用

おそらく、アプリケーションの開発、テスト、運用環境など、複数の環境を使用します。 各環境のリソースは、異なるリソース グループまたはサブスクリプションにデプロイする必要があります。

環境ごとに個別のワークロード ID を使用する必要があります。 各ワークロードに、デプロイに必要な最小限のアクセス許可セットを付与します。 運用環境へのデプロイのためのアクセス許可と、非運用環境へのデプロイのためのアクセス許可を混在させないように特に注意してください。

ワークロード ID のロールの割り当てを作成する

ワークロード ID のロールの割り当てを作成するには、az role assignment create コマンドを使用します。 担当者、ロール、スコープを指定する必要があります。

az role assignment create \
  --assignee A123b4567c-1234-1a2b-2b1a-1234abc12345 \
  --role Contributor \
  --scope "/subscriptions/B123a4567c-1234-2b1a-1b2b-11a2b01b2b3c0/resourceGroups/ToyWebsite" \
  --description "The deployment workflow for the company's website needs to be able to create resources within the resource group."

各引数を見てみましょう。

  • --assignee で、ワークロード ID を指定します。 これはいくつかの方法で指定できますが、あいまいさを回避するために、アプリケーション ID を使用することをお勧めします。
  • --role は、ロールを指定します。 組み込みのロールを使用する場合、名前でそれを指定できます。 カスタム ロールの定義を使用する場合、完全なロールの定義 ID を指定します。
  • --scope は、スコープを指定します。 これは通常、単一リソース、リソース グループ、またはサブスクリプションのリソース ID です。
  • --description は、人間が判読できるロールの割り当ての説明です。

ワークロード ID のロールの割り当てを作成するには、New-AzRoleAssignment コマンドレットを使用します。 担当者、ロール、スコープを指定します。

New-AzRoleAssignment `
  -ApplicationId A123b4567c-1234-1a2b-2b1a-1234abc12345 `
  -RoleDefinitionName Contributor `
  -Scope '/subscriptions/B123a4567c-1234-2b1a-1b2b-11a2b01b2b3c0/resourceGroups/ToyWebsite' `
  -Description "The deployment workflow for the company's website needs to be able to create resources within the resource group."

各引数を見てみましょう。

  • -ApplicationId で、ワークロード ID のアプリケーション登録 ID を指定します。
  • -RoleDefinitionName は、組み込みロールの名前を指定します。 カスタム ロールの定義を使用する場合、代わりに -RoleDefinitionId 引数を使用して完全なロールの定義 ID を指定します。
  • -Scope は、スコープを指定します。 これは通常、単一リソース、リソース グループ、またはサブスクリプションのリソース ID です。
  • -Description は、人間が判読できるロールの割り当ての説明です。

ヒント

説明を記入して、ロールの割り当ての理由を示すことをお勧めします。 説明により、後でそのロールの割り当てを確認するユーザーがその目的を理解でき、担当者、ロール、スコープをどのように決定したかを理解できます。

Note

ロールの割り当ては、アクティブになるまで数分かかることがあります。

Bicep を使用してアクセス権を付与する

ロールの割り当ては Azure リソースです。 これは、Bicep を使用してロールの割り当てを作成できることを意味します。 Bicep を使用してリソース グループを初期化し、その後、ワークロード ID を使用してリソース グループにリソースをデプロイする場合は、これを行うことができます。 上記のロールの割り当ての Bicep 定義の例を次に示します。

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(principalId, roleDefinitionId, resourceGroup().id)
  properties: {
    principalType: 'ServicePrincipal'
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId)
    principalId: principalId
    description: 'The deployment workflow for the company\'s website needs to be able to create resources within the resource group.'
  }
}

各引数を見てみましょう。

  • name は、ロールの割り当てのグローバル一意識別子 (GUID) です。 Bicep の guid() 関数を使用して GUID を作成することをお勧めします。 ロールの割り当てごとに一意の名前を確実に作成するには、プリンシパル ID、ロールの定義 ID、スコープを関数のシード引数として使用します。

  • principalTypeServicePrincipal に設定する必要があります。

  • roleDefinitionId は、割り当てるロールの定義の完全修飾リソース ID です。 多くの場合、組み込みロールを使用します。そのため、Azure の組み込みロールのドキュメントでロールの定義 ID を確認します。

    たとえば、"共同作成者" ロールのロールの定義 ID は b24988ac-6180-42a0-ab88-20f7382dd24c です。 Bicep ファイルでこれを指定する場合、/subscriptions/B123a4567c-1234-2b1a-1b2b-11a2b01b2b3c0/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c などの完全修飾リソース ID を使用します。

  • principalId は、サービス プリンシパルのオブジェクト ID です。 アプリケーション ID またはアプリケーション登録のオブジェクト ID は使用しないでください。

  • description は、人間が判読できるロールの割り当ての説明です。