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

このページでは、メンバーとリソースに Identity and Access Management(IAM)サービス アカウントの権限の使用を許可する方法について説明します。また、特定の IAM サービス アカウントとして機能できるメンバーの確認方法についても説明します。

始める前に

IAM のサービス アカウントの仕組みを理解しておく必要があります。

メンバーにサービス アカウントの権限の使用を許可する

メンバーにサービス アカウントの権限の使用を許可できる事前定義ロールがいくつかあります。

  • サービス アカウント ユーザー(roles/iam.serviceAccountUser: メンバーはサービス アカウントがアクセスできるすべてのリソースに間接的にアクセスできます。たとえば、メンバーにサービス アカウントのサービス アカウント ユーザーロールが付与され、サービス アカウントにプロジェクトの Cloud SQL 管理者ロール(roles/cloudsql.admin)が付与されている場合、このメンバーはサービス アカウントして Cloud SQL インスタンスを作成できます。

    このロールを使用すると、このページで説明するように、サービス アカウントをリソースにバインドすることもできます。

  • サービス アカウント トークン作成者(roles/iam.serviceAccountTokenCreator: 認証に使用できるように OAuth 2.0 アクセス トークンの作成、JSON Web Token(JWT)への署名、バイナリ blob への署名をサービス アカウントとして行うことをメンバーに許可します。詳細については、有効期間が短いサービス アカウント認証情報の作成をご覧ください。

  • Workload Identity ユーザー(roles/iam.workloadIdentityUser: GKE ワークロードのサービス アカウントとして振る舞うことをメンバーに許可します。このロールはプロジェクト、フォルダ、組織に付与できますが、個々のサービス アカウントには付与できません。

また、別の事前定義ロールや、これらのロールと同じ権限を含むカスタムロールを付与することもできます。

ここでは、これらのロールをプロジェクト、フォルダ、組織に付与する方法と、個々のサービス アカウントに付与する方法について説明します。付与するアクセス権の量に応じてレベルを選択します。

メンバーに複数のサービス アカウントの権限の使用を許可する

プロジェクト、フォルダまたは組織に作成されたすべてのサービス アカウントの権限の使用をメンバーに許可するには、プロジェクト、フォルダまたは組織にロールを付与します。

Console

  1. Cloud Console で [IAM] ページに移動します。

    [IAM] ページに移動

  2. ページの上部にあるプロジェクト セレクタから、ロールを付与するプロジェクト、フォルダ、または組織を選択します。

  3. [追加] をクリックします。

  4. メンバーのメールアドレスを入力します。

  5. メンバーに許可するサービス アカウントのロールを選択します。サービス アカウントの権限借用に使用するロールをご覧ください。

  6. [保存] をクリックします。

gcloud コマンド

サービス アカウントの権限借用に使用するロールをメンバーに付与するには、プロジェクト、フォルダまたは組織の IAM ポリシーを変更します。

  1. リソースの IAM ポリシーを読み取ります。

    gcloud resource get-iam-policy resource-id \
        --format=json > policy.json
    

    次の値を置き換えます。

    • resource: ポリシーを設定するリソースのタイプ。この値は、projectsresource-manager foldersorganizations のいずれかにする必要があります。
    • resource-id: ポリシーを設定するリソースの ID。

    このコマンドは、リソースのポリシーを policy.json ファイルに保存します。

    リソースにポリシーがすでに設定されている場合、policy.json ファイルは次のようになります。

    {
      "bindings": [
        {
          "members": [
            "user:hollis@example.com"
          ],
          "role": "roles/owner"
        }
      ],
      "etag": "BwUqLaVeua8=",
      "version": 1
    }
    

    リソースにポリシーがない場合、policy.json ファイルにはデフォルトの etag のみが含まれます。

    既存のポリシーがない場合は、以降の手順で JSON をテンプレートとして使用し、ポリシーを手動で作成します。

  2. 適切なロールがメンバーに付与されるようにポリシーを変更します。次のいずれかの方法でロールを付与します。

    • ロールのバインディングが存在しない場合は、付与するロールとメンバーを表す bindings 配列にオブジェクトを追加します。
    • ロールのバインディングがすでに存在する場合は、既存のメンバーのリストに新しいメンバーを追加します。ポリシーに条件付きロール バインディングが含まれている場合は、メンバーを追加する前に、バインディングに適切な条件があることも確認します。

    bindings 配列が存在しない場合は、配列を作成できます。

    サービス アカウント ユーザーロール(roles/iam.serviceAccountUser)を robin@example.com に付与するには、上記の例を次のように変更します。

    {
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "user:robin@example.com"
          ]
        },
        {
          "role": "roles/owner",
          "members": [
            "user:hollis@example.com"
          ]
        }
      ],
      "etag": "BwUqLaVeua8=",
      "version": 1
    }
    
  3. 更新したポリシーを書き込みます。

    gcloud resource set-iam-policy resource-id \
        policy-file
    

    次の値を置き換えます。

    • resource: ポリシーを設定するリソースのタイプ。この値は、projectsresource-manager foldersorganizations のいずれかにする必要があります。
    • resource-id: ポリシーを設定するリソースの ID。
    • policy-file: 更新されたポリシーを含むファイルのパス。

    このコマンドは、更新された etag 値を含む更新後のポリシーを出力します。

REST API

Resource Manager REST API を使用してロールを付与するには、プロジェクト、フォルダ、または組織の現在の IAM ポリシーを読み取り、目的のロールが付与されるようにポリシーを変更し、更新後のポリシーを書き込む必要があります。

リソースの IAM ポリシーを読み取ります。

Resource Manager API の getIamPolicy メソッドを使用して、プロジェクト、フォルダまたは組織の IAM ポリシーを取得します。

後述のリクエストのデータを使用する前に、次のように置き換えます。

  • api-version: 使用する API のバージョン。プロジェクトと組織の場合は、v1 を使用します。フォルダの場合は、v2 を使用します。
  • resource-type: ポリシーを管理するリソースタイプ。値 projectsfolders、または organizations を使用します。
  • resource-id: Google Cloud プロジェクト、組織、またはフォルダ ID。
  • policy-version: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。

HTTP メソッドと URL:

POST https://cloudresourcemanager.googleapis.com/api-version/resource-type/resource-id:getIamPolicy

JSON 本文のリクエスト:

{
  "options": {
    "requestedPolicyVersion": policy-version
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:owner@example.com"
      ]
    }
  ]
}

既存のポリシーがない場合、レスポンスにはデフォルトの etag のみが含まれます。このレスポンスが返された場合は、version フィールドを追加して 3 に設定し、bindings フィールドを空の配列に設定します。

適切なロールがメンバーに付与されるようにポリシーを変更します。

次のいずれかの方法でロールを付与します。

  • ロールのバインディングが存在しない場合は、付与するロールとメンバーを表す bindings 配列にオブジェクトを追加します。
  • ロールのバインディングがすでに存在する場合は、既存のメンバーのリストに新しいメンバーを追加します。

:

サービス アカウント ユーザーロール(roles/iam.serviceAccountUser)を robin@example.com に付与するには、上記の例を次のように変更します。

{
  "version": 1,
  "etag": "BwUqLaVeua8=",
  "bindings": [
    {
      "role": "roles/iam.serviceAccountUser",
      "members": [
        "user:robin@example.com"
      ]
    },
    {
      "role": "roles/owner",
      "members": [
        "user:owner@example.com"
      ]
    }
  ]
}

更新したポリシーを書き込みます。

Resource Manager API の setIamPolicy メソッドを使用して、プロジェクト、フォルダまたは組織の新しい IAM ポリシーとしてリクエストのポリシーを設定します。

後述のリクエストのデータを使用する前に、次のように置き換えます。

  • api-version: 使用する API のバージョン。プロジェクトと組織の場合は、v1 を使用します。フォルダの場合は、v2 を使用します。
  • resource-type: ポリシーを管理するリソースタイプ。値 projectsfolders、または organizations を使用します。
  • resource-id: Google Cloud プロジェクト、組織、またはフォルダ ID。
  • policy: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。

    たとえば、前の手順で示したポリシーを設定するには、policy を次のコードに置き換えます。

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "user:robin@example.com"
          ]
        },
        {
          "role": "roles/owner",
          "members": [
            "user:owner@example.com"
          ]
        }
      ]
    }
    

HTTP メソッドと URL:

POST https://iam.googleapis.com/api-version/resource-type/resource-id:setIamPolicy

JSON 本文のリクエスト:

{
  "policy": policy
}

リクエストを送信するには、次のいずれかのオプションを展開します。

レスポンスには、更新されたポリシーが含まれます。

メンバーに 1 つのサービス アカウントの権限の使用を許可する

メンバーに 1 つのサービス アカウントの権限の使用を許可するには、サービス アカウントにロールを付与します。

Console

  1. Cloud Console で、[サービス アカウント] ページに移動します。

    [サービス アカウント] ページに移動

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

  3. サービス アカウントを選択します。情報パネルが表示されていない場合は、[情報パネルを表示] をクリックします。このパネルには、サービス アカウントに付与されているロールの一覧が表示されます。

  4. [メンバーを追加] をクリックします。

  5. メンバーのメールアドレスを入力します。

  6. サービス アカウントの権限の使用を許可するためにメンバーに付与するロールを選択します。サービス アカウントの権限借用に使用するロールをご覧ください。

  7. [追加] をクリックして、プロジェクト メンバーにロールを適用します。

複数のサービス アカウントにロールを付与するには、それぞれのサービス アカウントに同じ手順を繰り返します。

gcloud コマンド

サービス アカウントの権限の使用を許可するためにメンバーにロールを付与するには、サービス アカウントの IAM ポリシーを変更します。

  1. service-accounts get-iam-policy コマンドを使用して、現在のポリシーを読み取ります。

    gcloud iam service-accounts get-iam-policy sa-id \
        --format=json > policy.json
    

    次の値を置き換えます。

    • sa-id: サービス アカウントの ID。サービス アカウントのメールアドレス(sa-name@project-id.iam.gserviceaccount.com の形式)か、サービス アカウントの一意の数値 ID のいずれかを指定します。

    このコマンドは、サービス アカウントのポリシーを policy.json ファイルに保存します。

    サービス アカウントにポリシーがすでに設定されている場合、policy.json ファイルは次のようになります。

    {
      "bindings": [
        {
          "members": [
            "user:hollis@example.com"
          ],
          "role": "roles/iam.serviceAccountAdmin"
        }
      ],
      "etag": "BwUqLaVeua8=",
      "version": 1
    }
    

    サービス アカウントにポリシーが設定されていない場合、policy.json ファイルにはデフォルトの etag のみが含まれます。

    既存のポリシーがない場合は、以降の手順で JSON をテンプレートとして使用し、ポリシーを手動で作成します。

  2. テキスト エディタで、policy.json ファイルを開き、メンバーに適切なロールが付与されるようにバインディング配列を変更します。次のいずれかの方法でロールを付与します。

    • ロールのバインディングが存在しない場合は、付与するロールとメンバーを定義する bindings 配列に新しいオブジェクトを追加します。
    • ロールのバインディングがすでに存在する場合は、既存のメンバーのリストに新しいメンバーを追加します。ポリシーに条件付きロール バインディングが含まれている場合は、メンバーを追加する前に、バインディングに適切な条件があることも確認します。

    bindings 配列が存在しない場合は、配列を作成できます。

    サービス アカウント ユーザーロール(roles/iam.serviceAccountUser)を robin@example.com に付与するには、上記の例を次のように変更します。

    {
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "user:robin@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountAdmin",
          "members": [
            "user:hollis@example.com"
          ]
        }
      ],
      "etag": "BwUqLaVeua8=",
      "version": 1
    }
    
  3. service-accounts set-iam-policy コマンドを使用して、更新されたポリシーを書き込みます。

    gcloud iam service-accounts set-iam-policy sa-id \
        policy-file
    

    次の値を置き換えます。

    • sa-id: サービス アカウントの ID。サービス アカウントのメールアドレス(sa-name@project-id.iam.gserviceaccount.com の形式)か、サービス アカウントの一意の数値 ID のいずれかを指定します。
    • policy-file: 更新されたポリシーを含むファイルのパス。

    このコマンドは、更新された etag 値を含む更新後のポリシーを出力します。

REST API

IAM REST API を使用してロールを付与するには、サービス アカウントの現在の IAM ポリシーを読み取り、目的のロールが付与されるように変更し、更新後のポリシーを書き込む必要があります。

サービス アカウントの IAM ポリシーを確認します。

serviceAccounts.getIamPolicy メソッドで、サービス アカウントの IAM ポリシーを取得します。

後述のリクエストのデータを使用する前に、次のように置き換えます。

  • project-id: Google Cloud プロジェクト ID。
  • sa-id: サービス アカウントの ID。これは、サービス アカウントのメールアドレス(sa-name@project-id.iam.gserviceaccount.com の形式)、またはサービス アカウントの一意の数値 ID のいずれかです。

  • policy-version: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。

HTTP メソッドと URL:

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-id:getIamPolicy

JSON 本文のリクエスト:

{
  "options": {
    "requestedPolicyVersion": policy-version
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/serviceAccountAdmin",
      "members": [
        "user:admin@example.com"
      ]
    }
  ]
}

既存のポリシーがない場合、レスポンスにはデフォルトの etag のみが含まれます。このレスポンスが返された場合は、version フィールドを追加して 3 に設定し、bindings フィールドを空の配列に設定します。

適切なロールがメンバーに付与されるようにポリシーを変更します。

テキスト エディタでレスポンスの本文を開き、メンバーに適切なロールが付与されるようにバインディング配列を変更します。次のいずれかの方法でロールを付与します。

  • ロールのバインディングが存在しない場合は、付与するロールとメンバーを定義する bindings 配列に新しいオブジェクトを追加します。
  • ロールのバインディングがすでに存在する場合は、既存のメンバーのリストに新しいメンバーを追加します。

:

サービス アカウント ユーザーロール(roles/iam.serviceAccountUser)を robin@example.com に付与するには、上記の例を次のように変更します。

{
  "version": 1,
  "etag": "BwUqLaVeua8=",
  "bindings": [
    {
      "role": "roles/iam.serviceAccountUser",
      "members": [
        "user:robin@example.com"
      ]
    },
    {
      "role": "roles/iam.serviceAccountAdmin",
      "members": [
        "user:admin@example.com"
      ]
    }
  ]
}

更新したポリシーを書き込みます。

serviceAccounts.setIamPolicy メソッドによって、サービス アカウントの更新済み IAM ポリシーが設定されます。

後述のリクエストのデータを使用する前に、次のように置き換えます。

  • project-id: Google Cloud プロジェクト ID。
  • sa-id: サービス アカウントの ID。これは、サービス アカウントのメールアドレス(sa-name@project-id.iam.gserviceaccount.com の形式)、またはサービス アカウントの一意の数値 ID のいずれかです。

  • policy: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。

    たとえば、前の手順で示したポリシーを設定するには、policy を次のコードに置き換えます。

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "user:robin@example.com"
          ]
        },
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:admin@example.com"
          ]
        }
      ]
    }
    

HTTP メソッドと URL:

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-id:setIamPolicy

JSON 本文のリクエスト:

{
  "policy": policy
}

リクエストを送信するには、次のいずれかのオプションを展開します。

レスポンスには、更新されたポリシーが含まれます。

サービス アカウントにアクセスできるメンバーを一覧表示する

サービス アカウントに付与されたロール、またはプロジェクト、フォルダ、組織に付与されたロールにより、サービス アカウントへのアクセスが許可されているメンバーを確認するには、Cloud Console を使用します。

  1. Cloud Console で、[サービス アカウント] ページに移動します。

    [サービス アカウント] ページに移動

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

  3. 目的のサービス アカウントの横にあるチェックボックスをオンにします。

  4. 情報パネルが表示されていない場合は、[情報パネルを表示] をクリックします。選択したサービス アカウントに付与されているロールの一覧が表示されます。

  5. ロールを展開すると、そのロールが付与されたサービス アカウントを持つメンバーが表示されます。

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

一部の Google Cloud リソースでは、リソースがデフォルトの ID として使用するユーザー管理のサービス アカウントを指定できます。このプロセスは、サービス アカウントをリソースに「接続」する、またはサービス アカウントとリソースを「関連付ける」といいます。

他の Google Cloud サービスとリソースにアクセスする必要がある場合、そのリソースに関連付けられているサービス アカウントの権限を借用します。たとえば、サービス アカウントを Compute Engine インスタンスに接続すると、インスタンスのアプリケーションは、Google Cloud APIs を呼び出すときに自動的にそのサービス アカウントを使用します。

ほとんどの場合、リソースの作成時にリソース アカウントをサービス アカウントに関連付ける必要があります。リソースの作成後に、リソースに関連付けられているサービス アカウントを変更することはできません。Compute Engine インスタンスは例外です。必要に応じて、インスタンスに接続するサービス アカウントを変更できます。

作成するリソースの種類に応じた手順をご覧ください。

リソースの作成時にサービス アカウントを接続する
AI Platform Notebooks ノートブック インスタンス
AI Platform Prediction モデル バージョン
AI Platform Training ジョブ
Cloud Composer 環境
Cloud Functions Cloud Functions の関数
Cloud Life Sciences パイプライン
Cloud Run サービス
Cloud Scheduler ジョブ
Cloud Source Repositories
Compute Engine
Dataflow ジョブ
Datalab インスタンス
Dataproc クラスタ
Google Kubernetes Engine
Pub/Sub サブスクリプション

リソースを作成してそのリソースにサービス アカウントを関連付けると、適切なリソースにアクセスできるようにサービス アカウントにロールを付与できます。このプロセスは、他のメンバーにロールを付与する場合と同じです。

ロールを付与する方法については、リソースへのアクセス権の付与、変更、取り消しをご覧ください。

次のステップ