サービス アカウントに対するアクセス権の管理

このページでは、1 つのサービス アカウントに対するプリンシパルのアクセス権を付与、変更、取り消す方法について説明します。プロジェクト、フォルダまたは組織内のすべてのサービス アカウントに対するプリンシパルのアクセス権を管理するには、プロジェクト、フォルダまたは組織レベルでプリンシパルの管理を行います。

Identity and Access Management(IAM)では、許可ポリシー(IAM ポリシー)によってアクセス権が管理されます。許可ポリシーは Google Cloud リソースに接続されます。各許可ポリシーには、ユーザーやサービス アカウントなどの 1 つ以上のプリンシパルを IAM ロールに関連付けるロール バインディングのコレクションが含まれています。ロール バインディングは、許可ポリシーが接続されているリソースと、そのリソースのすべての子孫の両方のプリンシパルに、指定されたロールを付与します。許可ポリシーの詳細については、許可ポリシーについてをご覧ください。

サービス アカウントは、他のプリンシパルに自身へのアクセス権を付与できるリソースであり、他のリソースへのアクセス権を付与されることができるプリンシパルでもあります。このページでは、サービス アカウントをリソースとして扱い、他のプリンシパルにアクセス権を付与する方法について説明します。サービス アカウントに他のリソースへのアクセス権を付与する方法については、次のガイドをご覧ください。

このページでは、Google Cloud コンソール、Google Cloud CLI、REST API を使用してサービス アカウントへのアクセス権を管理する方法を説明します。アクセスの管理は IAM クライアント ライブラリでも行うことができます。

始める前に

必要なロール

サービス アカウントへのアクセスの管理に必要な権限を取得するため、サービス アカウントまたはサービス アカウントを所有するプロジェクトに対するサービス アカウント管理者roles/iam.serviceAccountAdmin)IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

この事前定義ロールには、サービス アカウントへのアクセスの管理に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

サービス アカウントへのアクセスを管理するには、次の権限が必要です。

  • iam.serviceAccounts.get
  • iam.serviceAccounts.list
  • iam.serviceAccounts.getIamPolicy
  • iam.serviceAccounts.setIamPolicy

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

現在のアクセス権を表示する

次のセクションでは、Google Cloud コンソール、gcloud CLI、REST API を使用して、サービス アカウントにアクセスできるユーザーを確認する方法について説明します。IAM クライアント ライブラリを使用してサービス アカウントの許可ポリシーを取得し、アクセス権を確認することもできます。

コンソール

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

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

  2. プロジェクトを選択します。

  3. サービス アカウントのメールアドレスをクリックします。

  4. [権限] タブに移動します。[このサービス アカウントにアクセスできるプリンシパル] セクションに、このサービス アカウントのロールを付与されたプリンシパルがすべて表示されます。

    このリストには、親リソースに付与されたロールのアクセス権を持つプリンシパルが含まれます。ポリシー継承の詳細については、ポリシーの継承とリソース階層をご覧ください。

  5. 省略可: サービス エージェントに付与されたロールを表示するには、[Google 提供のロール付与を含みます] チェックボックスをオンにします。

gcloud

サービス アカウントにアクセスできるユーザーを確認するには、サービス アカウントの許可ポリシーを取得します。許可ポリシーの解釈方法については、許可ポリシーについてをご覧ください。

サービス アカウントの許可ポリシーを取得するには、サービス アカウントを指定して get-iam-policy コマンドを実行します。

gcloud iam service-accounts get-iam-policy SA_ID --format=FORMAT > PATH

次の値を指定します。

  • SA_ID: サービス アカウントの ID。これは、サービス アカウントのメールアドレス(SA_NAME@PROJECT_ID.iam.gserviceaccount.com の形式)か、サービス アカウントの一意の数値 ID のいずれかです。

  • FORMAT: ポリシーの形式。json または yaml を使用します。

  • PATH: ポリシーの新しい出力ファイルのパス。

たとえば、次のコマンドはサービス アカウント my-service-account のポリシーを取得し、これを JSON 形式でホーム ディレクトリに保存します。

gcloud iam service-accounts get-iam-policy my-service-account --format json > ~/policy.json

REST

サービス アカウントにアクセスできるユーザーを確認するには、サービス アカウントの許可ポリシーを取得します。許可ポリシーの解釈方法については、許可ポリシーについてをご覧ください。

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

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

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
  • 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
  }
}

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

レスポンスには、サービス アカウントの許可ポリシーが含まれます。次に例を示します。

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

単一ロールの付与または取り消し

Google Cloud コンソールまたは gcloud CLI では、サービス アカウントの許可ポリシーを直接編集することなく、1 つのプリンシパルに対して 1 つのロールを付与または取り消すことができます。一般的なタイプのプリンシパルには、Google アカウント、サービス アカウント、Google グループ、ドメインがあります。プリンシパル タイプのリストについては、ID 関連のコンセプトをご覧ください。

通常、ポリシーの変更は 2 分以内に有効になります。ただし、システム全体に変更が反映されるまでに 7 分以上かかることがあります。

最も適切な事前定義ロールを特定する必要がある場合は、事前定義ロールを選択するをご覧ください。

単一ロールの付与

プリンシパルに 1 つのロールを付与する方法は次のとおりです。

コンソール

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

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

  2. プロジェクトを選択します。

  3. サービス アカウントのメールアドレスをクリックします。

  4. [権限] タブに移動して、[このサービス アカウントにアクセスできるプリンシパル] セクションを探します。

  5. ロールを付与するプリンシパルを選択します。

    • サービス アカウントに他のロールがあるプリンシパルにロールを付与するには、プリンシパルを含む行を見つけて、その行で プリンシパルを編集します」をクリックし、[ 別のロールを追加] をクリックします。

      サービス エージェントにロールを付与するには、[Google 提供のロール付与を含みます] チェックボックスをオンにして、メールアドレスを表示します。

    • サービス アカウントに対する既存のロールがないプリンシパルにロールを付与するには、[ アクセスを許可] をクリックし、プリンシパルのメールアドレスまたは識別子を入力します。

  6. 付与するロールをプルダウン リストから選択します。最善のセキュリティを得るため、プリンシパルが必要とする権限のみを含むロールを選択してください。

  7. (省略可)ロールに条件を追加します。

  8. [保存] をクリックします。プリンシパルにサービス アカウントのロールが付与されます。

gcloud

プリンシパルにロールをすばやく付与するには、add-iam-policy-binding コマンドを実行します。

gcloud iam service-accounts add-iam-policy-binding SA_ID \
    --member=PRINCIPAL --role=ROLE_NAME \
    --condition=CONDITION

次の値を指定します。

  • SA_ID: サービス アカウントの ID。これは、サービス アカウントのメールアドレス(SA_NAME@PROJECT_ID.iam.gserviceaccount.com の形式)か、サービス アカウントの一意の数値 ID のいずれかです。

  • PRINCIPAL: プリンシパルまたはメンバーの識別子。通常、PRINCIPAL-TYPE:ID の形式で指定します。例: user:my-user@example.comPRINCIPAL に使用できる値の一覧については、ポリシー バインディングのリファレンスをご覧ください。

    プリンシパル タイプが user の場合、識別子に含まれるドメイン名は Google Workspace ドメインまたは Cloud Identity ドメインである必要があります。Cloud Identity ドメインの設定方法については、Cloud Identity の概要をご覧ください。

  • ROLE_NAME: 付与するロールの名前。次のいずれかの形式で指定してください。

    • 事前定義ロール: roles/SERVICE.IDENTIFIER
    • プロジェクト レベルのカスタムロール: projects/PROJECT_ID/roles/IDENTIFIER
    • 組織レベルのカスタムロール: organizations/ORG_ID/roles/IDENTIFIER

    事前定義ロールのリストについては、ロールについてをご覧ください。

  • CONDITION: 省略可。ロール バインディングに追加する条件。条件の詳細については、条件の概要をご覧ください。

たとえば、サービス アカウント ユーザーのロールをサービス アカウント my-service-account@my-project.iam.gserviceaccount.com のユーザー my-user@example.com に付与するには、次のコマンドを実行します。

gcloud iam service-accounts add-iam-policy-binding my-service-account@my-project.iam.gserviceaccount.com \
    --member=user:my-user@example.com --role=roles/iam.serviceAccountUser

単一ロールの取り消し

プリンシパルの 1 つのロールを取り消すには、次の手順を行います。

コンソール

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

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

  2. プロジェクトを選択します。

  3. サービス アカウントのメールアドレスをクリックします。

  4. [権限] タブに移動して、[このサービス アカウントにアクセスできるプリンシパル] セクションを探します。

  5. アクセス権を取り消すプリンシパルのメールアドレスが含まれる行を探します。その行の [プリンシパルを編集します] をクリックします。

  6. 取り消すロールの [削除] ボタンをクリックし、[保存] をクリックします。

gcloud

ユーザーのロールをすばやく取り消すには、remove-iam-policy-binding コマンドを実行します。

gcloud iam service-accounts remove-iam-policy-binding SA_ID \
    --member=PRINCIPAL --role=ROLE_NAME

次の値を指定します。

  • SA_ID: サービス アカウントの ID。これは、サービス アカウントのメールアドレス(SA_NAME@PROJECT_ID.iam.gserviceaccount.com の形式)か、サービス アカウントの一意の数値 ID のいずれかです。

  • PRINCIPAL: プリンシパルまたはメンバーの識別子。通常、PRINCIPAL-TYPE:ID の形式で指定します。例: user:my-user@example.comPRINCIPAL に使用できる値の一覧については、ポリシー バインディングのリファレンスをご覧ください。

    プリンシパル タイプが user の場合、識別子に含まれるドメイン名は Google Workspace ドメインまたは Cloud Identity ドメインである必要があります。Cloud Identity ドメインの設定方法については、Cloud Identity の概要をご覧ください。

  • ROLE_NAME: 取り消すロールの名前。次のいずれかの形式で指定してください。

    • 事前定義ロール: roles/SERVICE.IDENTIFIER
    • プロジェクト レベルのカスタムロール: projects/PROJECT_ID/roles/IDENTIFIER
    • 組織レベルのカスタムロール: organizations/ORG_ID/roles/IDENTIFIER

    事前定義ロールのリストについては、ロールについてをご覧ください。

たとえば、サービス アカウント my-service-account@my-project.iam.gserviceaccount.com のユーザー my-user@example.com からサービス アカウント ユーザーのロールを取り消すには、次のコマンドを実行します。

gcloud iam service-accounts remove-iam-policy-binding my-service-account@my-project.iam.gserviceaccount.com \
    --member=user:my-user@example.com --role=roles/iam.serviceAccountUser

Google Cloud コンソールでの複数のロールの付与または取り消し

Google Cloud コンソールを使用して、1 つのプリンシパルに複数のロールを付与したり、ロールを取り消すことができます。

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

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

  2. プロジェクトを選択します。

  3. サービス アカウントのメールアドレスをクリックします。

  4. [権限] タブに移動して、[このサービス アカウントにアクセスできるプリンシパル] セクションを探します。

  5. ロールを変更するプリンシパルを選択します。

    • サービス アカウントに対するロールを持っているプリンシパルのロールを変更するには、プリンシパルを含む行を見つけて、その行で [プリンシパルを編集] をクリックして、[別のロールを追加] をクリックします。

      サービス エージェントのロールを変更する場合は、[Google 提供のロール付与を含みます] チェックボックスをオンにして、メールアドレスを表示します。

    • サービス アカウントに対する既存のロールがないプリンシパルにロールを付与するには、[ アクセスを許可] をクリックし、プリンシパルのメールアドレスまたは識別子を入力します。

  6. プリンシパルのロールを変更します。

    • リソースに対する既存のロールのないプリンシパルにロールを付与するには、[ロールを選択] をクリックし、プルダウン リストから付与するロールを選択します。
    • プリンシパルに追加のロールを付与するには、[別のロールを追加] をクリックして、プルダウン リストから付与するロールを選択します。
    • プリンシパルのロールの 1 つを別のロールに置き換えるには、既存のロールをクリックして、プルダウン リストから付与する別のロールを選択します。
    • プリンシパルのロールの 1 つを取り消すには、取り消すロールの [削除] ボタンをクリックします。

    ロールに条件を追加したり、ロールの条件の変更ロールの条件の削除を行うこともできます。

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

プログラムでの複数のロールの付与または取り消し

複数のプリンシパルに対して複数のロールの付与や取り消しを行う場合など、大幅なアクセス権の変更を行うには、read-modify-write のパターンを使用して、サービス アカウントの許可ポリシーを更新します。

  1. getIamPolicy() を呼び出して、現在の許可ポリシーを読み取ります。
  2. 許可ポリシーをテキスト エディタまたはプログラムで編集し、プリンシパルまたはロール バインディングの追加や削除を行います。
  3. setIamPolicy() を呼び出して、更新された許可ポリシーを作成します。

このセクションでは、gcloud CLI と REST API を使用して許可ポリシーを更新する方法について説明します。IAM クライアント ライブラリを使用して許可ポリシーを更新することもできます。

通常、ポリシーの変更は 2 分以内に有効になります。ただし、システム全体に変更が反映されるまでに 7 分以上かかることがあります。

現在の許可ポリシーを取得する

gcloud

サービス アカウントの許可ポリシーを取得するには、サービス アカウントを指定して get-iam-policy コマンドを実行します。

gcloud iam service-accounts get-iam-policy SA_ID --format=FORMAT > PATH

次の値を指定します。

  • SA_ID: サービス アカウントの ID。これは、サービス アカウントのメールアドレス(SA_NAME@PROJECT_ID.iam.gserviceaccount.com の形式)か、サービス アカウントの一意の数値 ID のいずれかです。

  • FORMAT: 許可ポリシーの形式。json または yaml を使用します。

  • PATH: 許可ポリシーの新しい出力ファイルのパス。

たとえば、次のコマンドはサービス アカウント my-service-account の許可ポリシーを取得し、これを JSON 形式でホーム ディレクトリに保存します。

gcloud iam service-accounts get-iam-policy my-service-account --format json > ~/policy.json

REST

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

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

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
  • 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
  }
}

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

レスポンスには、サービス アカウントの許可ポリシーが含まれます。次に例を示します。

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

レスポンスを適切なタイプ(json または yaml)のファイルに保存します。

Java

IAM のクライアント ライブラリをインストールして使用する方法については、IAM クライアント ライブラリをご覧ください。詳細については、IAM Java API のリファレンス ドキュメントをご覧ください。

IAM で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。


import com.google.cloud.iam.admin.v1.IAMClient;
import com.google.iam.admin.v1.ServiceAccountName;
import com.google.iam.v1.GetIamPolicyRequest;
import com.google.iam.v1.Policy;
import java.io.IOException;

public class GetServiceAccountPolicy {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your project ID.
    String projectId = "your-project-id";
    // TODO: Replace with your service account name.
    String serviceAccount = "your-service-account";
    getPolicy(projectId, serviceAccount);
  }

  // Gets a service account's IAM policy.
  public static Policy getPolicy(String projectId, String serviceAccount) throws IOException {

    // Construct the service account email.
    // You can modify the ".iam.gserviceaccount.com" to match the name of the service account
    // whose allow policy you want to get.
    String serviceAccountEmail = serviceAccount + "@" + projectId + ".iam.gserviceaccount.com";

    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (IAMClient iamClient = IAMClient.create()) {
      GetIamPolicyRequest request = GetIamPolicyRequest.newBuilder()
              .setResource(ServiceAccountName.of(projectId, serviceAccountEmail).toString())
              .build();
      Policy policy = iamClient.getIamPolicy(request);
      System.out.println("Policy retrieved: " + policy.toString());
      return policy;
    }
  }
}

Python

IAM のクライアント ライブラリをインストールして使用する方法については、IAM クライアント ライブラリをご覧ください。詳細については、IAM Python API のリファレンス ドキュメントをご覧ください。

IAM で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

from google.cloud import iam_admin_v1
from google.iam.v1 import iam_policy_pb2, policy_pb2


def get_service_account_iam_policy(project_id: str, account: str) -> policy_pb2.Policy:
    """
    Get policy for service account.
    project_id: ID or number of the Google Cloud project you want to use.
    account: ID or email which is unique identifier of the service account.
    """

    iam_client = iam_admin_v1.IAMClient()
    request = iam_policy_pb2.GetIamPolicyRequest()
    request.resource = f"projects/{project_id}/serviceAccounts/{account}"

    policy = iam_client.get_iam_policy(request)
    return policy

許可ポリシーを変更する

特定のユーザーに対するロールの付与または取り消しを行うには、プログラムまたはテキスト エディタを使用してサービス アカウントの許可ポリシーのローカルコピーを変更します。

他の変更を上書きしないため、許可ポリシーの etag フィールドは編集または削除しないでください。etag フィールドは、許可ポリシーの現在の状態を示します。更新した許可ポリシーを設定すると、IAM ではリクエスト内の etag 値と既存の etag を比較し、値が一致する場合にのみ許可ポリシーを書き込みます。

許可ポリシーで付与するロールを編集するには、許可ポリシーのロール バインディングを編集する必要があります。ロール バインディングの形式は次のとおりです。

{
  "role": "ROLE_NAME",
  "members": [
    "PRINCIPAL_1",
    "PRINCIPAL_2",
    ...
    "PRINCIPAL_N"
  ],
  "conditions:" {
    CONDITIONS
  }
}

プレースホルダの値は次のとおりです。

  • ROLE_NAME: 付与するロールの名前。次のいずれかの形式で指定してください。

    • 事前定義ロール: roles/SERVICE.IDENTIFIER
    • プロジェクト レベルのカスタムロール: projects/PROJECT_ID/roles/IDENTIFIER
    • 組織レベルのカスタムロール: organizations/ORG_ID/roles/IDENTIFIER

    事前定義ロールのリストについては、ロールについてをご覧ください。

  • PRINCIPAL_1PRINCIPAL_2...PRINCIPAL_N: ロールを付与するプリンシパルの ID。

    通常、プリンシパル ID の形式は PRINCIPAL-TYPE:ID です。たとえば、user:my-user@example.com のようにします。PRINCIPAL に使用できる値の一覧については、ポリシー バインディングのリファレンスをご覧ください。

    プリンシパル タイプが user の場合、識別子に含まれるドメイン名は Google Workspace ドメインまたは Cloud Identity ドメインである必要があります。Cloud Identity ドメインの設定方法については、Cloud Identity の概要をご覧ください。

  • CONDITIONS: 省略可。アクセスが許可されるタイミングを指定する条件

ロールを付与する

プリンシパルにロールを付与するには、許可ポリシーのロール バインディングを変更します。付与できるロールについては、ロールについてまたはサービス アカウントに対する付与可能なロールを表示をご覧ください。最も適切な事前定義ロールを特定する必要がある場合は、事前定義ロールを選択するをご覧ください。

必要に応じて、条件を使用して特定の要件が満たされた場合にのみロールを付与できます。

すでに許可ポリシーに含まれているロールを付与するには、既存のロール バインディングにプリンシパルを追加します。

gcloud

プリンシパルを既存のロール バインディングに追加して、許可ポリシーを編集します。この変更は、更新された許可ポリシーを設定するまで有効になりません。

たとえば、許可ポリシーに次のロール バインディングが含まれ、サービス アカウント ユーザーロール(roles/iam.serviceAccountUser)が kai@example.com に付与されているとします。

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com"
  ]
}

同じロールを raha@example.com に付与するには、既存のロール バインディングに raha@example.com を追加します。

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

REST

プリンシパルを既存のロール バインディングに追加して、許可ポリシーを編集します。この変更は、更新された許可ポリシーを設定するまで有効になりません。

たとえば、許可ポリシーに次のロール バインディングが含まれ、サービス アカウント ユーザーロール(roles/iam.serviceAccountUser)が kai@example.com に付与されているとします。

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com"
  ]
}

同じロールを raha@example.com に付与するには、既存のロール バインディングに raha@example.com を追加します。

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

まだ許可ポリシーに含まれていないロールを付与するには、新しいロール バインディングを追加します。

gcloud

プリンシパルにロールを付与する新しいロール バインディングを追加して、許可ポリシーを編集します。この変更は、更新された許可ポリシーを設定するまで有効になりません。

たとえば、サービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を raha@example.com に付与するには、次のロール バインディングを許可ポリシーの bindings 配列に追加します。

{
  "role": "roles/iam.serviceAccountTokenCreator",
  "members": [
    "user:raha@example.com"
  ]
}

REST

プリンシパルにロールを付与する新しいロール バインディングを追加して、許可ポリシーを編集します。この変更は、更新された許可ポリシーを設定するまで有効になりません。

たとえば、サービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を raha@example.com に付与するには、次のロール バインディングを許可ポリシーの bindings 配列に追加します。

{
  "role": "roles/iam.serviceAccountTokenCreator",
  "members": [
    "user:raha@example.com"
  ]
}

ロールを取り消す

ロールを取り消すには、ロール バインディングからプリンシパルを削除します。ロール バインディングに他のプリンシパルがない場合は、許可ポリシーからロール バインディング全体を削除します。

gcloud

プリンシパルまたはロール バインディング全体を削除して、許可ポリシーを編集します。この変更は、更新された許可ポリシーを設定するまで有効になりません。

たとえば、許可ポリシーに次のロール バインディングが含まれ、kai@example.comraha@example.com にサービス アカウント ユーザーロール(roles/iam.serviceAccountUser)が付与されているとします。

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

kai@example.com のロールを取り消すには、kai@example.com をロール バインディングから削除します。

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:raha@example.com"
  ]
}

kai@example.comraha@example.com の両方のロールを取り消すには、許可ポリシーからロール バインディングを削除します。

REST

プリンシパルまたはロール バインディング全体を削除して、許可ポリシーを編集します。この変更は、更新された許可ポリシーを設定するまで有効になりません。

たとえば、許可ポリシーに次のロール バインディングが含まれ、kai@example.comraha@example.com にサービス アカウント ユーザーロール(roles/iam.serviceAccountUser)が付与されているとします。

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

kai@example.com のロールを取り消すには、kai@example.com をロール バインディングから削除します。

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:raha@example.com"
  ]
}

kai@example.comraha@example.com の両方のロールを取り消すには、許可ポリシーからロール バインディングを削除します。

許可ポリシーを設定する

ロールを付与または取り消すように許可ポリシーを変更した後、setIamPolicy() を呼び出して更新します。

gcloud

リソースの許可ポリシーを設定するには、サービス アカウントを指定して set-iam-policy コマンドを実行します。

gcloud iam service-accounts set-iam-policy SA_ID PATH

次の値を指定します。

  • SA_ID: サービス アカウントの ID。これは、サービス アカウントのメールアドレス(SA_NAME@PROJECT_ID.iam.gserviceaccount.com の形式)か、サービス アカウントの一意の数値 ID のいずれかです。

  • PATH: 新しい許可ポリシーを含むファイルのパス。

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

たとえば、次のコマンドは、policy.json に保存されている許可ポリシーをサービス アカウント my-service-account@my-project.iam.gserviceaccount.com の許可ポリシーとして設定します。

gcloud iam service-accounts set-iam-policy my-service-account@my-project.iam.gserviceaccount.com \
    ~/policy.json

REST

serviceAccounts.setIamPolicy メソッドは、サービス アカウントに更新後の許可ポリシーを設定します。

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

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
  • 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
}

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

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

Java

IAM のクライアント ライブラリをインストールして使用する方法については、IAM クライアント ライブラリをご覧ください。詳細については、IAM Java API のリファレンス ドキュメントをご覧ください。

IAM で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

import com.google.cloud.iam.admin.v1.IAMClient;
import com.google.iam.admin.v1.ServiceAccountName;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import com.google.protobuf.FieldMask;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class SetServiceAccountPolicy {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your project ID.
    String projectId = "your-project-id";
    // TODO: Replace with your service account name.
    String serviceAccount = "your-service-account";
    // TODO: Replace with your policy, GetPolicy.getPolicy(projectId, serviceAccount).
    Policy policy = Policy.newBuilder().build();

    setServiceAccountPolicy(policy, projectId, serviceAccount);
  }

  // Sets a service account's policy.
  public static Policy setServiceAccountPolicy(Policy policy, String projectId,
                                               String serviceAccount) throws IOException {

    // Construct the service account email.
    // You can modify the ".iam.gserviceaccount.com" to match the name of the service account
    // whose allow policy you want to set.
    String accountEmail = String.format("%s@%s.iam.gserviceaccount.com", serviceAccount, projectId);

    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (IAMClient iamClient = IAMClient.create()) {
      List<String> paths = Arrays.asList("bindings", "etag");
      SetIamPolicyRequest request = SetIamPolicyRequest.newBuilder()
              .setResource(ServiceAccountName.of(projectId, accountEmail).toString())
              .setPolicy(policy)
              // A FieldMask specifying which fields of the policy to modify. Only
              // the fields in the mask will be modified. If no mask is provided, the
              // following default mask is used:
              // `paths: "bindings, etag"`
              .setUpdateMask(FieldMask.newBuilder().addAllPaths(paths).build())
              .build();

      return iamClient.setIamPolicy(request);
    }
  }
}

Python

IAM のクライアント ライブラリをインストールして使用する方法については、IAM クライアント ライブラリをご覧ください。詳細については、IAM Python API のリファレンス ドキュメントをご覧ください。

IAM で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

from google.cloud import iam_admin_v1
from google.iam.v1 import iam_policy_pb2, policy_pb2


def set_service_account_iam_policy(
    project_id: str, account: str, policy: policy_pb2.Policy
) -> policy_pb2.Policy:
    """
    Set policy for service account. Pay attention that previous state will be completely rewritten.
    If you want to update only part of the policy follow the approach read->modify->write.
    For more details about policies check out https://cloud.google.com/iam/docs/policies

    project_id: ID or number of the Google Cloud project you want to use.
    account: ID or email which is unique identifier of the service account.
    policy: Policy which has to be set.
    """

    # Same approach as for policies on project level, but client stub is different.
    iam_client = iam_admin_v1.IAMClient()
    request = iam_policy_pb2.SetIamPolicyRequest()
    request.resource = f"projects/{project_id}/serviceAccounts/{account}"

    # request.etag field also will be merged which means you are secured from collision,
    # but it means that request may fail and you need to leverage exponential reties approach
    # to be sure policy has been updated.
    request.policy.MergeFrom(policy)

    policy = iam_client.set_iam_policy(request)
    return policy

次のステップ

使ってみる

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

無料で開始