サービス アカウントを管理

サービス アカウントは、ワークロードまたはサービスがリソースをプログラムで消費し、マイクロサービスに安全にアクセスするために使用するアカウントです。これらは、ユーザーではなく、アプリケーションやワークロードで使用される特別な種類の ID です。ユーザー アカウントと同様に、サービス アカウントには権限とロールを付与できますが、人間のユーザーのようにログインすることはできません。

サービス アカウントは、次のような Google Distributed Cloud(GDC)のエアギャップ インフラストラクチャの管理に役立ちます。

  • 内部の Distributed Cloud サービスとワークロードが Distributed Cloud コントロール プレーン アプリケーション プログラミング インターフェース(API)に安全にアクセスできるようにします。たとえば、データベース サービスが Kubernetes API とやり取りしてデータベースを作成および削除します。
  • Distributed Cloud のお客様のワークロードが Distributed Cloud サービスにアクセスし、承認されたアプリケーション プログラミング インターフェース(API)呼び出しを行います。たとえば、サービス アカウントは、Vertex AI Workbench ノートブックを使用して Speech-to-Text API で音声ファイルを文字変換することで、顧客を管理できます。
  • Distributed Cloud と連携する外部ワークロード。たとえば、サービス アカウントは、ドキュメントをデジタル化する Distributed Cloud の外部にあるアプリケーションを管理できますが、光学文字認識(OCR)API を使用して現在の OCR エンジンを置き換えることができます。
  • 分散クラウド サービスまたはシステム コントローラが顧客リソースまたはユーザー クラスタに安全にアクセスできるようにします。たとえば、サービス アカウントは、管理クラスタで実行されているサービス コントローラが、顧客が管理するユーザー クラスタ内でワークロードを実行する必要がある認証と認可のワークフローを管理できます。

アカウントは、GDC コンソール、gdcloud CLI、または API を使用して管理できます。gdcloud CLI では、サービス ID 機能はグローバル ProjectServiceAccount API に基づいて構築されています。サービス アカウントはグローバルに構成されるため、gdcloud ユニバースのすべてのゾーンで動作します。

始める前に

サービス アカウントはプロジェクト内でのみ作成できます。プロジェクトの作成について詳しくは、プロジェクトを作成するをご覧ください。

サービス ID を作成する

サービス アカウントの作成に必要な権限を取得するには、プロジェクト IAM 管理者にプロジェクト IAM 管理者(project-iam-admin)ロールの付与を依頼してください。

サービス アカウントへのアクセス権を持つユーザーは、プロジェクト内のすべてのサービス アカウントにアクセスできます。

プロジェクトにサービス アカウントを作成するには、GDC コンソール、gdcloud CLI、または API を使用します。

コンソール

  1. GDC コンソールにログインします。
  2. ナビゲーション メニューで、[ID とアクセス] > [サービス ID] を選択します。
  3. [サービス ID を作成] をクリックします。[サービス ID の詳細] ページが開きます。
  4. [サービス ID 名] フィールドに、サービス ID の名前を入力します。例: testserviceidentity
  5. [作成] をクリックします。

gdcloud

サービス ID を作成します。

gdcloud iam service-accounts create NAME \
    --project=PROJECT

次の値を置き換えます。

  • NAME: ProjectServiceAccount の名前。名前はプロジェクト Namespace 内で一意である必要があります。
  • PROJECT: サービス ID を作成するプロジェクト。gdcloud init がすでに設定されている場合は、--project フラグを省略します。

このコマンドは、Management API サーバーのプロジェクト Namespace に ProjectServiceAccount を作成します。

API

  1. my-project-sa.yaml などの ProjectServiceAccount カスタム リソース YAML ファイルを作成します。

    apiVersion: resourcemanager.global.gdc.goog/v1
    kind: ProjectServiceAccount
    metadata:
      name: NAME
      namespace: PROJECT
    spec:
      keys:
      - algorithm: ALGORITHM
      id: KEY_ID
      key: BASE64_ENCODED_KEY
      validAfter: "START_TIME"
      validBefore: "EXPIRATION_TIME"
    

    次の変数を置き換えます。

    • NAME: ProjectServiceAccount リソースの名前。名前はプロジェクト名前空間内で一意である必要があります。
    • PROJECT: サービス ID を作成するプロジェクト。
    • ALGORITHM: 鍵のアルゴリズム。ES256 鍵のみがサポートされています。
    • KEY_ID: 鍵の固有識別子。この ID は、検証に使用する鍵を特定するために使用されます。
    • BASE64_ENCODED_KEY: 照合する PEM 形式の Base64 エンコードされた公開鍵。この公開鍵の生成に使用される秘密鍵は、ECDSA P256 PEM 形式で指定する必要があります。
    • START_TIME: キーが有効になる開始時間(2025-02-07T00:59:34Z など)。
    • EXPIRATION_TIME: 鍵の有効期限(2026-02-07T00:59:34Z など)。
  2. ProjectServiceAccount カスタム リソースをグローバル API サーバーに適用します。

    kubectl --kubeconfig GLOBAL_API_SERVER_KUBECONFIG apply -f my-project-sa.yaml
    

    GLOBAL_API_SERVER_KUBECONFIG 変数を、グローバル API サーバーの kubeconfig ファイルへのパスに置き換えます。

サービス ID を表示する

プロジェクト内のサービス アカウントの一覧を表示するには、GDC コンソールまたは gdcloud CLI を使用します。

コンソール

  1. GDC コンソールにログインします。
  2. プロジェクトを選択します。
  3. ナビゲーション メニューで、[Identity & Access > サービス ID] をクリックして、プロジェクトのサービス アカウントのリストを表示します。

gdcloud

プロジェクトのサービス アカウントを一覧表示します。

gdcloud iam service-accounts list \
    --project=PROJECT

サービス ID にロール バインディングを割り当てる

ロール バインディングを割り当てるには、適切な権限が必要です。ロールの割り当てに必要な権限を取得するには、プロジェクト IAM 管理者にプロジェクト IAM 管理者(project-iam-admin)ロールの付与を依頼してください。

GDC コンソールまたは gdcloud CLI を使用して、ロール バインディングを割り当てます。

コンソール

  1. GDC コンソールにログインします。
  2. プロジェクトを選択します。
  3. ナビゲーション メニューで、[ID とアクセス] > [アクセス] を選択します。
  4. [メンバー] リストで、[メンバーを追加] をクリックします。[ユーザーとロール] ページが表示されます。
  5. [メンバー タイプ] リストで [サービス ID] を選択します。
  6. [サービス ID] リストで、ロール バインディングを割り当てるサービス ID を選択します。
  7. [ロール] リストで、サービス ID に割り当てるロール(バックアップ作成者など)を選択します。
  8. 省略可: 別のロールを追加するには、[別のロールを追加] をクリックします。追加のロールを選択します。
  9. [追加] をクリックします。

gdcloud

このコマンドは、指定されたロールを Management API サーバーの ProjectServiceAccount にバインドするプロジェクト ロール バインディングを作成して名前を付けます。

gdcloud iam service-accounts add-iam-policy-binding \
    --project=PROJECT \
    --role=ROLE \
    --role-namespace=ROLE_NAMESPACE \
    --iam-account=NAME

次の値を置き換えます。

  • PROJECT: ロール バインディングを作成するプロジェクト。gdcloud init がすでに設定されている場合は、--project フラグを省略できます。
  • ROLE: ProjectServiceAccount に割り当てる事前定義ロール。ロールは Role/name 形式で指定します。ここで、Role は Kubernetes タイプ IAMRolename は事前定義ロールの名前です。たとえば、プロジェクト閲覧者のロールを割り当てるには、ロールを IAMRole/project-viewer に設定します。
  • ROLE_NAMESPACE: サービス アカウントにバインドするロールの名前空間。これは、ユニバースに複数のゾーンがある場合にのみ適用されます。
  • NAME: 使用するサービス ID の名前。

サービス ID を削除する

プロジェクト内のサービス アカウントを削除するには、GDC コンソールまたは gdcloud CLI を使用します。

サービス ID を削除すると、アプリケーションはそのサービス ID を使用してプロジェクト リソースにアクセスできなくなります。

コンソール

  1. GDC コンソールにログインします。
  2. ナビゲーション メニューで、[ID とアクセス] > [サービス ID] を選択します。
  3. 削除するサービス ID のチェックボックスをオンにします。
  4. [削除] をクリックします。
  5. 確認ダイアログが表示されます。[削除を確定するには、次の内容を入力してください] フィールドに「remove」と入力します。
  6. [削除] をクリックします。

gdcloud

次のコマンドを実行して、サービス ID を削除します。

gdcloud iam service-accounts delete NAME \
    --project=PROJECT

鍵ペアを作成して追加する

プロジェクトで鍵ペアを作成して追加するには、GDC コンソール、gdcloud CLI、または API を使用します。

コンソール

  1. GDC コンソールにログインします。
  2. ナビゲーション メニューで、[ID とアクセス] > [サービス ID] を選択します。
  3. キーに追加するサービス ID の名前をクリックします。
  4. [新しいキーを作成] をクリックします。
  5. 新しいキーが [キー] リストに表示され、キーが正常に作成されたことを確認するダイアログが表示されます。

gdcloud

gdcloud コマンドは、アプリケーションのデフォルト認証情報の JSON ファイルと公開鍵と秘密鍵のペアを作成します。

gdcloud iam service-accounts keys create APPLICATION_DEFAULT_CREDENTIALS_FILENAME \
    --project=PROJECT \
    --iam-account=NAME \
    --ca-cert-path=CA_CERTIFICATE_PATH

次の値を置き換えます。

  • APPLICATION_DEFAULT_CREDENTIALS_FILENAME: JSON ファイルの名前。
  • PROJECT : 鍵を作成するプロジェクトを選択します。gdcloud init がすでに設定されている場合は、--project フラグを省略できます。
  • NAME: 鍵を追加するサービス ID の名前。
  • CA_CERTIFICATE_PATH: 省略可。認証エンドポイントを検証するための認証局(CA)証明書のパス。このパスを指定しない場合、システム CA 証明書が使用されます。CA はシステムの CA 証明書にインストールする必要があります。

Distributed Cloud は、秘密鍵が署名する JSON ウェブトークン(JWT)の検証に使用する ProjectServiceAccount 鍵に公開鍵を追加します。秘密鍵は、アプリケーションのデフォルト認証情報の JSON ファイルに書き込まれます。

次の例は、アプリケーションのデフォルト認証情報の JSON ファイルを示しています。

{
"type": "gdch_service_account",
"format_version": "1",
"project": "project_name",
"private_key_id": "abcdef1234567890",
"private_key": "-----BEGIN PRIVATE KEY-----\nETC\n-----END PRIVATE KEY-----\n",
"name": "service_identity_name",
"ca_cert_path": "service_identity_name",
"token_uri": "https://service-identity.<Domain>/authenticate"
}

この例では次の値を使用します。

  • project: 組織内のプロジェクト名前空間。
  • private_key_id: 鍵に割り当てられた ID。
  • private_key: CLI が生成する PEM 形式の ECDSA P256 秘密鍵。
  • name: サービス ID の名前。
  • token_uri: 認証エンドポイントのアドレス。

API

  1. 公開鍵と秘密鍵のペアを生成します。次のコマンドでは、この目的でよく使用されるツールである openssl を例として使用します。

    openssl ecparam -name prime256v1 -genkey -noout -out "key.pem"
    openssl ec -in "key.pem" -pubout > "pub.pem"
    
  2. 公開鍵を Base64 でエンコードし、鍵 ID を取得します。

    KEY_ID=$(openssl pkey -in key.pem -pubout -outform der | openssl dgst -sha256 | sed 's/^.* //')
    BASE64_ENCODED_KEY=$(cat pub.pem | base64)
    
  3. 前の手順で生成したキー情報を含めて、ProjectServiceAccount カスタム リソース YAML ファイルを作成または更新します。

    apiVersion: resourcemanager.global.gdc.goog/v1
    kind: ProjectServiceAccount
    metadata:
      name: NAME
      namespace: PROJECT
    spec:
      keys:
      - algorithm: ALGORITHM
      id: KEY_ID
      key: BASE64_ENCODED_KEY
      validAfter: "START_TIME"
      validBefore: "EXPIRATION_TIME"
    

    次の変数を置き換えます。

    • NAME: ProjectServiceAccount リソースの名前。この名前はプロジェクトの Namespace 内で一意である必要があります。
    • PROJECT: 鍵を作成するプロジェクト。
    • ALGORITHM: 鍵のアルゴリズム。ES256 鍵のみがサポートされています。
    • KEY_ID: 鍵の固有識別子。この ID は、検証に使用する鍵を特定するために使用されます。
    • BASE64_ENCODED_KEY: 照合する PEM 形式の Base64 エンコードされた公開鍵。この公開鍵の生成に使用される秘密鍵は、ECDSA P256 PEM 形式で指定する必要があります。
    • START_TIME: キーが有効になる開始時間(2025-02-07T00:59:34Z など)。
    • EXPIRATION_TIME: 鍵の有効期限(2026-02-07T00:59:34Z など)。
  4. ProjectServiceAccount カスタム リソースをグローバル API サーバーに適用します。

    kubectl --kubeconfig GLOBAL_API_SERVER_KUBECONFIG apply -f my-project-sa.yaml
    

    GLOBAL_API_SERVER_KUBECONFIG 変数を、グローバル API サーバーの kubeconfig ファイルへのパスに置き換えます。

  5. 秘密鍵を含むアプリケーションのデフォルト認証情報の JSON ファイルを作成します。JSON ファイルの KEY_ID 変数が、ProjectServiceAccount 仕様で使用した KEY_ID 変数と同じ値に設定されていることを確認します。

    cat <<EOF > "key_file.json"
    {
      "format_version": "1",
      "name": "NAME",
      "private_key": "$(tr '\n' '\t' < "key.pem" | sed 's/\t/\\n/g')",
      "private_key_id": "KEY_ID",
      "project": "PROJECT",
      "token_uri": "AUTH_URL",
      "type": "gdch_service_account"
    }
    EOF
    

    次の変数を置き換えます。

    • NAME: サービス ID の名前。
    • KEY_ID: 鍵の固有識別子。この ID は、検証に使用する鍵を特定するために使用されます。また、ProjectServiceAccount 仕様で使用される KEY_ID 値と一致する必要があります。
    • PROJECT: 組織内のプロジェクト Namespace。
    • AUTH_URL: 認証エンドポイントのアドレス。
  6. サービス アカウントを有効にして、鍵ペアをプロジェクトに追加します。

    gdcloud auth activate-service-account –-key-file=key_file.json
    

サービス アカウントの認証情報を一覧表示する

プロジェクト内の特定の ProjectServiceAccount から公開鍵を一覧表示します。

gdcloud iam service-accounts keys list \
    --project=PROJECT \
    --iam-account=NAME

認証情報を削除

公開鍵を削除するには、GDC コンソールまたは gdcloud CLI を使用します。

コンソール

  1. GDC コンソールにログインします。
  2. ナビゲーション メニューで、[ID とアクセス] > [サービス ID] を選択します。
  3. 削除する鍵があるサービス ID の名前をクリックします。
  4. [削除] をクリックします。
  5. 確認ダイアログで [削除] をクリックします。

gdcloud

鍵 ID を使用して、プロジェクトの特定の ProjectServiceAccount から公開鍵を削除します。

gdcloud iam service-accounts keys delete KEY_ID \
    --project=PROJECT \
    --iam-account=NAME

サービス アカウント キーを使用してサービス アカウントを承認する

gdcloud コマンドを使用して、サービス アカウント キーを使用してサービス アカウントを有効にできます。

  1. サービス アカウント キー ファイルがまだない場合は、作成します

  2. 次のコマンドを実行して、サービス アカウントを有効にします。

    gdcloud auth activate-service-account --key-file=KEY_FILE
    

    KEY_FILE は、サービス アカウント キーファイルのパスに置き換えます。

    サービス アカウントを有効にすると、gdcloud はユーザー認証情報ではなく、サービス アカウントの認証情報を後続のコマンドで使用します。