フリートの Workload Identity を使用する

多くの場合、アプリケーションは他のサービスに接続する際に認証(認証可能な ID を入力)が必要になります。たとえば、Compute Engine API や AI Platform API などの Google Cloud APIs を使用する場合は、アプリケーションの認証が必要です。このページでは、フリートでホストされているアプリケーション ワークロードが Google Cloud API とサービスに対する認証におすすめの最も簡単な方法であるフリートの Workload Identity を使用する方法について説明します。

フリートの Workload Identity の概要

フリートの Workload Identity は、GKE Workload Identity に備わっている機能を拡張します。クラスタ内のワークロードを Google に認証させることができ、Google Cloud のサービス アカウント キーをダウンロードし、手動でローテーションして一般管理する必要はありません。その代わり、ワークロードはクラスタによって生成される有効期間が短いトークンを使用して認証されます。GKE Workload Identity が有効になっているクラスタはすべて、ID を発行する際にプロジェクトの Workload Identity プールを使用します。これにより、Identity and Access Management は Kubernetes サービス アカウントの認証情報を信頼して確認できます。GKE Workload Identity の詳細については、Workload Identity の使用をご覧ください。

フリートにより、登録済みのクラスタでフリートの Workload Identity の使用による追加のメリットを得ることもできます。フリート メンバーシップで Workload Identity を有効にした登録済みクラスタでは、フリート全体のフリートの Workload Identity プールを使用できるため、フリート内と複数プロジェクトにまたがる Google API やその他のサービスの認証の設定が簡単になります。一部のクラスタタイプでは、Connect Agent でフリートの Workload Identity を使用し、フリート メンバーシップの一部として Google に対して認証することができます。また、Anthos Service Mesh など、プロジェクト間で機能する GKE Enterprise 機能の一部を使用する必要があります。

仕組み

フリートは Workload Identity 連携を使用して、Google Cloud や開発するほかのサービスに対する認証に使用できる個別の連携 ID を各アプリケーションに提供します。フリートで実行されているアプリケーションは、次の形式でフェデレーション ワークロード ID を受け取ります。

serviceAccount:FLEET_PROJECT_ID.svc.id.goog[K8S_NAMESPACE/KSA_NAME]

各要素の意味は次のとおりです。

  • FLEET_PROJECT_ID.svc.id.goog は、フリートの Workload Identity プールを短縮したものです。Workload Identity プールは、フリートごとに 1 つだけ自動的に作成されます。
  • K8S_NAMESPACE は、Kubernetes サービス アカウントが定義されている Kubernetes Namespace です。
  • KSA_NAME は、アプリケーションに結び付けられている Kubernetes サービス アカウントの名前です。

フリートでホストされているすべてのアプリケーションは、同じ Workload Identity プールを共有し、各アプリケーションがホストされる場所を抽象化するフェデレーション ID がアプリケーションに提供されます。これにより、アプリケーションが複数の Google Cloud プロジェクトや、異なるクラウドにデプロイされている場合でも、クラスタごとではなく、フリート内で 1 つのリソース(Google Cloud API など)へのアクセスを 1 回で付与できます。他のフリート対応の機能と同様に、これはフリートの同一の原則に従います。つまり、同じ名前の Kubernetes オブジェクトは、異なるクラスタで同じものとして扱われます。そのため、たとえば、同じフリート内の複数のクラスタにバックエンドがデプロイされたアプリケーションで Google API への認証が必要な場合、その「バックエンド」の Namespace 内のサービスすべてがその API にアクセスできるように簡単にアプリケーションを構成できます。フリートにおける同一性(ID の同一性など)の利用方法についての詳細は、フリートの仕組みをご覧ください。

Google Cloud 外のクラスタでも、フリートの Workload Identity を使用して、Connect Agent が Google に認証するための ID を提供できます。フリートの Workload Identity を使用するクラスタタイプについて詳しくは、下記のクラスタの設定セクションをご覧ください。

始める前に

  • 次のコマンドライン ツールがインストールされていることを確認します。

    • 最新バージョンの Google Cloud CLI、Google Cloud とやり取りするためのコマンドライン ツールである gcloud が含まれています。
    • kubectl

    Google Cloud を操作するシェル環境として Cloud Shell を使用する場合は、これらのツールがインストールされます。

  • プロジェクトで使用する gcloud CLI が初期化されていることを確認します。

クラスタの設定

フリートのアプリケーションがワークロード ID を受け取ることに先立ち、アプリケーションが実行されているクラスタは、フリートに登録され、フリートの Workload Identity を使用するように正しく構成されている必要があります。その方法は、クラスタの種類によって異なります。Google Cloud の外部にある GKE クラスタの多くは、作成する際、自動的にプロジェクト フリートに登録されます。Google Cloud 上の GKE クラスタと接続されたクラスタは、手動で登録する必要があります。

クラスタ構成の詳細については、各クラスタ タイプのドキュメントをご覧ください。

GKE

  1. Google Kubernetes Engine クラスタで GKE Workload Identity を有効にします(有効になっていない場合)。
  2. Workload Identity を使用してクラスタを登録する手順に沿います。

Google Cloud 外の GKE クラスタ

GKE on VMwareGKE on Bare Metalマルチクラウド GKE クラスタ(AWS と Azure の両方)は、クラスタの作成時にプロジェクト フリートに自動的に登録されます。GKE Enterprise 1.8 以降では、これらのすべてのクラスタタイプを登録すると、Workload Identity が自動的に有効になります。既存の登録済みクラスタでは、GKE Enterprise 1.8 以降にアップグレードされるとき、Workload Identity を使用するように更新されます。

接続クラスタ

GKE Multi-Cloud API を使用して登録された EKS 接続クラスタおよび AKS 接続クラスタは、デフォルトで有効になっているフリート Workload Identity に登録されています。必要な要件を満たしている場合、フリートの Workload Identity を有効にしてその他の接続クラスタを登録できます。クラスタの登録にあるクラスタタイプに応じた手順に沿います。

フリートの Workload Identity を使用する

クラスタを登録すると、そのクラスタにデプロイされたワークロードでフリート Workload Identity プールのワークロード ID を使用できます。このセクションでは、Workload Identity を使用して Google Cloud サービス アカウントの権限借用を行い、ワークロードで Google Cloud API にアクセスできるようにする方法について説明します。サービス アカウントとしての動作はフェデレーション ID の一般的なユースケースです。サービス アカウントでアクセス可能な Google Cloud API に対してワークロードを認証できるので、各ワークロードのサービス アカウント キーを管理するためのメンテナンスとセキュリティの負担がなくなります。

サービス アカウントの権限借用

このセクションでは、サービス アカウントの権限を借用するために、ConfigMap でアプリケーションのデフォルト認証情報ファイルを提供し、関連する権限を持つサービス アカウントを作成して構成することによって、アプリケーションのフェデレーション ワークロード ID を構成する方法を示します。

この例では、次のプレースホルダの値を使用します。

  • WORKLOAD_IDENTITY_POOL は、フリートに関連付けられた Workload Identity プールです。前述のとおり、WORKLOAD_IDENTITY_POOL の値は FLEET_PROJECT_ID.svc.id.goog です。
  • IDENTITY_PROVIDER は、Kubernetes クラスタに関連付けられた ID プロバイダの名前です。
  • K8S_NAMESPACE は、Kubernetes サービス アカウントが定義されている Kubernetes Namespace です。
  • KSA_NAME は、アプリケーションに結び付けられている Kubernetes サービス アカウントの名前です。
  • GSA_NAME は、アプリケーションが権限を借用する Google サービス アカウントの名前です。
  • GSA_PROJECT_ID は、Google サービス アカウントが定義されているプロジェクト ID です。

フリートの Workload Identity を構成して、サービス アカウントの権限を借用するには、次のようにします。

  1. 前述のクラスタの設定の手順に沿って、クラスタがフリートに登録されていることを確認します。

  2. 次のコマンドを使用して、クラスタのフリート メンバーシップの詳細を取得し、登録済みクラスタの WORKLOAD_IDENTITY_POOLIDENTITY_PROVIDER の値を取得します。MEMBERSHIP は、フリート内のクラスタの一意のメンバーシップ名に置き換えます。

    gcloud container fleet memberships describe MEMBERSHIP
    

    メンバーシップを記述する出力は次のようになります(わかりやすくするため、フィールドの一部は省略されています)。

    authority:
     identityProvider: IDENTITY_PROVIDER
     workloadIdentityPool: WORKLOAD_IDENTITY_POOL
    name: projects/FLEET_PROJECT_ID/locations/global/memberships/MEMBERSHIP
    
  3. Google の認証時にアプリケーションが権限を借用できる Google Cloud サービス アカウントを作成します(まだ作成していない場合)。

    gcloud iam service-accounts create GSA_NAME --project=GSA_PROJECT_ID
    

    サービス アカウントは、フリートのホスト プロジェクトにある必要はありません。組織内の任意の Google Cloud サービス アカウントを使用できます。サービス アカウントとその仕組みの詳細については、サービス アカウントをご覧ください。

  4. 必要な IAM ポリシー バインディングを追加することで、Google Cloud APIs にアクセスするために必要な権限をサービス アカウントに付与します。これは、gcloud iam service-accounts add-iam-policy-binding を使用するか、必要に応じて別の方法で行います。Google Cloud APIs の使用に必要な権限は各サービスのドキュメント、必要な権限を含む事前定義ロールの一覧はロールについてをご覧ください。

  5. 次のように IAM ポリシー バインディングを作成することで、アプリケーションの Workload Identity を認可して、サービス アカウントの権限借用を許可します。このバインディングにより、アプリケーションのフェデレーション Workload Identity が Google Cloud サービス アカウントとして機能します。

    gcloud iam service-accounts add-iam-policy-binding \
      GSA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/iam.workloadIdentityUser \
      --member="serviceAccount:WORKLOAD_IDENTITY_POOL[K8S_NAMESPACE/KSA_NAME]"
    

    --member フィールドは、アプリケーションのフェデレーション Workload Identity の IAM での表現です。

  6. ワークロードのアプリケーションのデフォルト認証情報 ファイルを含む ConfigMap を作成します。このファイルにより、ワークロードにコンパイルされたクライアント ライブラリに、Google への認証方法が伝達されます。アプリケーションのデフォルト認証情報ファイルには、関連する Workload Identity プールとサービス アカウント情報、および次のステップでコンテナのファイル システムにマウントされる投影トークンへのパスが含まれます。GSA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com はなり代わるサービス アカウントのメールアドレスです。

    この構成自体では、サービス アカウントの権限を借用するアクセス権の付与は行われません。IAM バインディングも存在しなければ、Pod はサービス アカウントを使用できません。

    kind: ConfigMap
    apiVersion: v1
    metadata:
      namespace: K8S_NAMESPACE
      name: my-cloudsdk-config
    data:
      config: |
        {
          "type": "external_account",
          "audience": "identitynamespace:WORKLOAD_IDENTITY_POOL:IDENTITY_PROVIDER",
          "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/GSA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com:generateAccessToken",
          "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "credential_source": {
            "file": "/var/run/secrets/tokens/gcp-ksa/token"
          }
        }
    
  7. 下の例に従ってワークロードを構成します。なお、前のステップで作成した ConfigMap は、/var/run/secrets/tokens/gcp-ksa投影されたサービス アカウント トークン ファイルとともに、google-application-credentials.json としてコンテナのファイル システムにマウントされます。投影トークンは Kubernetes によって発行され、クラスタ内のワークロードの ID を表します。このトークンは、Cloud クライアント ライブラリが Google と自動的に交換して、Google API で認証可能なトークンを取得します。投影トークンの audience フィールドは、WORKLOAD_IDENTITY_POOL の値に設定する必要があります。

    kind: Namespace
    apiVersion: v1
    metadata:
      name:  K8S_NAMESPACE
    ---
    kind: ServiceAccount
    apiVersion: v1
    metadata:
      namespace:  K8S_NAMESPACE
      name: KSA_NAME
    automountServiceAccountToken: false
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
      namespace:  K8S_NAMESPACE
    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: my-container
        image: my-image
        env:
          - name: GOOGLE_APPLICATION_CREDENTIALS
            value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json
        volumeMounts:
        - name: gcp-ksa
          mountPath: /var/run/secrets/tokens/gcp-ksa
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              path: token
              audience: WORKLOAD_IDENTITY_POOL
              expirationSeconds: 172800
          - configMap:
              name: my-cloudsdk-config
              optional: false
              items:
                - key: "config"
                  path: "google-application-credentials.json"
    
    

コードからの認証

Cloud クライアント ライブラリを使用してコードから Google サービスにアクセスする場合は、Google Cloud への認証が自動的に処理されます。上記の設定をアプリケーションで使用するには、Workload Identity 連携をサポートする Cloud クライアント ライブラリを使用する必要があります。以下に、Cloud クライアント ライブラリの必要な最小バージョンと、現在のバージョンを確認する手順を示します。

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 パッケージのユーザーガイドをご覧ください。