Microsoft Azure からリソースにアクセスする

このドキュメントでは、ID 連携を使用して Microsoft Azure から Google Cloud リソースにアクセスする方法について説明します。

従来、Google Cloud の外部で実行されているアプリケーションは、サービス アカウント キーを使用して Google Cloud リソースにアクセスしていました。ID 連携を使用すると、Azure リソースのマネージド ID でサービス アカウントになり代わることができます。これにより、ワークロードは短期間だけ有効なアクセス トークンを使用して Google Cloud リソースに直接アクセスでき、サービス アカウント キーに関連するメンテナンスとセキュリティの負担が軽減されます。

始める前に

  1. IAM, Resource Manager, Service Account Credentials, and Security Token Service (STS) API を有効にします。

    API を有効にする

  2. プロジェクトに Workload Identity プール管理者(roles/iam.workloadIdentityPoolAdmin)とサービス アカウント管理者(roles/iam.serviceAccountAdmin)のロールがあることを確認します。

    また、IAM オーナー(roles/owner)の基本ロールには ID 連携を構成する権限も含まれています。本番環境で基本ロールを付与することはできませんが、開発環境またはテスト環境ではこれらのロールを付与できます。

  3. 組織により Azure からの連携が許可されるように、組織のポリシーを更新します。

  4. Google Cloud サービス アカウントを作成します。

  5. サービス アカウントにアクセス権を付与して、ワークロードに必要な Google Cloud APIs を呼び出します。

Azure の ID プロバイダ設定

AWS を Workload Identity プールの ID プロバイダとして追加する場合は、次の情報を指定する必要があります。

  • プロバイダの ID。

  • Azure テナント ID

  • Azure 管理 ID のトークンのクレームを Google トークンの属性にマッピングする属性マッピングのリスト。assertion を使用して Azure トークンを参照します。Google 属性の場合は google、カスタム属性の場合は attribute を使用します。

    Google 属性には google.subjectgoogle.groups の 2 つがあります。これらの属性は IAM ロール バインディングで参照できます。google.subject も Cloud Logging のログエントリに表示されます。

    google.subject のマッピングを指定する必要があります。通常は、次のセクションで作成するマネージド ID のオブジェクト ID を含む assertion.sub にマッピングすることをおすすめします。これにより、IAM ロール バインディングで使用するための固定 ID が提供されます。マッピングは次のようになります。

    google.subject=assertion.sub
    

    より複雑なアサーションの場合は、Common Expression Language を使用できます。たとえば、Workload Identity プールに複数の ID プロバイダが含まれている場合は、それらの ID を明確化するために接頭辞を追加できます。

    google.subject="azure::" + assertion.tid + "::" + assertion.sub
    

    google.subject フィールドは 127 文字以下で指定してください。

    カスタム属性を指定することもできます。たとえば、以下では assertion.tidattribute.tid にマッピングします。

    attribute.tid=assertion.tid
    

    次の例では、assertion.oid の値に基づいて表示名を割り当てます。

    attribute.managed_identity_name={
    "8bb39bdb-1cc5-4447-b7db-a19e920eb111":"workload1",
    "55d36609-9bcf-48e0-a366-a3cf19027d2a":"workload2"
    }[assertion.oid]
    

    参照できるクレームの完全なリストを取得するには、ワークロード内の Azure VM のアクセス トークンを取得します。リクエストで、resource パラメータを Workload Identity プールの完全なリソース名に置き換えます。

    例:

    curl

    curl -s \
      'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID&object_id=MANAGED_IDENTITY_OBJECT_ID' \
      -H Metadata:true -H "Cache-Control: no-cache"
    

    PowerShell

    Invoke-WebRequest \
        -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID&object_id=MANAGED_IDENTITY_OBJECT_ID' \
        -Headers @{Metadata="true"}
    

    レスポンスは access_token フィールドを含む JSON オブジェクトです。このフィールドに Azure VM のアクセス トークンが含まれています。アクセス トークンをデコードして使用可能なクレームを表示するには、次の手順を行います。

    1. アクセス トークン全体をコピーします。
    2. ウェブブラウザで https://jwt.ms/ にアクセスします。
    3. アクセス トークンをテキスト ボックスに貼り付けます。
    4. [Claims] をクリックします。

    式で使用されているクレームの特定の部分を参照するには、CEL の extract() 関数を使用します。この関数は、指定したテンプレートに基づいてクレームから値を抽出します。extract() の詳細については、リソース名からの値の抽出をご覧ください。

    認証情報にクレームが含まれているかどうかを確認するには、has() 関数を使用します。

必要に応じて、次の情報を指定することもできます。

  • 表示名と説明。

  • プリンシパルが提示する必要がある属性を指定する属性条件。この属性条件は、Azure 認証情報に関するクレーム、または Google 認証情報の属性に適用できます。条件を満たしていないリクエストは拒否されます。

    属性条件は、ブール値を返す CEL 式の形式になります。たとえば以下では、特定のグループのメンバーではない ID からのリクエストは拒否されます。

    "e968c2ef-047c-498d-8d79-16ca1b61e77e" in assertion.groups
    

    一般的なユースケースの詳細については、属性条件をご覧ください。

Workload Identity のプールとプロバイダを作成する

外部 ID を編成して管理するには、Workload Identity プールを使用します。Workload Identity プールは相互に分離されていますが、1 つのプールは任意の数のサービス アカウントになり代わることができます。一般に、開発、ステージング、本番環境など、環境ごとに新しいプールを作成することをおすすめします。

新しい Workload Identity プールを作成するには、ID を指定する必要があります。オプションの説明と表示名を指定することもできます。ID の先頭に gcp- は使用できません。この接頭辞は Google で使用するために予約されています。

Workload Identity プールを作成したら、Workload Identity プール プロバイダを追加できます。各 Workload Identity プール プロバイダは、Azure などの特定の ID プロバイダを表します。1 つのプールには複数のプロバイダを含めることができます。プロバイダを作成するには、Azure の ID プロバイダ設定のページに記載されている情報が必要です。

Console

  1. Cloud Console で、[新しいワークロード プロバイダとプール] ページに移動します。

    [新しいワークロード プロバイダとプール] に移動

  2. Workload Identity プールの名前を入力します。

    この名前は、プール ID の作成に使用されます。プール ID を変更するには、[編集] をクリックします。後からプール ID を変更することはできません。

  3. (省略可)Workload Identity プールの説明を入力します。

  4. [続行] をクリックします。

  5. [プロバイダの選択] プルダウン リストで [OpenID Connect(OIDC)] を選択し、[続行] をクリックします。

  6. プロバイダ名を入力します。

    この名前は、プロバイダ ID の作成に使用されます。プロバイダ ID を変更するには、[編集] をクリックします。プロバイダ ID は後から変更できません。

  7. 発行者の URL を入力し、[続行] をクリックします。

    Azure の場合、発行者の URL の形式は https://sts.windows.net/AZURE_TENANT_ID です。

  8. 属性のマッピングを構成するには、[マッピングを編集] をクリックします。

    属性のマッピングでは、外部 ID に関する情報を使用して、それらの ID のサブセットへのアクセス権を付与できます。Azure の場合、google.subjectassertion.sub にマッピングすることをおすすめします。他のマッピングは省略可能です。

    詳細については、このページの Azure の ID プロバイダ設定をご覧ください。

  9. (省略可)認証できる ID を指定する属性条件を指定するには、[条件を追加] をクリックし、有効な CEL(Common Expression Language)を入力します。詳細については、属性の条件をご覧ください。

  10. [保存] をクリックして、Workload Identity のプールとプロバイダを作成します。

gcloud

Workload Identity プールを作成するにはgcloud iam workload-identity-pools create コマンドを使用します。

gcloud iam workload-identity-pools create POOL_ID \
    --location="global" \
    --description="DESCRIPTION" \
    --display-name="DISPLAY_NAME"

レスポンスは次のようになります。

Created workload identity pool [POOL_ID].

Workload Identity プール プロバイダを追加するにはgcloud iam workload-identity-pools providers create-oidc コマンドを使用します。

gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
    --workload-identity-pool="POOL_ID" \
    --issuer-uri="https://sts.windows.net/AZURE_TENANT_ID" \
    --location="global" \
    --attribute-mapping="google.subject=assertion.sub"

レスポンスは次のようになります。

Created workload identity pool provider [PROVIDER_ID].

REST

Workload Identity プールを作成するには、次の操作を行います。

projects.locations.workloadIdentityPools.providers.create メソッドにより、Azure がプロバイダとして追加されます。

HTTP メソッドと URL:

POST https://iam.googleapis.com/v1/projects/project-id/locations/global/workloadIdentityPools/pool-id/providers?workloadIdentityPoolProviderId=provider-id

JSON 本文のリクエスト:

{
  "attributeMapping": {
    "google.subject": "assertion.sub"
  },
  "oidc": {
    "issuerUri": "https://sts.windows.net/azure-tenant-id"
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

このメソッドは、次のような長時間実行 Operation を返します。

{
  "name": "projects/project-number/locations/global/workloadIdentityPools/pool-id/providers/provider-id/operations/operation-id"
}

Workload Identity プールのプロバイダを追加するには、次のようにします。

projects.locations.workloadIdentityPools.create メソッドにより、Workload Identity プールが作成されます。

HTTP メソッドと URL:

POST https://iam.googleapis.com/v1/projects/project-id/locations/global/workloadIdentityPools?workloadIdentityPoolId=pool-id

JSON 本文のリクエスト:

{
  "description": "description",
  "display-name": "display-name"
}

リクエストを送信するには、次のいずれかのオプションを展開します。

このメソッドは、次のような長時間実行 Operation を返します。

{
  "name": "projects/project-number/locations/global/workloadIdentityPools/pool-id/operations/operation-id"
}

ID 連携用に Azure テナントを構成する

ID 連携に対応する Azure テナントを準備するには:

  1. Azure AD アプリケーションとサービス プリンシパルを作成し、前のセクションで作成したプロバイダの完全なリソース名に、このアプリケーションのアプリケーション ID URI を設定します。

    https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
    
  2. マネージド ID を作成し、そのオブジェクト ID をメモします。

  3. Google Cloud リソースへのアクセス権を付与する仮想マシンにマネージド ID を割り当てます

外部 ID にサービス アカウントの権限借用を許可する

外部 ID は、ほとんどの Google Cloud リソースに直接アクセスできません。代わりに、サービス アカウントの Workload Identity ユーザーロール(roles/iam.workloadIdentityUser)を外部 ID に付与することで、サービス アカウントの権限を借用できます。外部 ID がサービス アカウントの権限を借用すると、サービス アカウントと同じロールと権限を持ちます。

Workload Identity ユーザーロールを Azure ID に付与するには、次のようにします。

Console

Workload Identity ユーザーロールを付与する前に、サービス アカウントの権限借用を許可する ID を決定します。ロールは、Workload Identity プール内のすべての ID に付与するか、属性のマッピングに基づいてこれらの ID のサブセットに付与できます。

ID 属性名 属性の値
特定のマネージド ID subject MANAGED_IDENTITY_OBJECT_ID
特定の Azure テナント内のすべての Azure ID group AZURE_TENANT_ID
特定の属性値を持つすべての ID ATTRIBUTE_NAME ATTRIBUTE_VALUE

次に、サービス アカウントへのアクセスを許可します。必要に応じて、認証情報を自動的に生成するための構成ファイルをダウンロードします。

  1. Cloud Console で、[Workload Identity プール] ページに移動します。

    [Workload Identity プール] に移動

  2. Azure の ID を含む Workload Identity プールを見つけて、その 編集アイコンをクリックします。Cloud Console に Workload Identity プールの詳細が表示されます。

  3. [ アクセスを許可] をクリックします。

  4. [サービス アカウント] プルダウン リストで、外部 ID が権限借用するサービス アカウントを選択します。

  5. プール内でサービス アカウントの権限を借用する ID を選択します。

    すべての ID にサービス アカウントの権限借用を許可するには、[プール内のすべての ID] を選択します。

    一部の ID にサービス アカウントの権限借用を許可するには、[フィルタに一致する ID のみ] を選択して、次のようにします。

    1. [Attribute name] プルダウン リストで、評価する属性を選択します。

      マッピングされた属性のみがリストに表示されます。google.attribute. の接頭辞は表示されません。

    2. [属性値] フィールドに、属性の想定値を入力します。

  6. [保存] をクリックします。

    ID がすでにサービス アカウントへのアクセス権を持っている場合は、Cloud Console に Workload Identity プールの詳細が表示されます。その場合、残りの手順はスキップしてください。

    ID がサービス アカウントにアクセスできるようになると、Cloud Console に [アプリケーションの構成] ダイアログが表示されます。

  7. (省略可)認証情報を自動的に生成するための構成ファイルをダウンロードするには、次のようにします。

    1. [プロバイダ] プルダウン リストで、サービス アカウントの権限を借用する Azure ID を含むプロバイダを選択します。

    2. [構成をダウンロード] をクリックして JSON 構成ファイルをダウンロードします。

  8. [閉じる] をクリックします。

gcloud

Workload Identity ユーザーロールを付与する前に、サービス アカウントの権限借用を許可する ID を決定します。ロールは、Workload Identity プール内のすべての ID に付与するか、属性のマッピングに基づいてこれらの ID のサブセットに付与できます。

ID メンバー形式
特定のマネージド ID principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/MANAGED_IDENTITY_OBJECT_ID
特定の Azure テナント内のすべての Azure ID principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/AZURE_TENANT_ID
特定の属性値を持つすべての ID principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
プール内のすべての ID principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*

次に、gcloud iam service-accounts add-iam-policy-binding コマンドを実行します。

gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
    --role=roles/iam.workloadIdentityUser \
    --member="MEMBER"

次の値を置き換えます。

  • SERVICE_ACCOUNT_EMAIL: サービス アカウントのメールアドレス。
  • MEMBER: サービス アカウントの権限を借用する外部 ID。

REST

Workload Identity ユーザーロールを付与する前に、サービス アカウントの権限借用を許可する ID を決定します。ロールは、Workload Identity プール内のすべての ID に付与するか、属性のマッピングに基づいてこれらの ID のサブセットに付与できます。

ID メンバー形式
特定のマネージド ID principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/MANAGED_IDENTITY_OBJECT_ID
特定の Azure テナント内のすべての Azure ID principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/AZURE_TENANT_ID
特定の属性値を持つすべての ID principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
プール内のすべての ID principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*

次に、読み取り / 変更 / 書き込みのパターンでポリシーを更新します。

  1. サービス アカウントの現在の IAM ポリシーを読み取ります。
  2. ポリシーを変更してロールを付与します。
  3. 更新したポリシーを書き込みます。

サービス アカウントの IAM ポリシーを読み取ります。

serviceAccounts.getIamPolicy メソッドで、サービス アカウントの IAM ポリシーを取得します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト IDプロジェクト ID は英数字からなる文字列です(例: my-project)。
  • SA_ID: サービス アカウントの ID。これは、サービス アカウントのメールアドレス(SA_NAME@PROJECT_ID.iam.gserviceaccount.com の形式)、またはサービス アカウントの一意の数値 ID のいずれかです。

  • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。

HTTP メソッドと URL:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:getIamPolicy

JSON 本文のリクエスト:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/serviceAccountAdmin",
      "members": [
        "user:admin@example.com"
      ]
    }
  ]
}

既存のポリシーがない場合、レスポンスにはデフォルトの etag のみが含まれます。このレスポンスが返された場合は、version フィールドを追加して 3 に設定し、bindings フィールドを空の配列に設定します。

適切なロールがメンバーに付与されるようにポリシーを変更します。

ロールを付与するには、レスポンス本文の bindings 配列を変更します。

  • ロールのバインディングが存在しない場合は、付与するロールとメンバーを定義する bindings 配列に新しいオブジェクトを追加します。
  • ロールのバインディングがすでに存在する場合は、既存のメンバーのリストに新しいメンバーを追加します。

例:

Workload Identity ユーザーロール(roles/iam.workloadIdentityUser)をプール内のすべての ID に付与するには、前の手順で示した例を次のように変更します。

{
  "version": 1,
  "etag": "BwUqLaVeua8=",
  "bindings": [
    {
      "role": "roles/iam.workloadIdentityUser",
      "members": [
        "principalSet://iam.googleapis.com/projects/1234567890123/locations/global/workloadIdentityPools/my-pool/*"
      ]
    },
    {
      "role": "roles/iam.serviceAccountAdmin",
      "members": [
        "user:admin@example.com"
      ]
    }
  ]
}

更新したポリシーを書き込みます。

serviceAccounts.setIamPolicy メソッドによって、サービス アカウントの更新済み IAM ポリシーが設定されます。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト IDプロジェクト ID は英数字からなる文字列です(例: my-project)。
  • SA_ID: サービス アカウントの ID。これは、サービス アカウントのメールアドレス(SA_NAME@PROJECT_ID.iam.gserviceaccount.com の形式)、またはサービス アカウントの一意の数値 ID のいずれかです。

  • POLICY: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。

    たとえば、前の手順で示したポリシーを設定するには、policy を次のコードに置き換えます。

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "role": "roles/iam.workloadIdentityUser",
          "members": [
            "principalSet://iam.googleapis.com/projects/1234567890123/locations/global/workloadIdentityPools/my-pool/*"
          ]
        },
        {
          "role": "roles/iam.serviceAccountAdmin",
          "members": [
            "user:admin@example.com"
          ]
        }
      ]
    }
    

HTTP メソッドと URL:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:setIamPolicy

JSON 本文のリクエスト:

{
  "policy": POLICY
}

リクエストを送信するには、次のいずれかのオプションを展開します。

レスポンスには、更新されたポリシーが含まれます。

Google 認証情報を生成する

サポートされているクライアント ライブラリを使用する場合は、Google 認証情報が自動的に生成されるようにクライアント ライブラリを構成できます。あるいは、Azure 認証情報を手動で生成し、Google 認証情報と交換することもできます。

可能であれば、トークン交換プロセスを自身で実装しなくても済むように、認証情報を自動的に生成することをおすすめします。

認証情報を自動生成する

次のいずれかの言語のクライアント ライブラリを使用して Google Cloud にアクセスする場合は、ID 連携を使用して認証情報を自動的に生成するようにクライアント ライブラリを構成できます。

C++

C++ 用 Google Cloud クライアント ライブラリのほとんどは、grpc::GoogleDefaultCredentials() を呼び出して作成される ChannelCredentials オブジェクトを使用して ID 連携をサポートしています。この認証情報を初期化するには、バージョン 1.36.0 以降の gRPC でクライアント ライブラリを構築する必要があります。

C++ 用 Cloud Storage クライアント ライブラリは、gRPC ではなく REST API を使用するため、ID 連携をサポートしていません。

Go

Go 用クライアント ライブラリは、golang.org/x/oauth2 モジュールのバージョン v0.0.0-20210218202405-ba52d332ba99 以降を使用している場合、ID 連携をサポートします。

クライアント ライブラリが使用しているこのモジュールのバージョンを確認するには、次のコマンドを実行します。

cd $GOPATH/src/cloud.google.com/go
go list -m golang.org/x/oauth2

Java

Java 用クライアント ライブラリは、com.google.auth:google-auth-library-oauth2-http アーティファクトのバージョン 0.24.0 以降を使用している場合、ID 連携をサポートします。

クライアント ライブラリで使用しているこのアーティファクトのバージョンを確認するには、アプリケーション ディレクトリで次の Maven コマンドを実行します。

mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http

Node.js

Node.js 用クライアント ライブラリは、google-auth-library パッケージのバージョン 7.0.2 以降を使用している場合、ID 連携をサポートします。

クライアント ライブラリで使用されているこのパッケージのバージョンを確認するには、アプリケーション ディレクトリで次のコマンドを実行します。

npm list google-auth-library

GoogleAuth オブジェクトを作成するときに、プロジェクト ID を指定できます。また、GoogleAuth で自動的にプロジェクト ID を検出することもできます。プロジェクト ID を自動的に検出するには、構成ファイルのサービス アカウントに、プロジェクト上でブラウザのロール(roles/browser)または同等の権限を持つロールが付与されている必要があります。詳細については、google-auth-library パッケージの README をご覧ください。

Python

Python 用クライアント ライブラリは、google-auth パッケージのバージョン 1.27.0 以降を使用している場合、ID 連携をサポートします。

クライアント ライブラリで使用されているこのパッケージのバージョンを確認するには、パッケージがインストールされている環境で次のコマンドを実行します。

pip show google-auth

認証クライアントのプロジェクト ID を指定するには、GOOGLE_CLOUD_PROJECT 環境変数を設定するか、クライアントがプロジェクト ID を自動的に検出するようにします。プロジェクト ID を自動的に検出するには、構成ファイルのサービス アカウントに、プロジェクト上でブラウザのロール(roles/browser)または同等の権限を持つロールが付与されている必要があります。詳細については、google-auth パッケージのユーザーガイドをご覧ください。

クライアント ライブラリが自動的に認証情報を生成するように構成するには、JSON 構成ファイルを作成します。このファイルは、Cloud Console または gcloud ツールで作成できます。

Console

まず、このページの手順に沿って、外部 ID にサービス アカウントの権限借用を許可します。次に、外部 ID が権限を借用するサービス アカウントに対する JSON 構成ファイルを作成します。

JSON 構成ファイルを作成するには、次のようにします。

  1. Cloud Console で、[Workload Identity プール] ページに移動します。

    [Workload Identity プール] に移動

  2. 使用する ID プロバイダを含む Workload Identity プールを見つけて、[ 編集] アイコンをクリックします。Cloud Console に Workload Identity プールの詳細が表示されます。
  3. [接続済みサービス アカウント] をクリックします。
  4. 使用するサービス アカウントを見つけて、 [ダウンロード] をクリックします。
  5. [プロバイダ] プルダウン リストで、サービス アカウントの権限を借用する Azure ID を含むプロバイダを選択します。
  6. [ 構成をダウンロード] をクリックして JSON 構成ファイルをダウンロードし、[完了] をクリックします。

gcloud

JSON 構成ファイルを作成するには、gcloud iam workload-identity-pools create-cred-config コマンドを実行します。

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --output-file=FILEPATH \
    --azure

次の値を置き換えます。

  • PROJECT_NUMBER: プロジェクトの数値 ID。
  • POOL_ID: Workload Identity プールの ID。
  • PROVIDER_ID: Workload Identity プール プロバイダの ID。
  • SERVICE_ACCOUNT_EMAIL: なり代わるサービス アカウントのメールアドレス。
  • FILEPATH: 構成ファイルのファイルパス。

構成ファイルを生成したら、環境変数 GOOGLE_APPLICATION_CREDENTIALS を構成ファイルのファイルパスに設定します。この環境変数は、クライアント ライブラリに対し、アプリケーションのデフォルト認証情報を使用して認証するように指示します。詳細については、認証情報の自動検出をご覧ください。

認証情報を手動で交換する

Azure が管理する ID でサービス アカウントになり代わることができる状態であれば、その認証情報を Google 認証情報と手動で交換できます。

認証情報を交換するには:

  1. Azure Instance Metadata Service(IMDS)を使用して Azure アクセス トークンを取得します

    resource クエリ パラメータを次の値に設定します。

    https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
    

    object_id クエリ パラメータを、前の手順で作成したマネージド ID のオブジェクト ID に設定します。

  2. Azure アクセス トークンをセキュリティ トークン サービス token() メソッドに渡して、連携アクセス トークンを取得します。

    REST

    token メソッドにより、サードパーティ トークンが Google トークンに交換されます。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_NUMBER: Google Cloud プロジェクト番号。
    • POOL_ID: 作成した Workload Identity プールの ID。
    • PROVIDER_ID: 構成した ID プロバイダの ID。
    • ACCESS_TOKEN: ID プロバイダから取得したトークン。

    HTTP メソッドと URL:

    POST https://sts.googleapis.com/v1/token

    JSON 本文のリクエスト:

    {
      "audience": "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID",
      "grantType": "urn:ietf:params:oauth:grant-type:token-exchange",
      "requestedTokenType": "urn:ietf:params:oauth:token-type:access_token",
      "scope": "https://www.googleapis.com/auth/cloud-platform",
      "subjectTokenType": "urn:ietf:params:oauth:token-type:jwt",
      "subjectToken": "ACCESS_TOKEN"
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

     

    このメソッドは連携トークンを返します。

  3. generateAccessToken() を呼び出して、サービス アカウントのアクセス トークンと連携トークンを交換します。連携トークンは一部の Google Cloud APIs でサポートされています。すべての Google Cloud APIs はサービス アカウントのアクセス トークンをサポートしています。

    REST

    Service Account Credentials API の serviceAccounts.generateAccessToken メソッドによって、サービス アカウントの OAuth 2.0 アクセス トークンが生成されます。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト IDプロジェクト ID は英数字からなる文字列です(例: my-project)。
    • SA_ID: サービス アカウントの ID。これは、サービス アカウントのメールアドレス(SA_NAME@PROJECT_ID.iam.gserviceaccount.com の形式)、またはサービス アカウントの一意の数値 ID のいずれかです。
    • token: 連携アクセス トークン。

    HTTP メソッドと URL:

    POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com:generateAccessToken

    JSON 本文のリクエスト:

    {
      "scope": [
        "https://www.googleapis.com/auth/cloud-platform"
      ]
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    generateAccessToken リクエストが成功した場合、レスポンスの本文には OAuth 2.0 アクセス トークンと有効期限が含まれます。expireTime に達するまで、サービス アカウントの代わりに accessToken をリクエストの認証に使用できます。

    {
      "accessToken": "eyJ0eXAi...NiJ9",
      "expireTime": "2020-04-07T15:01:23.045123456Z"
    }
    

サービス アカウントのアクセス トークンを取得したら、リクエストの Authorization ヘッダーにトークンを含めることで、Google Cloud APIs の呼び出しに使用できます。

Authorization: Bearer SERVICE_ACCOUNT_ACCESS_TOKEN

リクエストはサービス アカウントとして承認されます。

次のステップ