マネージド ワークロード ID 認証を構成する

このページでは、gcloud CLI を使用してマネージド ワークロード ID を構成する方法について説明します。

このページでは、Compute Engine のマネージド ワークロード ID の自動プロビジョニングとライフサイクル管理を設定する方法について説明します。Certificate Authority Service を使用して証明書を発行するように認証局(CA)プールを構成します。CA Service は可用性の高いスケーラブルな Google Cloud サービスで、これにより CA サービスのデプロイ、管理、セキュリティが自動化され、簡素化されます。構成された CA プールの X.509 認証情報を使用してプロビジョニングされる仮想マシン インスタンス(VM)を作成できます。これらの認証情報を使用して、ワークロード間で mTLS 接続を確立できます。

始める前に

  1. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  2. マネージド ワークロード ID(プレビュー版)へのアクセスをリクエストする

  3. マネージド ワークロード ID について理解する。

  4. Certificate Authority Service を使用した証明書の発行について理解する。

  5. マネージド ワークロード ID を使用して Compute Engine ワークロードを認証する方法について理解する。

  6. Enable the IAM and Certificate Authority Service APIs:

    gcloud services enable iam.googleapis.com privateca.googleapis.com

  7. 許可リストに追加されたプロジェクトを課金と割り当てに使用するように Google Cloud CLI を構成する。

    gcloud config set billing/quota_project PROJECT_ID
    

    PROJECT_ID は、マネージド ワークロード ID(プレビュー版)の許可リストに追加されたプロジェクトの ID に置き換えます。

必要なロール

マネージド ワークロード ID を作成し、マネージド ワークロード ID 証明書をプロビジョニングするために必要な権限を取得するには、プロジェクトに対して次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

また、IAM オーナー(roles/owner)の基本ロールには、マネージド ワークロード ID を構成する権限も含まれています。本番環境では基本ロールを付与すべきではありません。基本ロールは、開発環境またはテスト環境で付与してください。

概要

アプリケーションでマネージド ワークロード ID を使用するには、次の操作を行う必要があります。

  1. セキュリティ管理者:

  2. Compute 管理者:

    Compute Engine で実行されているワークロードのマネージド ワークロード ID を有効にします。

マネージド ワークロード ID を作成する

マネージド ワークロード ID により、Google Cloud はワークロード ID プール ID の認証情報をワークロードに自動的にプロビジョニングします。ワークロード ID は、ワークロード ID プール内で定義され、名前空間と呼ばれる管理境界に編成されます。

ワークロード ID プールを作成する

マネージド ワークロード ID を作成するには、TRUST_DOMAIN モードでプールを作成する必要があります。マネージド ワークロード ID の Workload Identity プールを作成するには、workload-identity-pools create コマンドを使用します。

gcloud iam workload-identity-pools create POOL_ID \
    --location="global" \
    --mode="TRUST_DOMAIN"

次のように置き換えます。

  • POOL_ID: プールの一意の ID。ID は 4~32 文字で、小文字の英数字とダッシュのみを使用できます。先頭と末尾は英数字にします。ワークロード ID プールを作成した後に、その ID を変更することはできません。

Workload Identity プールが TRUST_DOMAIN モードで作成されたことを確認するには、workload-identity-pools describe コマンドを使用します。

gcloud iam workload-identity-pools describe POOL_ID \
    --location="global"

コマンドの出力は次のようになります。

mode: TRUST_DOMAIN
name: projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID
state: ACTIVE

コマンド出力に mode: TRUST_DOMAIN が存在しない場合は、プロジェクトがマネージド ワークロード ID(プレビュー版)の許可リストに追加されていることと、課金と割り当てに正しいプロジェクトを使用するように gcloud CLI が正しく構成されていることを確認します。gcloud CLI の新しいバージョンへの更新が必要になることがあります。

名前空間を作成する

workload-identity-pools namespaces create コマンドを使用すると、ワークロード ID プールに名前空間を作成できます。

gcloud iam workload-identity-pools namespaces create NAMESPACE_ID \
    --workload-identity-pool="POOL_ID" \
    --location="global"

次のように置き換えます。

  • NAMESPACE_ID: 名前空間の一意の ID。ID は 2~63 文字で、小文字の英数字とダッシュのみを使用できます。先頭と末尾は英数字にする必要があります。名前空間を作成した後に、その ID を変更することはできません。
  • POOL_ID: 前に作成したワークロード ID プール ID。

マネージド ワークロード ID を作成する

workload-identity-pools managed-identities create コマンドを使用すると、ワークロード ID プールにマネージド ワークロード ID を作成できます。

gcloud iam workload-identity-pools managed-identities create MANAGED_IDENTITY_ID \
    --namespace="NAMESPACE_ID" \
    --workload-identity-pool="POOL_ID" \
    --location="global"

次のように置き換えます。

  • MANAGED_IDENTITY_ID: マネージド ID の一意の ID。ID は 2~63 文字で、小文字の英数字とダッシュのみを使用できます。先頭と末尾は英数字にする必要があります。マネージド ワークロード ID を作成した後に、その ID を変更することはできません。
  • NAMESPACE_ID: 前に作成した名前空間 ID。
  • POOL_ID: 前に作成したワークロード ID プール ID。

マネージド ワークロード ID は SPIFFE 識別子で、次のような形式になります。

spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog/ns/NAMESPACE_ID/sa/MANAGED_IDENTITY_ID

ワークロード証明書ポリシーを定義する

このセクションでは、構成証明ポリシーを設定する方法について説明します。このポリシーにより、Google Cloud IAM がワークロードの ID の検証に使用する属性が決まります。検証後、呼び出し元のワークロードは認証情報を受け取ることができます。検証は、ワークロードの次のいずれかの属性に基づいて行われます。

  • VM インスタンス ID
  • 接続されたサービス アカウントのメールアドレス
  • 接続されたサービス アカウントの UID

構成証明ルールを使用してワークロード構成証明ポリシーを定義する

ワークロードがマネージド ID を使用できるように証明書ポリシーを作成するには、次の操作を行います。

  1. ワークロードが、接続されたサービス アカウントを使用してマネージド ID を証明するか、インスタンス ID を使用してマネージド ID を証明できるようにする証明書ポリシーを作成するかどうかを決定します。

  2. JSON 形式の構成証明ポリシー ファイルを作成します。

    1. (省略可)Compute Engine インスタンスで X.509 認証情報を受信するには、接続されたサービス アカウントを有効にする必要があります。新しいサービス アカウントをワークロードに接続するには、まず次のコマンドを使用して作成することをおすすめします。

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
      

      SERVICE_ACCOUNT_NAME は、サービス アカウントの名前に置き換えます。

    2. サービス アカウントのメールアドレス、サービス アカウントの UID、インスタンス ID に基づいて構成証明を行う JSON 形式の構成証明ポリシー ファイルを作成します。

      サービス アカウントのメールアドレス

      サービス アカウントのメールアドレスに基づいて構成証明を行う構成証明ポリシー ファイルを作成するには、次の内容のファイルを作成します。

      {
         "attestationRules": [
            {
               "googleCloudResource": "//compute.googleapis.com/projects/WORKLOAD_PROJECT_NUMBER/type/Instance/attached_service_account.email/SERVICE_ACCOUNT_EMAIL"
            }
         ],
      }
      

      次のように置き換えます。

      • WORKLOAD_PROJECT_NUMBER: VM インスタンスまたはサービス アカウントを含むプロジェクトの番号

      作成したマネージド ID またはサービス アカウントを含むプロジェクトのプロジェクト番号を取得するには、次のコマンドを実行します。

         gcloud projects describe $(gcloud config get-value project) \
            --format="value(projectNumber)"
      
      • SERVICE_ACCOUNT_EMAIL: VM にアタッチされているサービス アカウントのメールアドレス

      サービス アカウントの UID

      サービス アカウントの UID に基づいて構成証明を行う構成証明ポリシー ファイルを作成するには、次の内容のファイルを作成します。

      {
         "attestationRules": [
            {
               "googleCloudResource": "//compute.googleapis.com/projects/WORKLOAD_PROJECT_NUMBER/type/Instance/attached_service_account.uid/SERVICE_ACCOUNT_UID"
            }
         ],
      }
      

      次のように置き換えます。

      • WORKLOAD_PROJECT_NUMBER: VM インスタンスまたはサービス アカウントを含むプロジェクトの番号

      作成したマネージド ID またはサービス アカウントを含むプロジェクトのプロジェクト番号を取得するには、次のコマンドを実行します。

         gcloud projects describe $(gcloud config get-value project) \
            --format="value(projectNumber)"
      
      • SERVICE_ACCOUNT_UID: VM に接続されているサービス アカウントの UID

      インスタンス ID

      インスタンス ID に基づいて構成証明を行う構成証明ポリシー ファイルを作成するには、次の内容のファイルを作成します。

      {
         "attestationRules": [
            {
               "googleCloudResource": "//compute.googleapis.com/projects/WORKLOAD_PROJECT_NUMBER/uid/zones/ZONE/instances/INSTANCE_ID"
            }
         ],
      }
      

      次のように置き換えます。

      • WORKLOAD_PROJECT_NUMBER: VM インスタンスまたはサービス アカウントを含むプロジェクトの番号

      作成したマネージド ID またはサービス アカウントを含むプロジェクトのプロジェクト番号を取得するには、次のコマンドを実行します。

         gcloud projects describe $(gcloud config get-value project) \
            --format="value(projectNumber)"
      
      • INSTANCE_ID: Compute Engine VM インスタンス ID

      インスタンス ID の値は、既存の Compute Engine インスタンスから取得する必要があります。インスタンス ID を取得するには、次のコマンドを実行します。

      gcloud compute instances describe INSTANCE_NAME --zone=ZONE --format="get(id)"
      
      • INSTANCE_NAME: Compute Engine VM インスタンス名
      • ZONE: Compute Engine VM ゾーン
  3. このドキュメントの前半で作成したポリシー JSON ファイルを使用して、構成証明ポリシーを作成します。

    gcloud iam workload-identity-pools managed-identities set-attestation-rules MANAGED_IDENTITY_ID \
       --namespace=NAMESPACE_ID \
       --workload-identity-pool=POOL_ID \
       --policy-file=PATH_TO_POLICY_JSON_FILE \
       --location=global
    

    次のように置き換えます。

    • MANAGED_IDENTITY_ID: マネージド ID の一意の ID。ID は 2~63 文字で、小文字の英数字とダッシュのみを使用できます。先頭と末尾は英数字にする必要があります。マネージド ワークロード ID を作成した後に、その ID を変更することはできません。
    • NAMESPACE_ID: 前に作成した名前空間 ID。
    • POOL_ID: 前に作成したワークロード ID プール ID。
    • PATH_TO_POLICY_JSON_FILE: 前に作成した構成証明ポリシーを表す JSON ファイルのパス。

    構成証明ルールを個別に追加または削除してポリシーを更新することもできます。構成証明ポリシーに構成証明を追加するには、次のコマンドを実行します。

    gcloud iam workload-identity-pools managed-identities add-attestation-rule MANAGED_IDENTITY_ID \
       --namespace=NAMESPACE_ID \
       --workload-identity-pool=POOL_ID \
       --google-cloud-resource='//compute.googleapis.com/projects/WORKLOAD_PROJECT_NUMBER/type/Instance/attached_service_account.uid/SERVICE_ACCOUNT_UID' \
       --location=global
    
  4. 構成証明ルールを一覧表示または削除する方法については、次のコマンドを実行します。

    gcloud iam workload-identity-pools managed-identities list-attestation-rules --help
    gcloud iam workload-identity-pools managed-identities remove-attestation-rule --help
    

マネージド ワークロード ID の証明書を発行するように Certificate Authority Service を構成する

Certificate Authority Service プールを使用して、ルート認証局と下位認証局(CA)の推奨設定を作成します。下位 CA プールが VM に X.509 ワークロード ID 証明書を発行します。

CA プールを構成したら、CA プールに対して署名付き証明書をリクエストして受信することをマネージド ワークロード ID に許可します。

ルート CA プールを構成する

Certificate Authority Service との Google Cloud CLI インターフェースを使用して、ルート CA プールを構成します。

gcloud

ルート CA プールを作成します。

  1. エンタープライズ ティアにルート CA プールを作成します。これは、gcloud privateca pools create コマンドを使用して、有効期間の長い少量の証明書を発行することを意味します。

    gcloud privateca pools create ROOT_CA_POOL_ID \
       --location=REGION \
       --tier=enterprise
    

    次のように置き換えます。

    • ROOT_CA_POOL_ID: ルート CA プールの一意の ID。ID は 64 文字以下で、大文字と小文字の英数字、アンダースコア、ハイフンのみを使用できます。プール ID はリージョン内で一意である必要があります。
    • REGION: ルート CA プールが配置されているリージョン。

    詳細については、CA プールの作成をご覧ください。

  2. gcloud privateca roots create コマンドを使用して、ルート CA プールにルート CA を作成します。これがルート CA プールの唯一の CA である場合は、ルート CA を有効にすることを求めるメッセージが表示される場合があります。

    たとえば、次のようなコマンドを使用してルート CA を作成できます。

    gcloud privateca roots create ROOT_CA_ID \
       --pool=ROOT_CA_POOL_ID \
       --subject "CN=ROOT_CA_CN, O=ROOT_CA_ORGANIZATION" \
       --key-algorithm="ec-p256-sha256" \
       --max-chain-length=1 \
       --location=REGION
    

    次のように置き換えます。

    • ROOT_CA_ID: ルート CA の一意の名前。CA 名は 64 文字以下で、大文字と小文字の英数字、アンダースコア、ハイフンのみを使用できます。CA 名はリージョン内で一意である必要があります。
    • ROOT_CA_POOL_ID: ルート CA プールの ID。
    • ROOT_CA_CN: ルート CA の共通名。
    • ROOT_CA_ORGANIZATION: ルート CA の組織。
    • REGION: ルート CA プールが配置されているリージョン。

    詳細については、ルート認証局を作成するをご覧ください。CA の subject フィールドの詳細については、サブジェクトをご覧ください。

  3. 省略可: 上記の手順を繰り返して、ルート CA プールに追加のルート CA を作成します。これは、ルート CA のローテーションに役立ちます。

下位 CA を構成する

Certificate Authority Service との Google Cloud CLI インターフェースを使用して、下位 CA プールと下位 CA を作成します。

証明書発行のシナリオが複数ある場合は、それぞれのシナリオに下位 CA を作成できます。また、CA プールに複数の下位 CA を追加すると、証明書リクエストのロード バランシングを改善できます。

gcloud

gcloud privateca pools create コマンドを使用して、下位 CA プールを作成します。

  1. DevOps 階層に下位 CA プールを作成します。これは、有効期間の短い証明書を大量に発行する場合に適しています。

    gcloud privateca pools create SUBORDINATE_CA_POOL_ID \
       --location=REGION \
       --tier=devops
    

    次のように置き換えます。

    • SUBORDINATE_CA_POOL_ID: 下位 CA プールの一意の ID。ID は 64 文字以下で、小文字と大文字の英数字、アンダースコア、ハイフンのみを使用できます。プール ID はリージョン内で一意である必要があります。
    • REGION: 下位 CA プールを作成するリージョン。

    詳細については、CA プールの作成をご覧ください。

  2. gcloud privateca subordinates create コマンドを使用して、下位 CA プールに下位 CA を作成します。デフォルトの構成ベースの発行モードは変更しないでください。

    たとえば、次のようなコマンドを使用して下位 CA を作成できます。

    gcloud privateca subordinates create SUBORDINATE_CA_ID \
       --pool=SUBORDINATE_CA_POOL_ID \
       --location=REGION \
       --issuer-pool=ROOT_CA_POOL_ID \
       --issuer-location=REGION \
       --subject="CN=SUBORDINATE_CA_CN, O=SUBORDINATE_CA_ORGANIZATION" \
       --key-algorithm="ec-p256-sha256" \
       --use-preset-profile=subordinate_mtls_pathlen_0
    

    次のように置き換えます。

    • SUBORDINATE_CA_ID: 下位 CA の一意の名前。名前は 64 文字以下で、小文字と大文字の英数字、アンダースコア、ハイフンのみを使用できます。プール名はリージョン内で一意である必要があります。
    • SUBORDINATE_CA_POOL_ID: 下位 CA プールの名前。
    • REGION: 下位 CA プールが配置されているリージョン。
    • ROOT_CA_POOL_ID: ルート CA プールの ID。
    • REGION: ルート CA プールのリージョン。
    • SUBORDINATE_CA_CN: 下位 CA の共通名。
    • SUBORDINATE_CA_ORGANIZATION: 下位 CA 発行組織の名前。

    詳細については、CA プールの作成をご覧ください。CA の subject フィールドの詳細については、サブジェクトをご覧ください。

CA プールの証明書のリクエストをマネージド ワークロード ID に許可する

マネージド ワークロード ID には、CA Service に証明書をリクエストして公開証明書を取得する権限が必要です。

gcloud

  1. マネージド ワークロード ID に、各下位 CA プールに対する CA サービス ワークロード証明書リクエスト元(roles/privateca.workloadCertificateRequesterの IAM ロールを付与します。次の gcloud privateca pools add-iam-policy-binding コマンドは、CA Service 証明書チェーンの証明書のリクエストをマネージド ワークロード ID に許可します。

    gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \
     --location=REGION \
     --role=roles/privateca.workloadCertificateRequester \
     --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*"
    

    次のように置き換えます。

    • SUBORDINATE_CA_POOL_ID: 下位 CA プールの ID。
    • REGION: 下位 CA プールのリージョン。
    • PROJECT_NUMBER: Workload Identity プールを含むプロジェクトのプロジェクト番号。
    • POOL_ID: Workload Identity プールの ID。
  2. 下位 CA プールに対する CA サービスプール読み取り(roles/privateca.poolReaderの IAM ロールをマネージド ワークロード ID に付与します。これにより、CA の証明書チェーンからの署名付き X.509 証明書の取得がマネージド ワークロード ID に許可されます。

    gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \
     --location=REGION \
     --role=roles/privateca.poolReader \
     --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*"
    

    次のように置き換えます。

    • SUBORDINATE_CA_POOL_ID: 下位 CA プールの ID。
    • REGION: 下位 CA プールのリージョン。
    • PROJECT_NUMBER: Workload Identity プールを含むプロジェクトのプロジェクト番号。
    • POOL_ID: Workload Identity プールの ID。

信頼と証明書発行の構成を定義する

この情報を使用して、VM の作成時にパートナー データとしてアップロードされる JSON ファイルを作成します。

証明書発行の構成を定義する

Compute Engine のマネージド ワークロード ID を有効にするには、次の証明書発行構成が必要です。

{
  "primary_certificate_authority_config": {
    "certificate_authority_config": {
      "ca_pool": "projects/SUBORDINATE_CA_POOL_PROJECT_ID/locations/REGION/caPools/SUBORDINATE_CA_POOL_ID"
    }
  },
  "key_algorithm": "ALGORITHM",
  "workload_certificate_lifetime_seconds": DURATION,
  "rotation_window_percentage": ROTATION_WINDOW_PERCENTAGE
}

次のように置き換えます。

  • SUBORDINATE_CA_POOL_PROJECT_ID: 下位 CA プールを含むプロジェクトの ID。
  • REGION: 下位 CA プールが配置されているリージョン。
  • SUBORDINATE_CA_POOL_ID: 下位 CA プールの名前
  • ALGORITHM: 秘密鍵の生成に使用される暗号化アルゴリズム。有効な値は rsa-2048(デフォルト)、rsa-3072rsa-4096ecdsa-p256ecdsa-p384 です。
  • DURATION: 省略可。リーフ証明書の有効期間(秒単位)。値は 3600~315360000 の範囲で指定してください。指定しない場合は、デフォルト値の 86400 が使用されます。発行された証明書の実際の有効期間は発行元の CA によって異なります。これは、発行された証明書の有効期間が制限される可能性があるためです。
  • ROTATION_WINDOW_PERCENTAGE: 省略可。証明書の全期間で更新がトリガーされる割合。値は 1~100 にする必要があります。デフォルト値は 66% です。証明書の更新が、証明書発行の 7 日以上後で、期限切れの 7 日以上前に行われるように、証明書の有効期間を基準にしてローテーション ウィンドウの割合を設定する必要があります。

信頼構成を定義する

信頼構成には、ピア証明書を検証するためのトラスト アンカーのセットが含まれています。これには次のものが含まれます。

  • 信頼できる CA プールのリソース URI: VM が属する信頼ドメインで証明書を発行することが信頼されている CA プールリソース URI のセット。
  • PEM 形式の CA 証明書: VM が属する信頼ドメインで証明書を発行するために信頼されている、PEM 形式の CA 証明書のセット。
{
  "POOL_ID.global.PROJECT_NUMBER.workload.id.goog": {
    "trust_anchors": [
      {
        "ca_pool": "projects/SUBORDINATE_CA_POOL_PROJECT_ID/locations/REGION/caPools/SUBORDINATE_CA_POOL_ID"
      },
      {
        "pem_certificate": "PEM_ENCODED_CERTIFICATE"
      }
    ]
  }
}

次のように置き換えます。

  • POOL_ID: ワークロード ID プールの ID
  • PROJECT_NUMBER: ワークロード ID プールを含むプロジェクトのプロジェクト番号
  • SUBORDINATE_CA_POOL_PROJECT_ID: 下位 CA プールを含むプロジェクトの ID。
  • REGION: 下位 CA プールが配置されているリージョン
  • SUBORDINATE_CA_POOL_ID: 下位 CA プールの ID
  • PEM_ENCODED_CERTIFICATE: 省略可。VM が属する同じ信頼ドメインで証明書を発行するために信頼されている、一連の追加の PEM 形式の CA 証明書。これらの証明書は、サブ CA プールの信頼アンカーのリストに追加されます。次のコマンドを使用して、PEM 形式の trust-anchor.pem ファイルを 1 行の文字列にエンコードできます。

    cat trust-anchor.pem | sed 's/^[ ]*//g' | sed -z '$ s/\n$//' | tr '\n' $ | sed 's/\$/\\n/g'
    

構成ファイルを作成して VM のパートナー メタデータをアップロードする

次の内容を含む JSON ファイルを作成します。

このファイルを CONFIGS.json として保存します。このファイルは、マネージド ワークロード ID を使用するアプリケーションを実行する VM の作成時に使用されます。

CONFIGS.json ファイルは次のようになります。

  {
  "wc.compute.googleapis.com": {
     "entries": {
        "certificate-issuance-config": {
           "primary_certificate_authority_config": {
              "certificate_authority_config": {
                 "ca_pool": "projects/PROJECT_ID/locations/REGION/caPools/SUBORDINATE_CA_POOL_ID"
              }
           },
           "key_algorithm": "ALGORITHM"
        },
        "trust-config": {
           "POOL_ID.global.PROJECT_NUMBER.workload.id.goog": {
               "trust_anchors": [{
                  "ca_pool": "projects/PROJECT_ID/locations/REGION/caPools/SUBORDINATE_CA_POOL_ID"
                }]
           }
     }
  }
  },
  "iam.googleapis.com": {
     "entries": {
        "workload-identity": "spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog/ns/NAMESPACE_ID/sa/MANAGED_IDENTITY_ID"
     }
  }
  }
  

次のステップ

使ってみる

Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。

無料で開始