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

このページでは、メンバーとリソースに 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

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

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

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

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

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 インスタンスは、このルールに対する例外で、インスタンスに接続されるサービス アカウントは必要に応じて変更できます。

サービス アカウントは、リソースに接続する前に構成する必要があります。この処理は、サービス アカウントとリソースが同じプロジェクトか、異なるプロジェクトかによって変ります。サービス アカウントを構成すると、リソースを作成して、そこにサービス アカウントを接続できます。

同じプロジェクト内のリソースを構成する

同じプロジェクト内の別のリソースに対しては、サービス アカウントを接続する前に、他のアカウントにロールを付与する場合と同様、サービス アカウントにロールを付与し、適切なリソースにアクセスできるようにします。

異なるプロジェクトのリソースを構成する

場合によっては、別のプロジェクトにあるリソースにサービス アカウントを接続する必要が生じることがあります。たとえば、1 つのプロジェクト内にすべてのサービス アカウントを作成する場合、別のプロジェクトの新しいリソースにそのサービス アカウントを接続する必要が生じることがあります。

その場合、サービス アカウントを別のプロジェクト内のリソースに接続する前に、次のことを実施します。

  1. サービス アカウントが存在するプロジェクトで、このページの手順に従ってプロジェクト間でサービス アカウントの成り代わりを有効にします。
  2. リソースを作成するプロジェクトを特定します。
  3. サービス アカウントを接続するリソースのタイプと、そのリソースを所有するサービスを特定します。

    たとえば、Pub/Sub サブスクリプションを作成する場合、Pub/Sub はリソースを所有するサービスです。

  4. そのサービスの Google 管理のサービス アカウントのメールアドレスを見つけます。

    サービスが使用する Google 管理のサービス アカウントは、サービスにより異なります。詳細については、Google 管理のサービス アカウントサービス エージェントをご覧ください。

  5. サービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を Google 管理のサービス アカウントに付与します。

    Console

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

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

    2. リソースに接続するサービス アカウントを所有しているプロジェクトを選択します。

    3. リソースに接続するサービス アカウントを見つけて、そのチェックボックスをオンにします。

    4. [権限] タブで、[メンバーを追加] をクリックします。

    5. [新しいメンバー] フィールドに、Google 管理のサービス アカウントのメールアドレスを入力します。

    6. [ロールを選択] プルダウン リストで「Service Account Token Creator」と入力し、そのロールをクリックします。

    7. [保存] をクリックして、変更を保存します。

    8. 省略可: Google 管理の別のサービス アカウントにロールを付与する必要がある場合は、上記の手順を繰り返します。

    gcloud

    gcloud iam service-accounts add-iam-policy-binding コマンドを実行します。

    gcloud iam service-accounts add-iam-policy-binding \
        user-sa-name@project-id.iam.gserviceaccount.com \
        --member=serviceAccount:google-sa-email \
        --role=roles/iam.serviceAccountTokenCreator
    

    次の値を置き換えます。

    • user-sa-name: リソースに接続するユーザー管理のサービス アカウントの名前。
    • project-id: ユーザー管理のサービス アカウントが存在するプロジェクト ID。
    • google-sa-email: Google 管理のサービス アカウントのメールアドレス。

    このコマンドでは、ユーザー管理のサービス アカウントの更新済み IAM ポリシーが出力されます。

    省略可: Google 管理の別のサービス アカウントにロールを付与する必要がある場合は、コマンドを再実行します。

    REST

    このロールを付与するには、読み取り - 変更 - 書き込みパターンを使用して、ユーザー管理のサービス アカウントの IAM ポリシーを更新します。

    まず、ユーザー管理のサービス アカウントの IAM ポリシーを読み取ります。

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

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

    • project-id: Google Cloud プロジェクト ID
    • user-sa-name: リソースにバインドするユーザー管理のサービス アカウントの名前。

    HTTP メソッドと URL:

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

    JSON 本文のリクエスト:

    {
      "requestedPolicyVersion": 3
    }
    

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

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

    {
      "version": 1,
      "etag": "BwWl3KCTUMY=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com"
          ]
        }
      ]
    }
    

    次に、Google 管理のサービス アカウントにサービス アカウント トークン作成者のロールを付与するようにポリシーを変更します。google-sa-email は、Google 管理のサービス アカウントのメールアドレスに置き換えます。

    {
      "version": 1,
      "etag": "BwWl3KCTUMY=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "serviceAccount:google-sa-email"
          ]
        },
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com"
          ]
        }
      ]
    }
    

    最後に、更新されたポリシーを記述します。

    projects.serviceAccounts.setIamPolicy メソッドは、サービス アカウントの IAM ポリシーを更新します。

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

    • project-id: Google Cloud プロジェクト ID
    • user-sa-name: リソースにバインドするユーザー管理のサービス アカウントの名前。
    • google-sa-email: ユーザー管理のサービス アカウントのアクセス トークンを作成する Google 管理のサービス アカウントのメールアドレス。

    HTTP メソッドと URL:

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

    JSON 本文のリクエスト:

    {
      "policy": {
        "version": 1,
        "etag": "BwWl3KCTUMY=",
        "bindings": [
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:google-sa-email"
            ]
          },
          {
            "role": "roles/iam.serviceAccountUser",
            "members": [
              "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com"
            ]
          }
        ]
      }
    }
    

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

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

    {
      "version": 1,
      "etag": "BwWo331TkHE=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "serviceAccount:google-sa-email"
          ]
        },
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com"
          ]
        }
      ]
    }
    

サービス アカウントを新しいリソースに接続する

ユーザー管理のサービス アカウントを構成すると、新しいリソースを作成して、サービス アカウントをそのリソースに接続できます。新しいリソースは、適切なプロジェクトで作成するようにしてください。

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

リソースの作成時にサービス アカウントを接続する
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 登録

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

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

監査ログの解釈

Cloud Audit Logs を使用すると、Google Cloud リソースに対して「いつ誰がどこで何をしたか」を調べることができます。

有効期間の短い認証情報を使用してサービス アカウントに成り代わると、ほとんどの Google Cloud サービスでは次の ID を示すログエントリを作成します。

  • 有効期間の短い認証情報が成り代わるサービス アカウント
  • 有効期間の短い認証情報を作成した ID

これらのログエントリを使用して、有効期間が短い認証情報を作成したメンバーと、メンバーが成り代わったサービス アカウントを特定できます。

サービス アカウントの成り代わりを示す監査ログエントリの例は、サービス アカウントに成り代わって Google Cloud へアクセスするをご覧ください。

プロジェクト間でのサービス アカウントの成り代わりを有効にする

デフォルトでは、あるプロジェクトでサービス アカウントを作成し、それを別のプロジェクトのリソースに接続することはできません。すべてのサービス アカウントを 1 つのプロジェクトで保持する場合は、そのプロジェクトの組織ポリシーを更新する必要があります。

サービス アカウントが配置されているプロジェクトの組織のポリシーで、次のブール型制約を確認します。

  • iam.disableCrossProjectServiceAccountUsage ブール型制約は、プロジェクトに適用されないようにしてください。

    このブール型制約は、サービス アカウントを別のプロジェクト内のリソースに接続できるかどうかを制御します。デフォルトでは、この制約は適用されます。

    この制約が適用されない場合は、プロジェクトが削除されることを防ぐプロジェクト リーエンが IAM に追加されます。このリーエンは元の iam.googleapis.com/cross-project-service-accounts を持ちます。このリーエンは削除しないことを強くおすすめします。

  • 推奨: iam.restrictCrossProjectServiceAccountLienRemoval ブール型制約は、プロジェクトに適用されるようにしてください。

    このブール型制約は、組織レベルで resourcemanager.projects.updateLiens 権限を持つ場合にのみ、メンバーがプロジェクト リーエンを削除できるようにします。この制約が適用されない場合は、プロジェクト レベルでこの権限を持っていれば、メンバーがプロジェクト リーエンを削除できます。

組織のポリシーでブール型制約を表示または変更する方法については、ブール型制約の設定をご覧ください。

プロジェクト間でのサービス アカウントの成り代わりを無効にする

前に複数のプロジェクトでサービス アカウントの成り代わりを有効にした場合、特に本番環境ではこの機能を無効にしないでください。

具体的には、サービス アカウントが存在するプロジェクトで、次の変更を行ってはいけません。

  • iam.disableCrossProjectServiceAccountUsage ブール型制約を適用するようにプロジェクトの組織ポリシーを更新しないでください。
  • iam.restrictCrossProjectServiceAccountLienRemoval ブール型制約を適用しないように、プロジェクトの組織ポリシーを更新しないでください。
  • 生成元 iam.googleapis.com/cross-project-service-accountsプロジェクト リーエンを削除しないでください。これは、プロジェクトを削除しないようにするものです。
  • プロジェクトは削除しないでください。

この機能を無効にしたい場合は、プロジェクト間で使用しているサービス アカウントを無効にし、Google Cloud 環境の問題をモニタリングすることでリスクを軽減できます。問題が見つかった場合は、サービス アカウントを再開できます。問題が何も表示されない場合は、別のプロジェクトのサービス アカウントに依存する Google Cloud リソースが存在しない可能性があります。

次のステップ