サービス アカウントキーの作成と管理

このページでは、Google Cloud Platform Console、gcloud コマンドライン ツールCloud Identity and Access Management API、いずれかの Google Cloud クライアント ライブラリを使用して、サービス アカウント キーの作成と管理を行う方法について説明します。

このガイドの前提条件

必要な権限

ユーザーがサービス アカウント キーを管理できるようにするには、サービス アカウント キー管理者の役割roles/iam.serviceAccountKeyAdmin)を付与します。Cloud IAM の基本の役割には、サービス アカウント キーを管理するための権限も含まれていますが、他の GCP リソースへの不要なアクセスを防止するために、この役割を付与することをおすすめします。

サービス アカウントに関連する役割の詳細については、サービス アカウントの役割をご覧ください。

サービス アカウント キーの作成

他のプラットフォームやオンプレミスなど GCP の外部でサービス アカウントを使用するには、最初にサービス アカウントの ID を確立する必要があります。これには、公開鍵/秘密鍵のペアを使用します。

GCP Console、gcloud ツール、serviceAccounts.keys.create() メソッド、いずれかのクライアント ライブラリを使用して、サービス アカウント キーを作成できます。

以下の例では、[SA-NAME] はサービス アカウントの名前、[PROJECT-ID] は Google Cloud Platform プロジェクトの ID です。[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com 文字列は、GCP Console の [サービス アカウント] ページから取得できます。

Console

  1. GCP Console で [IAM と管理] ページを開きます。

    [IAM と管理] ページを開く

  2. プロジェクトを選択し、[続行] をクリックします。

  3. 左側のナビゲーション メニューで [サービス アカウント] をクリックします。

  4. キーを作成するサービス アカウントを見つけ、その行の [詳細] more_vert ボタンをクリックして、[キーを作成] をクリックします。

  5. [キーのタイプ] を選択して、[作成] をクリックします。

gcloud コマンド

gcloud iam service-accounts keys create コマンドを実行して、サービス アカウント キーを作成します。

コマンド:

gcloud iam service-accounts keys create ~/key.json
  --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

出力:

created key [e44da1202f82f8f4bdd9d92bc412d1d8a837fa83] of type [json] as
[/usr/home/username/key.json] for
[SA-NAME@PROJECT-ID.iam.gserviceaccount.com]

REST API

リクエスト:

POST https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com/keys

レスポンス:

{
    "name":"projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
    "privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE",
    "privateKeyData":"MIIJqAIB . . .",
    "validBeforeTime": "2028-05-08T21:00:00Z",
    "validAfterTime": "2016-01-25T18:38:09.000Z",
    "keyAlgorithm": "KEY_ALG_RSA_2048"
}

C#

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の C# の設定手順に従ってください。詳細については、Cloud IAM C# API のリファレンス ドキュメントをご覧ください。

using System;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class ServiceAccountKeys
{
    public static ServiceAccountKey CreateKey(string serviceAccountEmail)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var key = service.Projects.ServiceAccounts.Keys.Create(
            new CreateServiceAccountKeyRequest(),
            "projects/-/serviceAccounts/" + serviceAccountEmail)
            .Execute();
        Console.WriteLine("Created key: " + key.Name);
        return key;
    }
}

Go

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の Go の設定手順に従ってください。詳細については、Cloud IAM Go API のリファレンス ドキュメントをご覧ください。

import (
	"context"
	"fmt"
	"io"

	"golang.org/x/oauth2/google"
	iam "google.golang.org/api/iam/v1"
)

// createKey creates a service account key.
func createKey(w io.Writer, serviceAccountEmail string) (*iam.ServiceAccountKey, error) {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return nil, fmt.Errorf("iam.New: %v", err)
	}

	resource := "projects/-/serviceAccounts/" + serviceAccountEmail
	request := &iam.CreateServiceAccountKeyRequest{}
	key, err := service.Projects.ServiceAccounts.Keys.Create(resource, request).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Keys.Create: %v", err)
	}
	fmt.Fprintf(w, "Created key: %v", key.Name)
	return key, nil
}

Java

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の Java の設定手順に従ってください。詳細については、Cloud IAM Java API のリファレンス ドキュメントをご覧ください。

public ServiceAccountKey createKey(String serviceAccountEmail) throws IOException {

  ServiceAccountKey key =
      service
          .projects()
          .serviceAccounts()
          .keys()
          .create(
              "projects/-/serviceAccounts/" + serviceAccountEmail,
              new CreateServiceAccountKeyRequest())
          .execute();

  System.out.println("Created key: " + key.getName());
  return key;
}

Python

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。詳細については、Cloud IAM Python API のリファレンス ドキュメントをご覧ください。

def create_key(service_account_email):
    """Creates a key for a service account."""

    # pylint: disable=no-member
    key = service.projects().serviceAccounts().keys().create(
        name='projects/-/serviceAccounts/' + service_account_email, body={}
        ).execute()

    print('Created key: ' + key['name'])

privateKeyData は、JSON または P12 キー / 認証情報を base64 エンコードの文字列表現で返します。

サービス アカウント キーを作成すると、新しい公開鍵 / 秘密鍵のペアが生成され、マシンにダウンロードされます。これは秘密鍵の唯一のコピーとして機能します。この秘密鍵は、お客様の責任で安全に保管する必要があります。その場所をメモし、アプリケーションがこの秘密鍵にアクセスできるようにします。この秘密鍵は、アプリケーションが認証 API 呼び出しを実行する際に必要となります。

新しく作成されたキーが認証に使用できるようになるまでに最長で 60 秒かかります。新しいキーを作成した直後に認証に失敗した場合は、60 秒以上経過してから再試行してください。

キーの形式は、生成方法によって異なる場合があります。GCP Console または gcloud コマンドライン ツールを使用して作成したキーは次のようになります。

{
"type": "service_account",
"project_id": "[PROJECT-ID]",
"private_key_id": "[KEY-ID]",
"private_key": "-----BEGIN PRIVATE KEY-----\n[PRIVATE-KEY]\n-----END PRIVATE KEY-----\n",
"client_email": "[SERVICE-ACCOUNT-EMAIL]",
"client_id": "[CLIENT-ID]",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/[SERVICE-ACCOUNT-EMAIL]"
}

REST API またはクライアント ライブラリで生成したキーは次のようになります。

{
"name": "projects/[PROJECT-ID]/serviceAccounts/[SERVICE-ACCOUNT-EMAIL]/keys/[KEY-ID]",
"privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE",
"privateKeyData": "[PRIVATE-KEY]",
"validAfterTime": "[DATE]",
"validBeforeTime": "[DATE]",
"keyAlgorithm": "KEY_ALG_RSA_2048"
}

各メソッド間で書式が異なるため、将来 API 呼び出しを行うときに使用するのと同じメソッドを使用してキーを生成するのが最も簡単です。たとえば、gcloud を使用している場合、gcloud を使用してキーをも生成します。別のメソッドを使用して(たとえば、gcloud で REST で生成されたキーを使用して)生成されたあるメソッドに対してキーを使用するには、適切な書式と一致するようにキーを編集する必要があります。

Google は、すべてのサービス アカウントのすべての公開鍵に誰でもアクセスできるようにしており、秘密鍵を使って作成された署名の検証に公開鍵を使用できます。公開鍵は次の URL で公開されています。

  • x.509 証明書: https://www.googleapis.com/service_accounts/v1/metadata/x509/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
  • JSON ウェブキー(JWK): https://www.googleapis.com/service_accounts/v1/jwk/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
  • RAW エンドポイント: https://www.googleapis.com/service_accounts/v1/metadata/raw/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

サービス アカウント キーの一覧表示

GCP Console、gcloud ツール、serviceAccount.keys.list() メソッド、いずれかのクライアント ライブラリを使用して、サービス アカウントのサービス アカウント キーを一覧表示できます。

serviceAccount.keys.list() メソッドは、サービス アカウントとキーの監査や、サービス アカウント管理用のカスタムツールの作成に広く使用されています。

キーの所属先プロジェクトを確認するには、キーを JSON ファイルとしてダウンロードし、そのファイルの内容を確認します。

作成していないキーが一覧表示されることがあります。これは、App Engine や Compute Engine などの GCP サービスで使用される GCP 管理キーです。ユーザーキーと GCP 管理キーの違いの詳細については、サービス アカウントについてをご覧ください。

Console

  1. GCP Console で [IAM と管理] ページを開きます。

    [IAM と管理] ページを開く

  2. プロジェクトを選択し、[続行] をクリックします。

  3. 左側のナビゲーション メニューで [サービス アカウント] をクリックします。すべてのサービス アカウントと対応するキーが一覧表示されます。

gcloud コマンド

gcloud iam service-accounts keys list コマンドを実行して、サービス アカウント キーの一覧を表示します。

コマンド:

gcloud iam service-accounts keys list
  --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

出力:

KEY_ID CREATED_AT EXPIRES_AT
8e6e3936d7024646f8ceb39792006c07f4a9760c 2016-01-26T21:01:42.000Z 2026-01-23T21:01:42.000Z
937c98f870f5c8db970af527aa3c12fd88b1c20a 2016-01-26T20:55:40.000Z 2026-01-23T20:55:40.000Z

REST API

リクエスト:

POST https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com/keys

レスポンス:

{
    "keys": [
    {
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
        "validAfterTime": "2016-01-25T18:38:09.000Z",
        "validBeforeTime": "2026-01-22T18:38:09.000Z",
        "keyAlgorithm": "KEY_ALG_RSA_2048"
    },
    {
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/e5e3800831ac1adc8a5849da7d827b4724b1fce8",
        "validAfterTime": "2016-01-25T13:43:27.000Z",
        "validBeforeTime": "2016-01-26T13:43:27.000Z",
        "keyAlgorithm": "KEY_ALG_RSA_2048"
    },
    {
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/b97699f042b8eee6a846f4f96259fbcd13e2682e",
        "validAfterTime": "2016-01-26T13:28:27.000Z",
        "validBeforeTime": "2016-01-27T13:28:27.000Z",
        "keyAlgorithm": "KEY_ALG_RSA_2048"
    }]
}

C#

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の C# の設定手順に従ってください。詳細については、Cloud IAM C# API のリファレンス ドキュメントをご覧ください。

using System;
using System.Collections.Generic;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class ServiceAccountKeys
{
    public static IList<ServiceAccountKey> ListKeys(string serviceAccountEmail)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var response = service.Projects.ServiceAccounts.Keys
            .List($"projects/-/serviceAccounts/{serviceAccountEmail}")
            .Execute();
        foreach (ServiceAccountKey key in response.Keys)
        {
            Console.WriteLine("Key: " + key.Name);
        }
        return response.Keys;
    }
}

Go

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の Go の設定手順に従ってください。詳細については、Cloud IAM Go API のリファレンス ドキュメントをご覧ください。

import (
	"context"
	"fmt"
	"io"

	"golang.org/x/oauth2/google"
	iam "google.golang.org/api/iam/v1"
)

// listKey lists a service account's keys.
func listKeys(w io.Writer, serviceAccountEmail string) ([]*iam.ServiceAccountKey, error) {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return nil, fmt.Errorf("iam.New: %v", err)
	}

	resource := "projects/-/serviceAccounts/" + serviceAccountEmail
	response, err := service.Projects.ServiceAccounts.Keys.List(resource).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Keys.List: %v", err)
	}
	for _, key := range response.Keys {
		fmt.Fprintf(w, "Listing key: %v", key.Name)
	}
	return response.Keys, nil
}

Java

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の Java の設定手順に従ってください。詳細については、Cloud IAM Java API のリファレンス ドキュメントをご覧ください。

public List<ServiceAccountKey> listKeys(String serviceAccountEmail) throws IOException {

  List<ServiceAccountKey> keys =
      service
          .projects()
          .serviceAccounts()
          .keys()
          .list("projects/-/serviceAccounts/" + serviceAccountEmail)
          .execute()
          .getKeys();

  for (ServiceAccountKey key : keys) {
    System.out.println("Key: " + key.getName());
  }
  return keys;
}

Python

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。詳細については、Cloud IAM Python API のリファレンス ドキュメントをご覧ください。

def list_keys(service_account_email):
    """Lists all keys for a service account."""

    # pylint: disable=no-member
    keys = service.projects().serviceAccounts().keys().list(
        name='projects/-/serviceAccounts/' + service_account_email).execute()

    for key in keys['keys']:
        print('Key: ' + key['name'])

サービス アカウントの取得

サービス アカウント キーの秘密鍵を取得できるのは、キーが最初に作成されるときのみです。

キーの基本情報(ID、アルゴリズム、公開鍵データなど)は、projects.serviceAccounts.keys.get() REST API メソッドを使用して取得できます。GCP Console や gcloud コマンドライン ツールの使用はサポートされていません。

サービス アカウントキーの削除

GCP Console、gcloud ツール、serviceAccount.keys.delete() メソッド、いずれかのクライアント ライブラリを使用して、サービス アカウント キーを削除できます。

サービス アカウント キーを削除すると、アプリケーションはそのキーを使用して Cloud Platform リソースにアクセスできなくなります。セキュリティの観点から推奨されるベスト プラクティスは、サービス アカウント キーを定期的にローテーションする方法です。キーをローテーションするには、新しいキーを作成し、新しいキーを使用するようにアプリケーションを切り替えてから、古いキーを削除します。serviceAccount.keys.create() メソッドと serviceAccount.keys.delete() メソッドを組み合わせて使用すると、ローテーションを自動化できます。

Console

  1. GCP Console で [IAM と管理] ページを開きます。

    [IAM と管理] ページを開く

  2. プロジェクトを選択し、[続行] をクリックします。

  3. 左側のナビゲーション メニューで [サービス アカウント] をクリックします。すべてのサービス アカウントと対応するキーが一覧表示されます。

  4. 目的のサービス アカウントのメールアドレスをクリックして、キーを表示します。

  5. キーの一覧で、削除するキーの [削除] delete をクリックします。

gcloud コマンド

gcloud iam service-accounts keys delete コマンドを実行して、サービス アカウント キーを削除します。

コマンド:

gcloud iam service-accounts keys delete [KEY-ID]
  --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

出力:

Deleted key [8e6e3936d7024646f8ceb39792006c07f4a9760c] for
service account [SA-NAME@PROJECT-ID.iam.gserviceaccount.com]

REST API

リクエスト:

DELETE https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com/keys/[KEY-ID]

C#

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の C# の設定手順に従ってください。詳細については、Cloud IAM C# API のリファレンス ドキュメントをご覧ください。

using System;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class ServiceAccountKeys
{
    public static void DeleteKey(string fullKeyName)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        service.Projects.ServiceAccounts.Keys.Delete(fullKeyName).Execute();
        Console.WriteLine("Deleted key: " + fullKeyName);
    }
}

Go

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の Go の設定手順に従ってください。詳細については、Cloud IAM Go API のリファレンス ドキュメントをご覧ください。

import (
	"context"
	"fmt"
	"io"

	"golang.org/x/oauth2/google"
	iam "google.golang.org/api/iam/v1"
)

// deleteKey deletes a service account key.
func deleteKey(w io.Writer, fullKeyName string) error {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return fmt.Errorf("iam.New: %v", err)
	}

	_, err = service.Projects.ServiceAccounts.Keys.Delete(fullKeyName).Do()
	if err != nil {
		return fmt.Errorf("Projects.ServiceAccounts.Keys.Delete: %v", err)
	}
	fmt.Fprintf(w, "Deleted key: %v", fullKeyName)
	return nil
}

Java

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の Java の設定手順に従ってください。詳細については、Cloud IAM Java API のリファレンス ドキュメントをご覧ください。

public void deleteKey(String fullKeyName) throws IOException {

  service.projects().serviceAccounts().keys().delete(fullKeyName).execute();

  System.out.println("Deleted key: " + fullKeyName);
}

Python

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。詳細については、Cloud IAM Python API のリファレンス ドキュメントをご覧ください。

def delete_key(full_key_name):
    """Deletes a service account key."""

    # pylint: disable=no-member
    service.projects().serviceAccounts().keys().delete(
        name=full_key_name).execute()

    print('Deleted key: ' + full_key_name)

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Identity and Access Management のドキュメント