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

このページでは、メンバーとリソースに 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 ポリシーを読み取ります。

リソースの getIamPolicy() メソッドを呼び出して、現在のポリシーを読み取ります。

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

次の値を置き換えます。

  • api-version: 使用する API のバージョン。プロジェクトと組織の場合は、v1 を使用します。フォルダの場合は、v2 を使用します。
  • resource: ポリシーを設定するリソースのタイプ。この値は、projectsresource-manager foldersorganizations のいずれかにする必要があります。
  • resource-id: ポリシーを設定するリソースの ID。

リクエストの本文は空にする必要があります。

レスポンスの本文には現在のポリシーが含まれます。次のいずれかのようになります。

  • リソースにポリシーがすでに設定されている場合、レスポンスの本文は次のようになります。

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "members": [
            "user:hollis@example.com"
          ],
          "role": "roles/owner"
        }
      ]
    }
    
  • リソースにポリシーが設定されていない場合、レスポンスの本文にはデフォルトの etag のみが含まれます。

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

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

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

  • ロールのバインディングが存在しない場合は、付与するロールとメンバーを表す 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:hollis@example.com"
      ]
    }
  ]
}

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

リソースの setIamPolicy() メソッドを呼び出して、更新されたポリシーを書き込みます。

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

次の値を置き換えます。

  • api-version: 使用する API のバージョン。プロジェクトと組織の場合は、v1 を使用します。フォルダの場合は、v2 を使用します。
  • resource: ポリシーを設定するリソースのタイプ。この値は、projectsresource-manager foldersorganizations のいずれかにする必要があります。
  • resource-id: ポリシーを設定するリソースの ID。

リクエストの本文には、次のように更新されたポリシーを含める必要があります。

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

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

メンバーに 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 ポリシーを確認します。

getIamPolicy() メソッドを呼び出して、現在のポリシーを読み取ります。

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

次の値を置き換えます。

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

リクエストの本文は空にする必要があります。

レスポンスの本文には現在のポリシーが含まれます。次のいずれかのようになります。

  • サービス アカウントにポリシーが設定されている場合、レスポンスの本文は次のようになります。

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "members": [
            "user:hollis@example.com"
          ],
          "role": "roles/iam.serviceAccountAdmin"
        }
      ]
    }
    
  • サービス アカウントにポリシーが設定されていない場合、レスポンスの本文にはデフォルトの etag のみが含まれます。

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

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

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

  • ロールのバインディングが存在しない場合は、付与するロールとメンバーを定義する 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:hollis@example.com"
      ]
    }
  ]
}

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

setIamPolicy() メソッドを呼び出して、更新されたポリシーを書き込みます。

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

次の値を置き換えます。

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

リクエストの本文には、次のように更新されたポリシーを含める必要があります。

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

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

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

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

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

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

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

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

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

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

サービス アカウントをリソースにバインドする

一部の Google Cloud リソースでは、リソースがデフォルトの ID として使用するユーザー管理のサービス アカウントを指定できます。この操作は、サービス アカウントとリソースのバインディングまたはサービス アカウントとリソースの関連付けといいます。

他の Google Cloud サービスとリソースにアクセスする必要がある場合は、そのリソースにバインドされたサービス アカウントの権限の使用を許可します。たとえば、サービス アカウントを Compute Engine インスタンスにバインドすると、インスタンスのアプリケーションは、Google Cloud APIs を呼び出すときに自動的にそのサービス アカウントを使用します。

ほとんどの場合、リソースを作成するときにサービス アカウントとリソースをバインドする必要があります。リソースを作成した後は、サービス アカウントのバインディングの追加、変更、削除を行うことはできません。ただし、Compute Engine インスタンスは例外です。必要に応じて、サービス アカウント バインディングを更新できます。

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

リソースの作成時にサービス アカウントをバインドする
AI Platform

モデル バージョン

--config パラメータにサービス アカウントを指定します。

AI Platform Notebooks ノートブック インスタンス
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 サブスクリプション

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

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

次のステップ