Google Cloud で実行されるサービスは、通常、Azureリソースに到達できるように、保存されたMicrosoft Entraアプリケーション シークレットを使用してMicrosoft Entra IDを認証します。 そのシークレットを保護してローテーションする必要があり、シークレットを交換する前に有効期限が切れるとサービスが停止します。
ワークロード ID フェデレーションによって、その格納されているシークレットが削除されます。 Google が発行する ID トークンを Google クラウド サービス アカウントに信頼するようにMicrosoft Entra アプリケーションを構成し、サービスは資格情報を格納するのではなく、Google が発行したトークンをMicrosoft Entraアクセス トークンと交換します。
このチュートリアルでは、Google クラウド サービス アカウントを識別し、Microsoft Entra アプリケーションとフェデレーションし、ワークロードが Azure Blob Storage などのAzure リソースを呼び出すために使用するMicrosoft Entra アクセス トークンに対して Google が発行した ID トークンを交換します。
このチュートリアルには、完了した 1 つのシナリオに合った 3 つのシーケンシャル パーツがあります。 各パーツは、その前のパーツの出力に依存します。
このチュートリアルでは、次の操作を行います。
- Google クラウド サービス アカウントを特定し、その一意の ID を取得します。
- Google が発行したトークンを信頼するようにMicrosoft Entra アプリケーションを構成します。
- Microsoft Entraアクセス トークンの Google ID トークンをExchangeし、Azure リソースにアクセスします。
次の図は、ワークロード ID フェデレーション フローを示しています。ワークロードは、外部 ID プロバイダーからトークンを取得し、アクセス トークンのMicrosoft ID プラットフォームと交換し、そのアクセス トークンを使用してAzure リソースに到達します。 このチュートリアルでは、外部 ID プロバイダーは Google Cloud であり、トークンは Google が発行した ID トークンです。
Prerequisites
- Microsoft Entra テナントとAzure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
- Google Cloud プロジェクトと、アプリ エンジンやコンピューティング エンジンなどのサービス アカウントの ID トークンを取得できる Google クラウド サービスで実行されるワークロード。
- IAM と管理者でサービスアカウントを表示するアクセス許可を持つ Google Cloud コンソールへのアクセス。
- Azure CLI (
az) コマンド ライン ツールがインストールされ、テナントに到達するように構成されています。 Microsoft Entra 管理センターのMicrosoft Entra手順を完了することもできます。 - フェデレーション ID 資格情報をアプリ登録またはマネージド ID に追加するアクセス許可。 フェデレーション資格情報をアプリ登録に追加するには、アカウントがアプリの所有者であるか、 アプリケーション管理者、 アプリケーション開発者、クラウド アプリケーション管理者 のいずれかのロールを保持しているか、
microsoft.directory/applications/credentials/updateアクセス許可を持っている必要があります。
パート 1: Google クラウド サービス アカウントを識別する
Google Cloud ワークロードには、Google がトークンを発行できる ID が必要です。 Google クラウド サービス アカウントは、この ID を提供します。 Google Cloud プロジェクトの既定のサービス アカウントを使用するか、ワークロード専用のサービス アカウントを作成します。
Google は、 sub (サブジェクト) 要求がサービス アカウントの一意の ID であり、 iss (発行者) 要求が https://accounts.google.comされているサービス アカウントの ID トークンを発行します。 パート 2 のMicrosoft Entra アプリケーションで信頼を構成するには、両方の値を使用します。
Google Cloud コンソールで、 IAM と管理者>Service アカウントに移動します。
ワークロードを実行するサービス アカウントを選択します。
サービス アカウントの詳細で、その 一意の ID を 見つけて値をコピーします。 この値は、Google がサービス アカウントに対して発行するトークンの
sub要求です。
一意の ID を <service-account-unique-id>として記録します。 パート 2 では、フェデレーション ID 資格情報のサブジェクトとして使用します。
パート 2: Google トークンを信頼するようにMicrosoft Entra アプリケーションを構成する
このパートでは、Microsoft Entra アプリケーションにフェデレーション ID 資格情報を追加して、Microsoft Entra IDが Google がサービス アカウントに対して発行する ID トークンを信頼できるようにします。 フェデレーション ID 資格情報には、次の 3 つの入力が必要です。
-
subject: Google 発行トークンのsub要求 (サービス アカウントの一意の ID、<service-account-unique-id>) と一致する必要があります。 -
issuer:iss要求と一致する必要があります。 Google Cloud の場合、この値はhttps://accounts.google.com。 発行者は、発行者の URL を使用してトークンを検証するキーをフェッチするため、Microsoft Entra ID 発行者は OpenID Connect 検出仕様に準拠する必要があります。 -
audiences:aud要求と一致する必要があります。 Microsoft推奨値api://AzureADTokenExchange使用します。
Microsoft Entra アプリケーションでは、限られた数のフェデレーション ID 資格情報がサポートされます。 現在の制限とその他の制限については、 フェデレーション ID 資格情報の重要な考慮事項と制限を参照してください。
次の内容を含む
credential.jsonという名前のファイルを作成します。<service-account-unique-id>を、パート 1 でコピーした一意の ID に置き換えます。{ "name": "AccessFromGoogle", "issuer": "https://accounts.google.com", "subject": "<service-account-unique-id>", "audiences": ["api://AzureADTokenExchange"], "description": "Federated credential for a Google Cloud workload" }フェデレーション ID 資格情報をアプリの登録に追加します。
<your-app-id>をアプリ登録のアプリケーション (クライアント) ID に置き換えます。az ad app federated-credential create --id <your-app-id> --parameters credential.json
Microsoft Entra 管理センターにフェデレーション資格情報を追加することもできます。 https://accounts.google.com を指定し、サブジェクトとしてサービス アカウントの一意の ID を指定します。 詳細な手順については、「 外部 ID プロバイダーを信頼するようにアプリを構成する」を参照してください。
アプリの登録ではなく、ユーザー割り当てマネージド ID で資格情報を構成するには、次のコマンドを使用します。 マネージド ID の所有者ロールまたは共同作成者ロールが必要です。 詳細な手順については、「 外部 ID プロバイダーを信頼するようにユーザー割り当てマネージド ID を構成する」を参照してください。
az identity federated-credential create \
--name AccessFromGoogle \
--identity-name <your-identity-name> \
--resource-group <your-resource-group> \
--issuer https://accounts.google.com \
--subject <service-account-unique-id> \
--audience api://AzureADTokenExchange
ストレージ アカウントでのロールの割り当てなど、ワークロードが呼び出すAzure リソースへのアクセス権をアプリまたはマネージド ID に付与します。
パート 3: Microsoft Entra アクセス トークンの Google トークンをExchangeする
このパートでは、ワークロードはサービス アカウントの Google 発行 ID トークンを取得し、Azure リソースの呼び出しに使用するMicrosoft Entra アクセス トークンと交換します。
アプリ エンジンやコンピューティング エンジンなどの Google クラウド サービスは、Google メタデータ サーバーからサービス アカウントの ID トークンを要求します。 Google が署名キーを管理するため、ワークロードに保存されたキーは必要ありません。
メタデータ サーバーに Google ID トークンを要求します。 要求の対象ユーザーは、フェデレーション ID 資格情報 (
api://AzureADTokenExchange) で構成した対象ユーザーと一致する必要があります。 次の Node.js スニペットはトークンを要求し、文字列として返します。 概念はどの言語でも同じです。async function getGoogleIdToken() { const endpoint = "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=api://AzureADTokenExchange"; const headers = { "Metadata-Flavor": "Google" }; const response = await fetch(endpoint, { method: "GET", headers }); return response.text(); }Azure Identity SDK の
ClientAssertionCredentialを使用して、Microsoft Entra アクセス トークンの Google ID トークンをExchangeします。ClientAssertionCredentialは、フェデレーション アサーション (この場合は Google ID トークン) を返すコールバックを受け取ります。 Microsoft Entraテナント ID をtenantIdとして指定し、アプリ登録のアプリケーション (クライアント) ID をclientIdとして指定します。import { ClientAssertionCredential } from "@azure/identity"; const credential = new ClientAssertionCredential(tenantId, clientId, getGoogleIdToken);任意のAzure SDK クライアントで資格情報を使用します。 たとえば、Azure Blob Storageを呼び出すには、次のようにします。
const { BlobServiceClient } = require("@azure/storage-blob"); const blobClient = new BlobServiceClient(blobUrl, credential);
クライアントがトークンを必要とする場合は、コールバックを呼び出して新しい Google ID トークンをフェッチし、アクセス トークンのMicrosoft ID プラットフォームと Google トークンを交換し、結果のアクセス トークンをキャッシュします。
ClientAssertionCredentialはコールバックを介してフェデレーション アサーションを提供するため、ワークロードはシークレットを格納しません。
ClientAssertionCredentialは、.NET、Java、JavaScript、Python、Go など、Azure ID SDK 全体で使用できます。 MSAL ライブラリは、トークン交換を低レベルで制御する必要がある場合にも、クライアント アサーションをサポートします。
Google Cloud ワークロードは、保存されたシークレットなしで保護されたリソースMicrosoft Entraアクセスできるようになりました。
リソースをクリーンアップする
このチュートリアルで作成したリソースが不要になった場合は、継続的な料金が発生しないように、リソースを削除します。
アプリの登録からフェデレーション ID 資格情報を削除します。
az ad app federated-credential delete \ --id <your-app-id> \ --federated-credential-id AccessFromGoogleこのチュートリアル用に専用の Google Cloud サービス アカウントを作成した場合は、Google Cloud コンソールの [IAM] > [管理者>サービス アカウント] で削除します。
追加したロールの割り当てを削除して、アプリまたはマネージド ID にAzureリソースへのアクセス権を付与します。