サービス アカウント

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

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

サービス アカウントとは

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

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

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

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

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

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

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

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

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

独自のサービス アカウントを作成して管理するには、Cloud Identity and Access Management を使用します。アカウントを作成したら、アカウントに IAM のロールを付与し、サービス アカウントとして実行されるようにインスタンスを設定します。サービス アカウントで有効になっているインスタンスで実行中のアプリは、アカウントの認証情報を使用して他の Google API にリクエストを送信できます。

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

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

新しいプロジェクトには Compute Engine のデフォルト サービス アカウントが付属しています。これは、次のメールで識別できます。

[PROJECT_NUMBER]-compute@developer.gserviceaccount.com

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

Compute Engine のデフォルトのサービス アカウントは Cloud IAM のプロジェクト エディタのロールで作成されますが、サービス アカウントのロールを変更して、サービス アカウントがアクセスできる Google API を安全に制限できます。

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

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

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

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

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

  • 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 Console を使用せずに、直接 API にリクエストしてインスタンスを作成すると、デフォルトのサービス アカウントはそのインスタンスで有効になりません。ただし、リクエスト ペイロードの一部として明示的に指定することで、デフォルトのサービス アカウントを有効にすることもできます。

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

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

Google API サービス アカウント

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

[PROJECT_NUMBER]@cloudservices.gserviceaccount.com

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

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

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

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

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

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

このサービス アカウントは、Compute Engine がプロジェクトでサービス作業を実行するための専用のアカウントとして設計されたものです。これは、Google Cloud プロジェクトに付与されたサービス エージェントの IAM ポリシーに依存しています。また、VM インスタンス上でお客様が所有するサービス アカウントに Compute Engine がアクセスする際に使用するサービス アカウントでもあります。Google はこのアカウントを所有していますが、プロジェクトに固有のアカウントであり、Cloud 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 アクセス スコープだけを設定することもできます。これは、すべての 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 ツールやクライアント ライブラリからのリクエストで Cloud Storage オブジェクトを管理することはできません。これは、Cloud Storage の読み取り専用スコープでは、インスタンスに Cloud Storage データの操作権限が認められないためです。

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

IAM ロール

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

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

IAM のロールはアカウント固有です。つまり、サービス アカウントに IAM ロールを付与すると、そのサービス アカウントで実行中のインスタンスはそのロールを使用できるようになります。以下の点に注意してください。

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

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

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

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

アクセス スコープ

アクセス スコープは、インスタンスの権限を指定するレガシーな方法です。アクセス スコープはセキュリティ メカニズムではなく、gcloud ツールまたはクライアント ライブラリからのリクエストで使用されるデフォルトの OAuth スコープを定義するものです。これは、gRPCSignBlob API など、OAuth を介して認証を受けないリクエストには影響しないことに注意してください。

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

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

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

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

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

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

次のステップ