Workload Identity クラスタ認証

このドキュメントでは、Google Distributed Cloud コネクテッドで Workload Identity クラスタ認証を設定して使用する方法について説明します。Workload Identity クラスタ認証では、サービス アカウント キーの代わりに有効期間の短いトークンと Workload Identity 連携を使用して、ワークロードが Google Cloud リソースに安全にアクセスできるようにします。有効期間の短い認証情報は OAuth 2.0 アクセス トークンです。デフォルトでは、アクセス トークンは 1 時間後に期限切れになります。

Workload Identity クラスタ認証を使用すると、ワークロードは独自の Kubernetes ID を使用して Google Cloud リソースに直接アクセスしたり、Google サービス アカウントの権限を借用したりできます。

Workload Identity クラスタ認証には、サービス アカウント キーを使用する場合と比べて主に次の 2 つのメリットがあります。

  • セキュリティの強化: サービス アカウント キーは、正しく管理されていないとセキュリティ リスクになります。OAuth 2.0 トークンと Workload Identity 連携は、サービス アカウント キーのベスト プラクティスの代替手段と見なされます。サービス アカウント トークンの詳細については、有効期間の短いサービス アカウント認証情報をご覧ください。Workload Identity 連携の詳細については、Workload Identity 連携をご覧ください。

  • メンテナンスの削減: サービス アカウント キーは、より多くのメンテナンスが必要です。これらの鍵を定期的にローテーションして保護することは、管理するうえで非常に負担がかかります。

このページは、基盤となる技術インフラストラクチャのライフサイクルの設定、モニタリング、管理を行う管理者、アーキテクト、オペレーターを対象としています。Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE ユーザーのロールとタスクをご覧ください。

クラスタ管理

このガイドでは、アプリケーションの Workload Identity 連携について説明します。クラスタレベルの Workload Identity 連携は、Distributed Cloud 接続クラスタで自動的に管理されます。

Distributed Cloud 接続クラスタは、Distributed Cloud Edge Container API を介して Google によって作成および管理されます。これは、gcloud edge-cloud container clusters create コマンドを使用するか、 Google Cloud コンソールで行います。

Distributed Cloud 接続クラスタは、作成されたプロジェクトのフリートに自動的に登録されます。手動でフリート登録を行う必要はありません。Workload Identity 連携プールは自動的に使用可能になり、PROJECT_ID.svc.id.goog 形式になります。

始める前に

  • Workload Identity 連携を設定する前に、 Google Cloud プロジェクトで次の API が有効になっていることを確認します。API の有効化については、サービスの有効化をご覧ください。

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

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

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

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

  • プロジェクトに次の IAM ロールがあることを確認します。設定を行うには、次のロールが必要です。

    • オーナー(roles/owner)または
    • IAM セキュリティ管理者(roles/iam.securityAdmin)とサービス アカウント管理者(roles/iam.serviceAccountAdmin

以降のセクションでは、サービス アカウントを作成し、Workload Identity クラスタ認証に必要なロールを付与します。

推奨: Workload Identity 連携によるリソースへの直接アクセス

Workload Identity 連携によるリソースへの直接アクセスでは、Workload Identity 連携を使用して Kubernetes ServiceAccount に IAM ロールを付与し、 Google Cloudリソースに直接アクセスできるようにします。

ID 目的 ロール
Kubernetes サービス アカウント ワークロードが使用する Kubernetes ID。この ID に、必要な Google Cloud リソースにアクセスするために必要なロールを付与します。この例では、roles/storage.objectViewer ロールと roles/logging.admin ロールを付与しています。 roles/storage.objectViewer
roles/logging.admin

代替手段: IAM サービス アカウントの権限借用

または、IAM サービス アカウントの権限借用を使用するように Kubernetes ServiceAccount を構成することもできます。

サービス アカウント 目的 ロール
Google サービス アカウント クラスタ内ワークロードが権限を借用する Google サービス アカウント。このサービス アカウントに、必要な Google Cloudリソースにアクセスするために必要なロールを付与します。 アクセスされるリソースによって異なります。
Kubernetes サービス アカウント この ID に Google サービス アカウントの権限を借用する権限を付与します。この付与では、ロール roles/iam.workloadIdentityUser を使用します。 roles/iam.workloadIdentityUser

サービス アカウントを設定する

以降のセクションでは、Workload Identity 連携のリソースへの直接アクセスまたは Google サービス アカウントの権限借用を使用して、Workload Identity クラスタ認証に必要な Kubernetes ServiceAccount を作成し、必要なロールを付与する手順について説明します。

Kubernetes ServiceAccount を作成する

クラスタで、kubectl create コマンドを使用して、Pod の Kubernetes ServiceAccount を作成します。Namespace のデフォルトの ServiceAccount など、既存の ServiceAccount を使用することもできます。

kubectl create serviceaccount KSA_NAME --namespace NAMESPACE

次の値を置き換えます。

  • KSA_NAME: Kubernetes ServiceAccount の名前

  • NAMESPACE: クラスタの Namespace

Workload Identity 連携を使用してリソースへの直接アクセス権を付与する

Kubernetes ServiceAccount ID に Identity and Access Management ロールを直接付与する手順は次のとおりです。

  1. gcloud projects describe コマンドを使用して、プロジェクト番号を確認します。

    gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    

    PROJECT_ID は、プロジェクトの ID に置き換えます。

  2. gcloud projects add-iam-policy-binding コマンドを使用して、必要なロールを Kubernetes ID プリンシパルに付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role=roles/storage.objectViewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role=roles/logging.admin
    

    次の値を置き換えます。

    • PROJECT_NUMBER: 数値のプロジェクト番号
    • NAMESPACE: クラスタの Namespace
    • KSA_NAME: Kubernetes ServiceAccount の名前

代替手段: IAM サービス アカウントの権限借用を使用してアクセス権を付与する

ワークロードで Google サービス アカウントの権限を借用する場合は、次の手順を行います。

  1. gcloud iam service-accounts create コマンドを使用して、Google サービス アカウントを作成します。

    gcloud iam service-accounts create my-app-sa \
        --project=PROJECT_ID
    

    PROJECT_ID は、プロジェクトの ID に置き換えます。

  2. gcloud projects add-iam-policy-binding コマンドを使用して、必要なロールを Google サービス アカウントに付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/storage.objectViewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/logging.admin
    
  3. gcloud iam service-accounts add-iam-policy-binding コマンドを使用して、Kubernetes ServiceAccount に Google サービス アカウントの権限を借用する権限を付与します。

    gcloud iam service-accounts add-iam-policy-binding my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/iam.workloadIdentityUser \
        --member="serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
    

    次の値を置き換えます。

    • NAMESPACE: クラスタの Namespace
    • KSA_NAME: Kubernetes ServiceAccount の名前
  4. kubectl annotate コマンドを使用して、Kubernetes ServiceAccount にアノテーションを付け、Google サービス アカウントにリンクします。

    kubectl annotate serviceaccount \
        --namespace NAMESPACE KSA_NAME \
        iam.gke.io/gcp-service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com
    

ワークロードを構成する

Kubernetes ServiceAccount を使用して、投影されたトークン ボリュームをマウントするように Pod 仕様を更新します。Distributed Cloud 接続クラスタはGoogle Cloudの外部にあるため、認証情報構成ファイルも指定し、そのファイルを指すように GOOGLE_APPLICATION_CREDENTIALS 環境変数を設定する必要があります。Pod 内のGoogle Cloud クライアント ライブラリは、これらを使用して Security Token Service API を介して Kubernetes トークンを Google Cloud アクセス トークンと交換します。

  1. credential-configuration.json ファイルを生成します。Workload Identity 連携のリソースへの直接アクセスを使用しているか、IAM サービス アカウントの権限借用を使用しているかに応じて、コマンドを選択します。

    Workload Identity 連携によるリソースへの直接アクセス

    gcloud iam workload-identity-pools create-cred-config コマンドを使用します。

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \
        --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \
        --credential-source-type=text \
        --output-file=credential-configuration.json
    

    IAM サービス アカウントの権限借用を使用してアクセス権を付与する

    gcloud iam workload-identity-pools create-cred-config コマンドを使用します。

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \
        --service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \
        --credential-source-type=text \
        --output-file=credential-configuration.json
    

    PROJECT_NUMBER は、使用する Google Cloud プロジェクト番号に置き換えます。プロジェクト番号は、gcloud projects describe PROJECT_ID --format="value(projectNumber)" を実行して確認できます。

  2. kubectl create configmap コマンドを使用して、構成ファイルを保存する Kubernetes ConfigMap を作成します。

    kubectl create configmap CREDENTIAL_CONFIG_MAP \
        --namespace NAMESPACE \
        --from-file=credential-configuration.json
    

    次の値を置き換えます。

    • CREDENTIAL_CONFIG_MAP: 認証情報構成ファイルを含む ConfigMap の名前

    • NAMESPACE: クラスタの Namespace

  3. 次の YAML コンテンツを使用して Pod 仕様を更新します。

    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: MY_CONTAINER
        image: MY_IMAGE
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/run/secrets/tokens/gcp-creds/credential-configuration.json
        volumeMounts:
        - mountPath: /var/run/secrets/tokens/gcp-ksa
          name: gcp-ksa
        - mountPath: /var/run/secrets/tokens/gcp-creds
          name: gcp-creds
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 0420
          sources:
          - serviceAccountToken:
              path: token
              audience: PROJECT_ID.svc.id.goog
              expirationSeconds: 3600
      - name: gcp-creds
        configMap:
          name: CREDENTIAL_CONFIG_MAP
    

    次の値を置き換えます。

    • KSA_NAME: Kubernetes ServiceAccount の名前

    • MY_CONTAINER: コンテナの名前

    • MY_IMAGE: イメージの名前

制限事項

Distributed Cloud Connected で Workload Identity 連携を使用する場合、次の機能はサポートされていません。

  • トークン交換プロセスにプロキシ サーバーを使用する

Workload Identity 連携と VPC Service Controls の使用については、VPC Service Controls の統合を構成するをご覧ください。

次のステップ