サービス アカウント

このページでは、サービス アカウントとサービス アカウントの権限について説明します。これは、VM インスタンスに適用されるアクセス スコープとサービス アカウントに適用される Identity and Access Management(IAM)役割で制限できます。サービス アカウントの作成方法と使用方法の詳細については、インスタンスのサービス アカウントの作成と有効化のドキュメントを参照してください。

サービス アカウントとは、Compute Engine のインスタンス上で実行されるサービスやアプリケーションが他の Google Cloud Platform API と対話するために使用する特殊なアカウントです。アプリケーションではサービス アカウントの認証情報を使用して、一連の API に対し自身を認証します。認証されたアプリケーションは、サービス アカウントと仮想マシン インスタンスに付与された権限の範囲内でアクションを実行できます。さらに、各インスタンスに関連付けられたサービス アカウントに基づいて、インスタンスの上り / 下りトラフィックを許可または拒否するファイアウォール ルールを作成することもできます。

サービス アカウントとは

サービス アカウントとは、インスタンスまたはアプリケーションが API リクエストをユーザーの代わりに実行するために使用できる ID です。

この ID は、仮想マシン インスタンス上で実行されているアプリケーションを、他の Google Cloud Platform サービスと識別するために使用されます。たとえば、Google Cloud Storage 上でファイルの読み取り / 書き込みを行うアプリケーションを作成する場合、アプリケーションは最初に Google Cloud Storage API に対して認証を行う必要があります。サービス アカウントを作成し、サービス アカウントに Cloud Storage API へのアクセスを付与できます。次に、アプリケーション コードを更新し、サービス アカウント認証情報を Cloud Storage API に渡します。インスタンス、イメージ、アプリケーション コードに秘密鍵やユーザー認証情報を埋め込むことなく、アプリケーションは API に対してシームレスに認証します。

サービス アカウントでインスタンスやその他のリソースを作成して管理するには、そのサービス アカウントにこうした操作に必要な IAM 権限が割り当てられている必要があります。また、サービス アカウントでリソースを変更または削除できるのは、そのサービス アカウントに、プロジェクト レベルまたはリソースレベルで変更や削除の操作に必要な IAM 権限を付与した場合のみです。インスタンスに関連付けられているサービス アカウントは変更することもできます。

インスタンスには 1 つのサービス アカウントのみを関連付けることができます。インスタンスに関連付けるサービス アカウントは、そのインスタンスと同じプロジェクト内に作成されている必要があります。

Compute Engine インスタンスに使用可能なサービス アカウントには次の 2 種類があります。

  • ユーザー管理サービス アカウント
  • Google 管理サービス アカウント

ユーザー管理サービス アカウント

ユーザー管理サービス アカウントには、明示的に作成された新しいサービス アカウントと、Compute Engine のデフォルトのサービス アカウントが挙げられます。

新しいサービス アカウント

自分自身のサービス アカウントを、Google Identity and Access Management を使用して作成および管理できます。アカウントを作成したら、アカウントに IAM の役割を付与し、サービス アカウントとして実行されるようにインスタンスを設定します。サービス アカウントによって有効になったインスタンス上で実行されるアプリケーションは、他の Google API へのリクエストを行うために、アカウントの認証情報を使用できます。

新しいサービス アカウントを作成して設定する方法は、インスタンスのサービス アカウントの作成と有効化をご覧ください。

Compute Engine のデフォルトのサービス アカウント

新しく作成されるプロジェクトには、Compute Engine のデフォルトのサービス アカウントがあらかじめ設定されます。このアカウントは、次のメールアドレスから特定できます。

[PROJECT_NUMBER]-compute@developer.gserviceaccount.com

Google では、Compute Engine のデフォルトのサービス アカウントを作成します。このアカウントはプロジェクトに自動的に追加されますが、ユーザー側で柔軟に管理できます。

Compute Engine のデフォルトのサービス アカウントには IAM プロジェクト編集者の役割が付与されていますが、サービス アカウントの役割を変更し、そのアカウントからアクセスできる Google API をより厳しく制限できます。

使用プロジェクトからサービス アカウントを削除することはできますが、それを行うと、サービス アカウントの認証情報に依存しているすべてのアプリケーションが使用できない原因となる可能性があります。Compute Engine のデフォルトのサービス アカウントを誤って削除してしまった場合、30 日以内であれば、アカウントの復元を試みることができます。詳しくは、サービス アカウントの作成と管理をご覧ください。

Compute Engine のデフォルトのサービス アカウントの特徴は次のとおりです。

  • Google Cloud Platform Console プロジェクトによって自動的に作成され、自動生成された名前とメールアドレスが割り当てられている。
  • プロジェクトに自動的に追加され、IAM プロジェクト編集者の役割が付与されます。
  • デフォルトでは、gcloud コマンドライン ツールと GCP Console で作成したすべてのインスタンスで有効になります。この設定は、インスタンスの作成時に別のサービス アカウントを指定するか、またはインスタンスのサービス アカウントを明示的に無効にすることでオーバーライドできます。

サービス アカウントとインスタンスの関連付け

gcloud コマンドライン ツールまたは Google Cloud Platform Console を使用してインスタンスを作成する場合、GCP API の呼び出し時にインスタンスが使用するサービス アカウントを指定できます。インスタンスには次のアクセス スコープが自動的に構成されます。

  • Google Cloud Storage に対する読み取り専用アクセス権:
    https://www.googleapis.com/auth/devstorage.read_only
  • Compute Engine ログに書き込むための書き込みアクセス権:
    https://www.googleapis.com/auth/logging.write
  • Google Cloud プロジェクトに指標データを公開するための書き込みアクセス権:
    https://www.googleapis.com/auth/monitoring.write
  • Google Cloud Endpoints に必要な Service Management 機能に対する読み取り専用アクセス権(アルファ版):
    https://www.googleapis.com/auth/service.management.readonly
  • Google Cloud Endpoints に必要な Service Control 機能に対する読み取り / 書き込みアクセス権(アルファ版):
    https://www.googleapis.com/auth/servicecontrol

アクセス スコープにより、クライアント ライブラリまたは gcloud からのリクエストにデフォルトの OAuth スコープが定義されます。このため、OAuth で認証を行う際に API メソッドへのアクセスが制限される可能性があります。ただし、gRPC などの他の認証プロトコルへの拡張は行われません。インスタンスに完全な cloud-platform アクセス スコープを設定し、サービス アカウントに IAM 役割を付与してサービス アカウントのアクセス権を制限することをおすすめします。詳しくは、サービス アカウントの権限をご覧ください。

gcloud コマンドライン ツールまたは Google Cloud Platform Console を使用しないで、API に直接リクエストを行ってインスタンスを作成すると、デフォルトのサービス アカウントはそのインスタンスで有効になりません。ただし、リクエスト ペイロードの一部として明示的に指定することで、デフォルトのサービス アカウントを有効にすることもできます。

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

これらのサービス アカウントは Google によって作成および管理され、自動的にプロジェクトに割り当てられます。これらのアカウントはさまざまな Google サービスを表し、各アカウントは Google Cloud Platform プロジェクトに一定のレベルでアクセスが可能です。

Google API サービス アカウント

デフォルトのサービス アカウントは別として、Compute Engine により有効にされたすべてのプロジェクトには、このメールを使用して識別な可能な Google API サービス アカウントが設定されています。

[PROJECT_NUMBER]@cloudservices.gserviceaccount.com

これは、Google の内部プロセスを実行するために特別に設計されたサービス アカウントです。アカウントの所有者は Google であり、GCP Console の [サービス アカウント] セクションには表示されません。デフォルトでは、このアカウントには自動的にそのプロジェクトの編集者の役割が付与され、GCP Console の [IAM] セクションに表示されます。このサービス アカウントが削除されるのは、プロジェクトが削除されたときだけです。ただし、プロジェクトへのすべてのアクセス権を取り消すなど、このアカウントに付与されている役割を変更することはできます。

一部のリソースは、このサービス アカウントに依存しており、デフォルトの編集者の権限がこのサービス アカウントに付与されています。たとえば、管理対象インスタンス グループと自動スケーリングでは、このアカウントの認証情報を使用して、インスタンスの作成、削除、管理が行われます。このサービス アカウントに対する権限を取り消すか、またはインスタンスの作成権限を付与しないように権限を変更すると、管理対象インスタンス グループと自動スケーリングが機能しなくなります。

このような理由から、このサービス アカウントの役割は変更しないでください。

Compute Engine System サービス アカウント

Compute Engine API が有効なすべてのプロジェクトには、Compute Engine System サービス アカウントがあります。このアカウントは、次のアドレスを使用して識別できます。

service-[PROJECT_NUMBER]@compute-system.iam.gserviceaccount.com

このサービス アカウントは、プロジェクトでサービスに関して必要な処理を実行するための Google Compute Engine 専用のサービス アカウントです。これは、Google Cloud プロジェクトに付与されたサービス エージェントの IAM ポリシーに依存しています。また、VM インスタンス上の顧客が所有するサービス アカウントにアクセスするために Compute Engine が使用するサービス アカウントでもあります。このアカウントを所有しているのは Google ですが、プロジェクトに固有であり、GCP Console の [サービス アカウント] および [IAM] セクションに表示されます。デフォルトでは、このアカウントには自動的にプロジェクトでの compute.serviceAgent の役割が付与されます。

このサービス アカウントは、プロジェクトを削除した場合にのみ削除されます。このアカウントに付与された役割を変更して、プロジェクトへのすべてのアクセスをアカウントから取り消すことができます。このサービス アカウントの権限を取り消すか変更すると、Compute Engine は VM 上のサービス アカウントの ID にアクセスできなくなり、VM 内で実行されているソフトウェアが停止する可能性があります。

このような理由から、このサービス アカウントの役割は変更しないでください。

サービス アカウント権限

サービス アカウントとして実行するインスタンスを設定する場合、サービス アカウントに IAM 役割を付与し、サービス アカウントのアクセスレベルを設定します。サービス アカウントに IAM 役割が付与されていない場合、そのサービス アカウントでインスタンスに実行できる API メソッドはありません。

さらに、インスタンスのアクセス スコープにより、gcloud ツールまたはクライアント ライブラリからインスタンスへのリクエストに対してデフォルトの OAuth スコープが定義されます。このため、OAuth で認証を行う際に API メソッドへのアクセスが制限される可能性があります。ただし、gRPC など、別の認証プロトコルへの拡張は行われません。

インスタンスに完全な cloud-platform アクセス スコープを設定し、サービス アカウントに IAM 役割を付与してサービス アカウントのアクセス権を制限することをおすすめします。

基本的なことをまとめると、次のようになります。

  • IAM は、サービス アカウントに付与された IAM 役割に基づいて API へのアクセスを制限します。
  • アクセス スコープにより、OAuth で認証を行う際に API メソッドへのアクセスが制限される可能性があります。

アクセス スコープと IAM の役割については、以降のセクションで詳しく説明します。

多くのアクセス スコープがありますが、cloud-platform アクセス スコープだけを設定することもできます。これは、すべての Cloud Platform サービスの OAuth スコープで、IAM 役割の付与により、サービス アカウントのアクセス権を制限します。

https://www.googleapis.com/auth/cloud-platform

たとえば、インスタンスで cloud-platform アクセス スコープを有効にし、次の事前定義の IAM 役割を付与します。

  • roles/compute.instanceAdmin.v1
  • roles/storage.objectViewer
  • roles/compute.networkAdmin

このサービス アカウントには、この 3 つの IAM 役割に含まれる権限のみが付与されます。そのアカウントでは、Cloud Platform のアクセス スコープにかかわらず、これらの役割のスコープ外の操作は実行できません。

逆に、Cloud Storage 読み取り専用スコープ(https://www.googleapis.com/auth/devstorage.read_only)など、より制限の厳しいスコープをインスタンスに付与し、サービス アカウントに roles/storage.objectAdmin 管理者役割を設定すると、デフォルトでは、gcloud ツールやクライアント ライブラリからのリクエストは、サービス アカウントに roles/storage.ObjectAdmin の役割が付与されている場合でも Google Cloud Storage のオブジェクトを管理できなくなります。これは、Cloud Storage の読み取り専用スコープでは、Cloud Storage データを操作するためのインスタンスが承認されないためです。

一般に、API メソッドのドキュメントには、そのメソッドで必要なスコープも記載されています。たとえば、instances.insert メソッドの場合、有効なスコープのリストが承認セクションで提供されます。

IAM 役割

サービス アカウントに関連する API メソッドへのアクセスを許可するには、該当する IAM 役割をサービス アカウントに付与する必要があります。

たとえば、Google Cloud Storage オブジェクトまたは Google Cloud Storage バケット(あるいは両方)を管理する IAM 役割をサービス アカウントに付与し、これらの役割によってアカウントの権限を制限できます。

IAM の役割はアカウント固有です。すなわち、サービス アカウントに IAM の役割を一旦付与すれば、そのサービス アカウントとして実行されるすべてのインスタンスはその役割を使用できます。また、注意すべき点は、

  • 一部の IAM の役割は現在ベータ版です。

    必要なアクセスレベルに事前に定義された IAM 役割が存在しない場合は、プロジェクト編集者などの基本役割のいずれかを付与できます。また、カスタム役割を作成して付与することもできます。

  • インスタンスにアクセス スコープを設定して、アクセス権限を承認する必要があります。

    サービス アカウントのアクセスレベルはそのアカウントに付与された IAM 役割で決まりますが、インスタンスのアクセス スコープは、gcloud ツールやクライアント ライブラリからインスタンスへのリクエストに対するデフォルトの OAuth スコープを定義します。このため、OAuth で認証を行う際に API メソッドへのアクセスが制限される可能性があります。

アクセス スコープ

アクセス スコープは、インスタンスの権限を指定するレガシーな方法です。アクセス スコープはセキュリティ メカニズムではありません。gcloud ツールまたはクライアント ライブラリからのリクエストで使用されるデフォルトの OAuth スコープを定義します。これは、gRPCSignBlob API など、OAuth 経由で認証されないリクエストに対して効果はありません。

サービス アカウントとして実行するインスタンスの構成時にアクセス スコープを設定する必要があります。

インスタンスに完全な cloud-platform アクセス スコープを設定し、サービス アカウントに IAM 役割を付与してサービス アカウントの API へのアクセス権を制限することをおすすめします。

アクセス スコープはインスタンス単位で適用されます。アクセス スコープは、インスタンスの作成時に設定し、インスタンスが存続期間中にのみ有効になります。

サービス アカウントが属するプロジェクトで関連 API が無効になっている場合、アクセス スコープは適用されません。たとえば、仮想マシン インスタンス上の Google Cloud Storage へのアクセス スコープを付与すると、プロジェクト上で Cloud Storage API を有効にしている場合のみ、インスタンスが Cloud Storage API を呼び出すことができます。

アクセス スコープの例を示します。

  • https://www.googleapis.com/auth/cloud-platform - すべての Google Cloud Platform リソースに対する完全アクセス権。
  • https://www.googleapis.com/auth/compute - Google Compute Engine のメソッドに対するフル コントロール アクセス権。
  • https://www.googleapis.com/auth/compute.readonly - Google Compute Engine メソッドに対する読み取り専用アクセス権。
  • https://www.googleapis.com/auth/devstorage.read_only - Google Cloud Storage に対する読み取り専用アクセス権。
  • https://www.googleapis.com/auth/logging.write - Google Compute Engine ログに対する書き込みアクセス権。

次のステップ

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

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

Compute Engine ドキュメント