外部 ID プロバイダーを信頼するようにアプリを構成する (プレビュー)

この記事では、Azure Active Directory (Azure AD) 内のアプリケーションと外部 ID プロバイダー (IdP) の間に信頼関係を作成する方法について説明します。 次に、外部 IdP からのトークンを Microsoft ID プラットフォームからのアクセス トークンと交換するように、外部ソフトウェア ワークロードを構成できます。 外部ワークロードは、シークレットを管理する必要なく、Azure AD で保護されたリソースにアクセスできます (サポートされているシナリオの場合)。 トークン交換ワークフローの詳細については、ワークロード ID フェデレーションに関する記事をお読みください。 信頼関係を確立するには、アプリの登録時に、Microsoft Graph または Azure portal を使用してフェデレーション ID 資格情報を構成します。

アプリ登録を作成してシークレットまたは証明書を追加するアクセス許可があれば、だれでもフェデレーション ID 資格情報を追加できます。 ただし、[ユーザー設定] ブレードの [ユーザーはアプリケーションを登録できる] スイッチが [いいえ] に設定されている場合は、アプリ登録を作成することも、フェデレーション ID 資格情報を構成することもできません。 代わりにフェデレーション ID 資格情報を構成する管理者を見つける必要があります。 アプリケーション管理者またはアプリケーション所有者ロールのだれでもこの操作を行うことができます。

外部 IdP を信頼するようにアプリを構成した後、Microsoft ID プロバイダーからアクセス トークンを取得し、Azure AD で保護されたリソースにアクセスするように、ソフトウェア ワークロードを構成します。

前提条件

Azure AD でアプリ登録を作成します。 外部ソフトウェア ワークロードの対象となる Azure リソースへのアクセス権をアプリに付与します。

以下の手順で必要になるアプリのオブジェクト ID を見つけます (アプリケーション (クライアント) ID ではありません)。 アプリのオブジェクト ID は、Azure portal で確認できます。 Azure portal で登録済みアプリケーションの一覧にアクセスし、対象のアプリ登録を選択します。 [概要]->[要点] で、オブジェクト IDを見つけます。

以下の手順で必要になる、外部 IdP およびソフトウェア ワークロードの情報を取得します。

Microsoft Graph ベータ エンドポイント (https://graph.microsoft.com/beta) では、アプリケーションで federatedIdentityCredentials を作成、更新、削除する REST API を公開しています。 AZ CLI から Microsoft Graph コマンドを実行するには、Azure Cloud Shell を起動し、テナントにサインインします。

フェデレーション ID 資格情報をアプリに構成する

アプリにフェデレーション ID 資格情報を構成する場合に指定する重要な情報がいくつかあります。

issuersubjectは、信頼関係を設定するために必要な重要な情報です。 issuer は、外部 ID プロバイダーの URL であり、交換される外部トークンの要求と issuer 一致する必要があります。 subjectは、外部 ソフトウェア ワークロードの識別子であり、交換される外部トークンの要求と sub (subject) 一致する必要があります。 subjectには固定形式はありません。各 IdP は独自の GUID (場合によってはコロンで区切られた識別子、もしくは任意の文字列) が使用されます。 issuersubject の組合せは、アプリで一意である必要があります。 外部ソフトウェア ワークロードが Microsoft ID プラットフォーム に対してアクセス トークンの外部トークンの交換を要求すると、フェデレーション ID 資格情報の subjectsubject の値が、外部トークンで指定されたissuerおよびsubject要求に対してチェックされます。 その検証チェックに合格するとMicrosoft ID プラットフォームは外部ソフトウェア ワークロードにアクセス トークンを発行します。

重要

誤って subject 設定に正しくない外部ワークロード情報を追加した場合でも、フェデレーション ID 資格情報はエラーなしで正常に作成されます。 エラーは、トークンの交換が失敗するまで明らかになりません。

audiences は、外部トークンに指定できる対象ユーザーの一覧を示します。 このフィールドは必須であり、既定値は "api://AzureADTokenExchange" です。 これは、Microsoft ID プラットフォームが受信トークンの aud 要求で受け入れる必要があるものを示しています。 これはお使いの外部 ID プロバイダー内の Azure AD を表す値であり、ID プロバイダー間で固定の値はありません。このトークンの対象ユーザーとして機能するには、IdP に新しいアプリケーション登録を作成する必要がある場合があります。

name は、フェデレーション ID 資格情報の一意識別子です。文字数は 120 文字に制限され、URL に対応している必要があります。 作成後は変更できません。

description は、フェデレーション ID 資格情報の未検証のユーザー提供の説明です。

GitHub Actions の例

アプリ (アプリのオブジェクト ID で指定) の新しいフェデレーション ID 資格情報を作成するコマンドを実行します。 nameissuersubject とその他のパラメーターを指定します。

例については、「GitHub リポジトリを信頼するようにアプリを構成する」を参照してください。

Kubernetes の例

次のコマンドを実行して、アプリでフェデレーション ID 資格情報を構成し、Kubernetes サービス アカウントとの信頼関係を作成します。 次のパラメーターを指定します。

  • issuer は、サービス アカウントの発行者 URL (マネージド クラスターの OIDC Issuer URL または自己管理型クラスターの OIDC Issuer URL) です。
  • subject は、サービス アカウントに対して発行されるトークンのサブジェクト名です。 Kubernetes は、サブジェクト名に system:serviceaccount:<SERVICE_ACCOUNT_NAMESPACE>:<SERVICE_ACCOUNT_NAME> の形式を使用します。
  • name はフェデレーション資格情報の名前です。これを後で変更することはできません。
  • audiences は、外部トークンの 'aud' 要求に指定できる対象ユーザーの一覧を示します。 このフィールドは必須であり、既定値は "api://AzureADTokenExchange" です。
az rest --method POST --uri 'https://graph.microsoft.com/beta/applications/f6475511-fd81-4965-a00e-41e7792b7b9c/federatedIdentityCredentials' --body '{"name":"Kubernetes-federated-credential","issuer":"https://aksoicwesteurope.blob.core.windows.net/9d80a3e1-2a87-46ea-ab16-e629589c541c/","subject":"system:serviceaccount:erp8asle:pod-identity-sa","description":"Kubernetes service account federated credential","audiences":["api://AzureADTokenExchange"]}' 

応答が返されます。

{
  "@odata.context": "https://graph.microsoft.com/beta/$metadata#applications('f6475511-fd81-4965-a00e-41e7792b7b9c')/federatedIdentityCredentials/$entity",
  "audiences": [
    "api://AzureADTokenExchange"
  ],
  "description": "Kubernetes service account federated credential",
  "id": "51ecf9c3-35fc-4519-a28a-8c27c6178bca",
  "issuer": "https://aksoicwesteurope.blob.core.windows.net/9d80a3e1-2a87-46ea-ab16-e629589c541c/",
  "name": "Kubernetes-federated-credential",
  "subject": "system:serviceaccount:erp8asle:pod-identity-sa"
}

他の ID プロバイダーの例

次のコマンドを実行して、アプリにフェデレーション ID 資格情報を構成し、外部 ID プロバイダーとの信頼関係を作成します。 次のパラメーターを指定します (例として、Google Cloud で実行されているソフトウェア ワークロードを使用しています)。

  • name はフェデレーション資格情報の名前です。これを後で変更することはできません。
  • ObjectID: 以前に Azure AD に登録したアプリの (アプリケーション (クライアント) ID ではなく) オブジェクト ID。
  • subject: 外部 ID プロバイダーによって発行されたトークン内の sub 要求と一致する必要があります。 Google Cloud を使用しているこの例では、subject は、使用する予定のサービス アカウントの一意の ID です。
  • issuer: 外部 ID プロバイダーによって発行されたトークン内の iss 要求と一致する必要があります。 OIDC Discovery 仕様に準拠する URL です。Azure AD では、この発行者 URL を使用して、トークンを検証するために必要なキーをフェッチします。 Google Cloud の場合、issuer は "https://accounts.google.com" です。
  • audiences: 外部トークン内の aud 要求と一致する必要があります。 セキュリティ上の理由から、Azure AD を対象とするトークンに対して一意の値を選択する必要があります。 Microsoft の推奨値は "api://AzureADTokenExchange" です。
az rest --method POST --uri 'https://graph.microsoft.com/beta/applications/<ObjectID>/federatedIdentityCredentials' --body '{"name":"GcpFederation","issuer":"https://accounts.google.com","subject":"112633961854638529490","description":"Testing","audiences":["api://AzureADTokenExchange"]}'

応答が返されます。

{
  "@odata.context": "https://graph.microsoft.com/beta/$metadata#applications('f6475511-fd81-4965-a00e-41e7792b7b9c')/federatedIdentityCredentials/$entity",
  "audiences": [
    "api://AzureADTokenExchange"
  ],
  "description": "Testing",
  "id": "51ecf9c3-35fc-4519-a28a-8c27c6178bca",
  "issuer": "https://accounts.google.com"",
  "name": "GcpFederation",
  "subject": "112633961854638529490"
}

アプリのフェデレーション ID 資格情報を一覧表示する

次のコマンドを実行して、(アプリのオブジェクト ID で指定された) アプリのフェデレーション ID 資格情報を一覧表示します。

az rest -m GET -u 'https://graph.microsoft.com/beta/applications/f6475511-fd81-4965-a00e-41e7792b7b9c/federatedIdentityCredentials' 

次のような応答が返されます。

{
  "@odata.context": "https://graph.microsoft.com/beta/$metadata#applications('f6475511-fd81-4965-a00e-41e7792b7b9c')/federatedIdentityCredentials",
  "value": [
    {
      "audiences": [
        "api://AzureADTokenExchange"
      ],
      "description": "Testing",
      "id": "1aa3e6a7-464c-4cd2-88d3-90db98132755",
      "issuer": "https://token.actions.githubusercontent.com/",
      "name": "Testing",
      "subject": "repo:octo-org/octo-repo:environment:Production"
    }
  ]
}

フェデレーション ID 資格情報を削除する

次のコマンドを実行して、(アプリのオブジェクト ID で指定された) アプリからフェデレーション ID 資格情報を削除します。

az rest -m DELETE  -u 'https://graph.microsoft.com/beta/applications/f6475511-fd81-4965-a00e-41e7792b7b9c/federatedIdentityCredentials/51ecf9c3-35fc-4519-a28a-8c27c6178bca' 

次の手順