サービス アカウント

このページでは、Compute Engine でのサービス アカウントの動作について説明します。

サービス アカウントの作成方法と使用方法の詳細については、インスタンスのサービス アカウントの作成と有効化のドキュメントをご覧ください。

以下のドキュメントで、サービス アカウントの使用と保護に関するベスト プラクティスについて説明しています。

使ってみる

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

Compute Engine の無料トライアル

サービス アカウントとは

サービス アカウントは、ユーザーではなく、アプリケーションやコンピューティング ワークロードで使用される特別なアカウントです。サービス アカウントは Identity and Access Management(IAM)によって管理されます。

Compute Engine のサービス アカウントの使用方法

Compute Engine では、次の 2 種類のサービス アカウントを使用します。

ユーザー管理のサービス アカウントは、Compute Engine インスタンスに接続して、インスタンス上で実行されるアプリケーションに認証情報を提供できます。これらの認証情報は、アプリケーションが Google Cloud API に対する認証と Google Cloud リソースへのアクセスの認可に使用されます。インスタンスに接続できるのはユーザー管理サービス アカウントのみです。インスタンスに関連付けることができるサービス アカウントは 1 つのみです。インスタンスの作成時またはそれ以降にインスタンスに接続されたサービス アカウントを変更できます。

インスタンスが内部プロセスにアクセスするために、Google 管理サービス アカウントを使用します。

さらに、各インスタンスに関連付けられたサービス アカウントに基づいて、インスタンスの上り / 下りトラフィックを許可または拒否するファイアウォール ルールを作成することもできます。

承認の決定方法

Compute Engine インスタンスでホストされているアプリケーションに提供される承認は、次の 2 つの別個の構成によって制限されます: 関連付けられているサービス アカウントに付与されたロールおよびアクセス スコープインスタンス上で設定したインスタンス。インスタンスで実行されているアプリケーションがリソースにアクセスするには、どちらの構成でもアクセスを許可する必要があります。

Cloud Storage 上のファイルの読み取りと書き込みを行うアプリがある場合は、最初に Cloud Storage API に対する認証を行う必要があります。cloud-platform スコープを持つインスタンスを作成し、そのインスタンスにサービス アカウントを接続できます。サービス アカウントに IAM の役割を付与すると、アプリに適切なリソースへのアクセス権を付与できます。アプリはサービス アカウントの認証情報を使用して Cloud Storage API に対する認証を行います。インスタンス、画像、アプリコードには秘密鍵やユーザー認証情報を埋め込まれません。アプリはサービス アカウントの IAM ロールによって提供される承認を使用して、リソースにアクセスします。承認の詳細については、このページの承認をご覧ください。

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

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

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

独自のサービス アカウントを作成して管理するには、IAM を使用します。アカウントを作成したら、アカウントに IAM のロールを付与し、サービス アカウントとして実行されるようにインスタンスを設定します。サービス アカウントが接続されているインスタンスでは、他の Google API にリクエストを送信できます。

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

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

Compute Engine API を有効にした新しいプロジェクトには、Compute Engine のデフォルトのサービス アカウントがあり、このアカウントには次のメールアドレスが設定されます。

PROJECT_NUMBER-compute@developer.gserviceaccount.com

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

Compute Engine のデフォルトのサービス アカウントには IAM 基本編集者ロールが付与されていますが、サービス アカウントのロールを変更し、そのサービス アカウントからアクセスできる Google API を制御できます。

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

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

  • 自動的に生成された名前とメールアドレスで作成され、Compute Engine API を有効にするときにプロジェクトに追加されます。
  • この動作を無効にしていない場合、IAM 基本編集者のロールが自動的に付与されます。
  • デフォルトで、Google Cloud CLI と Cloud Console で作成されたすべてのインスタンスに接続されます。この動作は、インスタンスの作成時に別のサービス アカウントを指定するか、またはインスタンスにサービス アカウントを接続しないことを明示的に指定することでオーバーライドできます。

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

これらのサービス アカウントサービス エージェントとも呼ばれます)は、Google によって作成、管理され、プロジェクトに自動的に割り当てられます。これらのアカウントは複数の Google サービスに相当し、各アカウントには Google Cloud プロジェクトに対する一定レベルのアクセス権があります。

Google が管理するサービス アカウントは、Compute Engine インスタンスに接続できません。

Google API サービス エージェント

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

PROJECT_NUMBER@cloudservices.gserviceaccount.com

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

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

このような理由から、ロールの推奨事項で推奨されていない限り、このサービス アカウントのロールは変更しないようにしてください。

Compute Engine サービス エージェント

Compute Engine API が有効になっているプロジェクトには、Compute Engine サービス エージェントがあります。このサービス エージェントには次のメールアドレスが設定されます。

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

このサービス アカウントは、Compute Engine がプロジェクトでサービス作業を実行するための専用のアカウントとして設計されたものです。これは、Google Cloud プロジェクトに付与されたサービス エージェントの IAM ポリシーに依存しています。また、VM インスタンス上でお客様が所有するサービス アカウントに Compute Engine がアクセスする際に使用するサービス アカウントでもあります。Google はこのアカウントを所有していますが、このアカウントはプロジェクトに固有のものです。[Google 提供のロール付与を含みます] を選択しない限り、このアカウントはコンソールの IAM ページに表示されません。デフォルトでは、このアカウントにはプロジェクトの compute.serviceAgent ロールが自動的に付与されます。

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

このような理由から、このサービス アカウントのロールはできる限り変更しないようにしてください。

サービス アカウントとインスタンスの接続

アプリケーションに過剰な権限を与えることを防ぐため、ユーザー管理のサービス アカウントを作成してアプリケーションの適切な機能に必要なロールのみを付与し、そのアカウントを Compute Engine インスタンスに接続することをおすすめします。その後、コードはアプリケーションのデフォルト認証情報を使用して、サービス アカウントが提供する認証情報で認証します。

サービス アカウントは、インスタンスを作成するときに Compute Engine インスタンスに接続できます。また、後で接続することもできます。インスタンスにアタッチできるサービス アカウントは 1 つのみです。サービス アカウントがすでに接続されているインスタンスにサービス アカウントを接続すると、以前のサービス アカウントはそのインスタンスで使用されなくなります。

サービス アカウントを Compute Engine インスタンスに接続する場合は、インスタンスに設定されているスコープが正しいことも確認する必要があります。そうしないと、アプリが必要とするすべての API にアクセスできない場合があります。詳しくは、このページのアクセス制御をご覧ください。

Compute Engine インスタンスへのサービス アカウントの接続については、インスタンスのサービス アカウントの作成と有効化をご覧ください。

承認

サービス アカウントとして実行されるように新しいインスタンスを設定する際には、サービス アカウントに付与する IAM ロールによって、サービス アカウントのアクセスレベルを指定します。サービス アカウントに IAM ロールが付与されていない場合、そのインスタンス上でサービス アカウントを使用してアクセスできるリソースはありません。

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

インスタンスで完全な cloud-platform アクセス スコープを設定し、IAM ロールを使用してサービス アカウントのアクセス権を管理することをおすすめします。

以下は基本です。

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

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

IAM ロール

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

たとえば、サービス アカウントに、Cloud Storage オブジェクトの管理や Cloud Storage バケットの管理などを行うための IAM ロールを付与し、それらのロールによって付与される権限にアカウントの権限を制限できます。

サービス アカウントに IAM ロールを付与すると、そのサービス アカウントが接続されているインスタンスで実行されるアプリケーションには、そのロールによって付与される承認が割り当てられます。

次の点にご注意ください:

  • 一部の IAM ロールは現在ベータ版です。

    必要なアクセスレベルに事前定義されたロールがない場合は、カスタムロールを作成して付与できます。

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

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

アクセス スコープ

アクセス スコープは、インスタンスの承認を指定するレガシーな方法です。これらは、gcloud CLI またはクライアント ライブラリからのリクエストで使用されるデフォルトの OAuth スコープを定義します。(アクセス スコープは、gRPC を使用して行われた呼び出しには適用されません)。

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

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

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

デフォルトのスコープ

新しい Compute Engine インスタンスを作成すると、次のアクセス スコープが自動的に構成されます。

  • 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
  • Cloud Trace への書き込みアクセス権により、VM 上で実行されているアプリケーションは、トレースデータをプロジェクトに書き込むことができます。
    https://www.googleapis.com/auth/trace.append

スコープのベスト プラクティス

使用可能なアクセス スコープは多数ありますが、ベスト プラクティスは cloud-platform アクセス スコープを設定することです。これは、ほとんどの Google Cloud の OAuth スコープです。サービス アカウントに IAM ロールを付与し、サービス アカウントのアクセス権を制御できます。

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

スコープの例

インスタンスで cloud-platform アクセス スコープを有効にして、次の事前定義された IAM ロールを付与した場合は、スコープのベスト プラクティスに従います。

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

この場合、サービス アカウントには、この 3 つの IAM ロールに含まれる権限のみが付与されます。そのサービス アカウントに成り代わるアプリケーションは、Google Cloud のアクセス スコープにかかわらず、これらのロールのスコープ外のアクションは実行できません。

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

アクセス スコープの例は次のとおりです。

  • https://www.googleapis.com/auth/cloud-platform。指定した Google Cloud プロジェクトのほとんどの Google Cloud サービスのデータを表示して管理します。
  • https://www.googleapis.com/auth/compute。Compute Engine メソッドに対するフル コントロール アクセス権。
  • https://www.googleapis.com/auth/compute.readonly。Compute Engine メソッドに対する読み取り専用アクセス権。
  • https://www.googleapis.com/auth/devstorage.read_only。Cloud Storage に対する読み取り専用アクセス権。
  • https://www.googleapis.com/auth/logging.write。Compute Engine ログに対する書き込みアクセス権。

次のステップ