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

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

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

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

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

始める前に

必要なロール

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

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

必要な権限

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

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

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

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

Console

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

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

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

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

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

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

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

gcloud

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

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

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

次の値を指定します。

  • SA_ID: サービス アカウントの ID。サービス アカウントのメールアドレスを使用できます。
  • FORMAT: ポリシーの形式。json または yaml を使用します。
  • PATH: ポリシーの新しい出力ファイルのパス。

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

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

REST

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

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

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

  • 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
  }
}

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

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

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

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

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

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

単一ロールの付与

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

Console

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

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

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

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

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

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

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

      Google が管理するサービス アカウントにロールを付与する場合は、[Google 提供のロール付与を含みます] チェックボックスをオンにして、メールアドレスを表示する必要があります。

    • サービス アカウントの他のロールを持っていないプリンシパルにロールを付与するには、[アクセスを許可] をクリックし、プリンシパルのメールアドレスを入力します。

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

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

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

gcloud

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

gcloud iam service-accounts add-iam-policy-binding SA_ID \
    --member=PRINCIPAL --role=ROLE_ID \
    --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_ID: 付与するロールの名前。例: roles/iam.serviceAccountUserロールのリストについては、ロールについてをご覧ください。

  • 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 つのロールを取り消すには、次の手順を行います。

Console

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

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

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

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

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

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

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

gcloud

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

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

次の値を指定します。

  • 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_ID: 取り消すロールの名前。例: roles/iam.serviceAccountUserロールのリストについては、ロールについてをご覧ください。

たとえば、サービス アカウント 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

複数のロールの付与または取り消し

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

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

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

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

gcloud

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

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

次の値を指定します。

  • SA_ID: サービス アカウントの 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 メソッドで、サービス アカウントの IAM ポリシーを取得します。

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

  • 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
  }
}

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

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

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

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

ポリシーを変更する

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

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

ロールを付与する

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

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

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

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

リソースの IAM ポリシーを設定するには、サービス アカウントを指定して 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 メソッドによって、サービス アカウントの更新済み IAM ポリシーが設定されます。

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

  • 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
}

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

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

次のステップ

使ってみる

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

無料で開始