サービス アカウント認証用のロール

プリンシパルは、いくつかの方法でサービス アカウントを使用した認証を行うことができます。それぞれの認証タイプで、プリンシパルにはサービス アカウントに対する特定の Identity and Access Management(IAM)権限が必要になります。

このページでは、サービス アカウントの権限を借用したり、サービス アカウントをリソースに接続するためにプリンシパルに付与できるロールについて説明します。また、一般的なシナリオで必要な権限についても説明します。

サービス アカウントを使用した認証を行う別の方法については、サービス アカウントの認証情報サービス アカウントの権限借用をご覧ください。

サービス アカウントのロール

このセクションでは、プリンシパルがサービス アカウントで認証できるようにするロールについて説明します。これらのロールを付与または取り消す方法については、サービス アカウントに対するアクセス権の管理をご覧ください。

サービス アカウント ユーザーのロール

サービス アカウント ユーザーのロール(roles/iam.serviceAccountUser)を使用すると、プリンシパルがサービス アカウントをリソースに関連付けることができます。そのリソースで実行されているコードで認証が必要な場合は、関連付けられているサービス アカウントの認証情報を取得できます。

このロールでは、プリンシパルはサービス アカウントに有効期間の短い認証情報を作成したり、Google Cloud CLI の --impersonate-service-account フラグを使用することはできません。これらのタスクを実行するには、サービス アカウントにサービス アカウント トークン作成者のロールが必要です。

サービス アカウント トークン作成者のロール

サービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を使用すると、プリンシパルはサービス アカウントに有効期間の短い認証情報を作成できます。

サービス アカウント トークン作成者のロールを使用すると、次のタイプの有効期間の短い認証情報を作成できます。

  • OAuth 2.0 アクセス トークン。Google API での認証に使用できます。
  • OpenID Connect(OIDC)ID トークン
  • 署名付き JSON Web Token(JWT)とバイナリ blob

また、サービス アカウント トークン作成者ロールを使用すると、プリンシパルは gcloud CLI で --impersonate-service-account フラグを使用できます。このフラグを使用すると、gcloud CLI によってサービス アカウントに有効期間の短い認証情報が自動的に作成されます。

このロールの権限は次のとおりです。

  • iam.serviceAccounts.getAccessToken: OAuth 2.0 アクセス トークンの作成
  • iam.serviceAccounts.getOpenIdToken: OpenID Connect(OIDC)ID トークンの作成
  • iam.serviceAccounts.implicitDelegation: サービス アカウントによる委任チェーンでのトークンの取得
  • iam.serviceAccounts.signBlob: バイナリ blob への署名
  • iam.serviceAccounts.signJwt: JWT への署名

サービス アカウントの OpenID Connect ID トークン作成者

サービス アカウントの OpenID Connect ID トークン作成者ロール(roles/iam.serviceAccountOpenIdTokenCreator)を使用すると、プリンシパルは有効期間の短い OIDC ID トークンを作成できます。OIDC ID トークンを作成するだけの場合は、このロールを使用します。他のタイプのトークンを作成する必要がある場合は、サービス アカウント トークン作成者ロールを使用してください。

このロールには、OIDC ID トークンを作成できる iam.serviceAccounts.getOpenIdToken 権限が含まれています。

Workload Identity ユーザーのロール

Workload Identity ユーザーのロール(roles/iam.workloadIdentityUser)を使用すると、プリンシパルは GKE ワークロードのサービス アカウントの権限を借用できます。

このロールの権限は次のとおりです。

  • iam.serviceAccounts.getAccessToken: OAuth 2.0 アクセス トークンの作成
  • iam.serviceAccounts.getOpenIdToken: OpenID Connect(OIDC)ID トークンの作成

一般的なシナリオのサービス アカウント権限

サービス アカウントはさまざまなシナリオで使用でき、それぞれに特定の権限が必要です。このセクションでは、一般的なシナリオと必要な権限について説明します。

サービス アカウントをリソースに関連付ける

サービス アカウントとして認証する長時間実行ジョブを開始する場合は、ジョブを実行するリソースにサービス アカウントを関連付ける必要があります。

権限:

  • リソースを作成する権限
  • iam.serviceAccounts.actAs

これらの権限を含むロールを検索するには、ロールリストで権限を検索します。

長時間実行ジョブをサービス アカウントとして実行できる複数の異なる Google Cloud リソースが存在します。こうしたリソースの例として次のものがあります。

  • Compute Engine VM
  • App Engine アプリ
  • Cloud Functions

これらのリソースを作成するときに、サービス アカウントを関連付けることもできます。このサービス アカウントは、リソースの ID として機能します。

リソースを作成してサービス アカウントを関連付けるには、そのリソースを作成する権限と、サービス アカウントをリソースに関連付ける権限が必要です。iam.serviceAccounts.actAs 権限を含むロールで提供されるリソースにサービス アカウントを接続する権限。例: サービス アカウント ユーザー ロール(roles/iam.serviceAccountUser)

リソースを作成し、サービス アカウントを関連付けると、リソースに対して長時間実行ジョブを開始できます。ジョブは、リソースに関連付けられたサービス アカウントとして実行され、そのサービス アカウントを使用して Google Cloud APIs へのリクエストを承認します。

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

サービス アカウントの権限借用

権限:

  • iam.serviceAccounts.getAccessToken
  • iam.serviceAccounts.signBlob
  • iam.serviceAccounts.signJwt
  • iam.serviceAccounts.implicitDelegation

ロール:

  • roles/iam.serviceAccountTokenCreator(サービス アカウント トークン作成者)

必要な権限が付与されると、いくつかの一般的なシナリオでは、ユーザー(または別のサービス アカウント)がサービス アカウントの権限を借用できます。

まず、ユーザーはサービス アカウントとして認証できます。たとえば、iam.serviceAccounts.getAccessToken 権限を使用し、generateAccessToken() メソッドを呼び出すことで、サービス アカウントの有効期間の短い認証情報を取得できます。gcloud CLI の --impersonate-service-account フラグを使用して、サービス アカウントの権限を借用することもできます。サービス アカウントとして認証されたユーザーは、Google Cloud にコマンドを発行し、サービス アカウントがアクセス権を持つすべてのリソースにアクセスできます。

次に、ユーザーは、iam.serviceAccounts.signBlob 権限を使用し、signBlob() または signJwt() メソッドを呼び出すことによって、サービス アカウントの Google が管理する秘密鍵で署名されたアーティファクトを取得できます。Google が管理する秘密鍵は常にエスクローに保管され、直接公開されることはありません。signBlob() は、任意のペイロード(Cloud Storage で署名された URL など)の署名を許可しますが、signJwt() は正しい形式の JWT の署名のみを許可します。

最後に、ユーザーはサービス アカウントの認証情報を取得することなく、サービス アカウントの権限を借用できます。これは高度な使用例であり、generateAccessToken() メソッドを使用したプログラムによるアクセスでのみサポートされています。A、B、C という 3 つのサービス アカウントがあるシナリオでは、サービス アカウント A は、サービス アカウント A が B に対する iam.serviceAccounts.implicitDelegation 権限を付与され、B が C に対して iam.serviceAccounts.getAccessToken 権限が付与されている場合、サービス アカウント C のアクセス トークンを取得できます。

OpenID Connect(OIDC)ID トークンの生成

権限:

  • iam.serviceAccounts.getOpenIdToken

ロール:

  • roles/iam.serviceAccountOpenIdTokenCreator(サービス アカウントの OpenID Connect ID トークン作成者)

ユーザーまたはサービスは、iam.serviceAccounts.getOpenIdToken 権限を使用してサービス アカウントの ID を表す Google OIDC プロバイダ(accounts.google.com)によって署名された OpenID Connect(OIDC)と互換性のある JWT トークンを生成できます。

これらのトークンは、あなたの組織が Google へのアクセスを許可するために追加の ID 連携をデプロイしないと、ほとんどの Google API に直接受け入れられることはありません。ユーザー実行アプリケーションへの OIDC ベースのアクセスを許可する Identity-Aware Proxy などのような例外もいくつかあります。

外部秘密鍵の生成

権限:

  • iam.serviceAccountKeys.create

ロール:

  • roles/editor(編集者)
  • roles/iam.serviceAccountKeyAdmin(サービス アカウント キー管理者)

ユーザーまたはサービスは、サービス アカウントとして Google に直接認証する場合に使用できる外部秘密鍵マテリアル(RSA)を生成できます。この鍵マテリアルは、アプリケーションのデフォルト認証情報(ADC)ライブラリまたは gcloud auth activate-service-account コマンドで使用できます。鍵のマテリアルにアクセスできる人は、サービス アカウントが完全アクセス権を持つすべてのリソースに制限なくアクセスできます。そのような秘密鍵のマテリアルは最も注意して扱われるべきであり、マテリアルの存在が長いほど安全性が低くなると想定されます。したがって、秘密鍵のマテリアルをローテーションすることは、強固なセキュリティを維持するためには不可欠です。

サービス アカウントにロールを付与する際のベスト プラクティス

サービス アカウントに高度な特権の操作を実行する権限が付与されている場合、ユーザーにそのサービス アカウントでサービス アカウント ユーザーのロールを付与するときは注意が必要です。

サービス アカウントは、サービスレベルのセキュリティを表します。サービスのセキュリティは、サービス アカウントを管理 / 使用できる IAM ロールを持つユーザーと、これらのサービス アカウント キーを保持するユーザーによって決まります。セキュリティを確保するためのベスト プラクティスは次のとおりです。

  • IAM API を使用してサービス アカウント、キー、およびサービス アカウントの許可ポリシーを監査します。
  • サービス アカウントにサービス アカウント キーが必要ない場合は、サービス アカウント キーを無効にするか削除します。
  • ユーザーがサービス アカウントを管理または使用する権限を必要としない場合は、該当する許可ポリシーから削除します。
  • サービス アカウントには最小限の権限を設定してください。デフォルトのサービス アカウントにはプロジェクト編集者(roles/editor)ロールが自動的に付与されます。このアカウントは慎重に使用してください。

ベスト プラクティスの詳細については、サービス アカウントを操作するためのベスト プラクティスをご覧ください。

使ってみる

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

無料で開始