サービス アカウントへの役割の付与

IAM の役割を付与する際には、サービス アカウントをリソースまたは ID として扱うことができます。

アプリケーションでは、Google Cloud Platform サービスに対する認証のためにサービス アカウントを ID として使用します。たとえば、Compute Engine 仮想マシン(VM)をサービス アカウントとして実行している場合は、プロジェクト(リソース)のサービス アカウント(ID)に編集者の役割を付与できます。

それに加えて、誰が VM を起動できるかを制御することもできます。そのためには、サービス アカウント(リソース)に関する serviceAccountUser の役割をユーザー(ID)に付与します。

サービス アカウントの詳細と、サービス アカウントのリソースや ID としてのその他の使用例については、サービス アカウントをご覧ください。

このガイドの前提条件

  • このガイドのコマンドライン サンプルを使用する場合は、gcloud コマンドライン ツールをインストールします。

  • 役割についてを読んで、サービス アカウントに付与できる事前定義された役割のリストを確認します。

リソースに対する役割をサービス アカウントに付与する

サービス アカウントに役割を付与すると、Cloud Platform プロジェクトのリソースに対して特定の操作を行う権限も付与されます。たとえば、storage.admin の役割をサービス アカウントに付与すると、Google Cloud Storage のオブジェクトやバケットを管理できるようになります。

サービス アカウントに役割を付与するには、以下のいずれかの方法に従います。

Console

サービス アカウントの役割は、プロジェクト内のユーザーの役割を管理するのと同じ方法で管理できます。

  1. Cloud Console で [IAM と管理] ページを開きます。

    [IAMと管理] ページを開く

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

  3. 役割を追加するサービス アカウントを特定します。

    • サービス アカウントがまだメンバーリストに含まれていない場合、サービス アカウントには何も役割が割り当てられていません。[追加] をクリックし、サービス アカウントのメールアドレスを入力します。
    • このサービス アカウントがすでにメンバーリストに含まれている場合、サービス アカウントには既存の役割があります。サービス アカウントの役割を編集するには、編集 ボタンをクリックします。
  4. サービス アカウントに適用する 1 つ以上の役割を選択します。

  5. 保存をクリックして、サービス アカウントに役割を適用します。

gcloud

単一のサービス アカウントに役割を追加します。

gcloud projects add-iam-policy-binding my-project-123 \
      --member serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com \
      --role roles/editor
    

コマンドから更新したポリシーが出力されます。

bindings:
    - members:
      - user:email1@example.com
      role: roles/owner
    - members:
      - serviceAccount:our-project-123@appspot.gserviceaccount.com
      - serviceAccount:123456789012-compute@developer.gserviceaccount.com
      - serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com
      - user:email3@example.com
      role: roles/editor
    - members:
      - user:email2@example.com
      role: roles/viewer
    etag: BwUm38GGAQk=
    version: 1
    

サービス アカウントへのアクセスをプロジェクト用の ID として許可する手順については、プロジェクト メンバーへのアクセス権の付与、変更、取り消しを参照してください。

API

次の POST リクエストは、projects.setIamPolicy() メソッドを使用して編集者にプロジェクト my-project-123 のサービス アカウント my-sa-123 へのアクセス権を付与します。リクエストの本文には、サービス アカウントに権限を付与する新しいポリシーが含まれている必要があります。各役割には複数のメンバーを含めることができます。

POST https://cloudresourcemanager.googleapis.com/v1/projects/my-project-123:setIamPolicy

    {
        "policy":
        {
            "version": 1,
            "etag": "BwUqMvZQGfo=",
            "bindings": [
            {
                "role": "roles/editor",
                "members": [
                    "serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com",
                    "user:alice@example.com"
                ]
            },
            {
                "role":"roles/owner",
                "members":
                [
                    "user:bob@example.com",
                ]
            },
            {
                "role":"roles/viewer",
                "members":
                [
                    "user:john@example.com",
                ]
            },
            {
                "role":"roles/iam.serviceAccountUser",
                "members":
                [
                    "user:alice@example.com"
                ]
            },
            ]
        },
    }
    

レスポンスには次のように新しいポリシーが含まれています。

{
        "version": 1,
        "etag": "BwUqMvZQGfo=",
        "bindings": [
        {
            "role": "roles/editor",
            "members": [
                "serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com",
                "user:alice@example.com"
            ]
        },
        {
            "role":"roles/owner",
            "members":
            [
                "user:bob@example.com",
            ]
        },
        {
            "role":"roles/viewer",
            "members":
            [
                "user:john@example.com",
            ]
        },
        {
            "role":"roles/iam.serviceAccountUser",
            "members":
            [
                "user:alice@example.com"
            ]
        },
        ]
    }
    

サービス アカウントに付与された役割の表示

サービスア カウントの役割は、プロジェクト内のユーザーと同じ方法で表示できます。

  • Cloud Console で IAM ページを開きます。

    [IAM] ページを開く

  • [プロジェクトを選択] をクリックします。
  • プロジェクトを選択し、[開く] をクリックします。
  • プロジェクトに関連付けられたメンバーのリストでサービス アカウントを探します。サービス アカウントの役割は、役割の列に表示されます。

サービス アカウントへの所有権とアクセスの構成

ID ではなくリソースとして扱うことで、特定のユーザーが所有権を持ち、サービス アカウントとその設定にアクセスすることを許可できます。このセクションの手順では、サービス アカウントをリソースとして扱います。使用タイプごとの違いの詳細については、サービス アカウント トピックをご覧ください。

基本的なプロジェクト オーナーの役割とプロジェクト編集者の役割を持つユーザーは、すでにサービス アカウントを変更できますが、サービス アカウント リソースに対して特定のアクションのみを実行できるように、一部のユーザーのアクセスを制限することをおすすめします。

サービス アカウントにユーザー権限を付与する方法は以下のとおりです。

Console

  1. Cloud Console で [IAM と管理] ページを開きます。

    [IAMと管理] ページを開く

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

  3. 左側のナビゲーション メニューで [サービス アカウント] をクリックします。

  4. サービス アカウントを選択し、情報パネルを表示をクリックします。サービス アカウントにアクセスできるすべてのユーザーが表示されます。

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

  6. プロジェクト メンバーのメールアドレスを追加します。

  7. メンバーの役割を選択して、メンバーがサービス アカウントに対して実行できるアクションを指定します。

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

gcloud

すべてのポリシーの更新

まず、変更するポリシーを取得し、JSON ファイルに書き込みます。--format フラグを使用すると、出力形式を選択できます(選択できる出力形式は JSON、YAML、テキストです)。このページの他の例では、デフォルトのテキストでの出力形式を使用していますが、この例では JSON ファイル(policy.json)に出力を書き込んで、既存のポリシーを変更した後、設定しています。

gcloud iam service-accounts get-iam-policy \
      my-sa-123@my-project-123.iam.gserviceaccount.com \
      --format json > policy.json
    

このコマンドは、サービス アカウント自体に設定されているポリシーのみを返します。サービス アカウントに対して既存のポリシーが設定されていない場合、JSON ファイルの内容は次のようになります。

{
      "etag": "ACAB"
    }
    

既存のポリシーが存在しない場合は、以下の手順を使用して単一のバインディングで新しいポリシーを設定するか、それ以降の手順を使用して JSON をテンプレートとして手動でポリシーを作成します。

ポリシーがすでに有効になっている場合、出力される policy.json ファイルの内容は次のようになります。

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

次に、テキスト エディタで policy.json ファイルを変更し、グループ メンバーとその役割を定義する bindings 配列に新しいオブジェクトを追加します。bindings 配列がまだ存在しない場合は、それを作成します。serviceAccountUser 役割を alice@example.com に付与するには、上記の例を次のように変更します。

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

次のコマンドを実行して、ポリシーを更新します。

gcloud iam service-accounts set-iam-policy \
      my-sa-123@my-project-123.iam.gserviceaccount.com policy.json
    

コマンドから更新したポリシーが出力されます。

bindings:
    - members:
      - user:alice@example.com
      role: roles/iam.serviceAccountUser
    - members:
      - bob@example.com
      role: roles/owner
    etag: BwUjMhXbSPU=
    version: 1
    

単一のバインディングの追加:

次のコマンドを実行して、新しいポリシーまたは既存のポリシーに単一のバインディングを追加できます。

gcloud iam service-accounts add-iam-policy-binding \
      my-sa-123@my-project-123.iam.gserviceaccount.com \
      --member='user:jane@example.com' --role='roles/editor'
    

コマンドから更新したポリシーが出力されます。

bindings:
    - members:
      - user:alice@example.com
      role: roles/iam.serviceAccountUser
    - members:
      - user:bob@example.com
      role: roles/owner
    - members:
      - user:jane@example.com
      role: roles/editor
    etag: BwUqKjVeua8=
    version: 1
    

バインドの削除

次のコマンドを実行すると、既存のポリシーからバインドを 1 つ削除できます。

gcloud iam service-accounts remove-iam-policy-binding \
        my-sa-123@my-project-123.iam.gserviceaccount.com \
        --member='user:jane@example.com' --role='roles/editor'
    

コマンドから更新したポリシーが出力されます。

bindings:
    - members:
      - user:alice@example.com
      role: roles/iam.serviceAccountUser
    - members:
      - user:bob@example.com
      role: roles/owner
    etag: BwUqNkVeua8=
    version: 1
    

API

リクエスト:

POST https://iam.googleapis.com/v1/projects/my-project-123/serviceAccounts/my-sa-123@my-project-123.iam.gserviceaccount.com:setIamPolicy
    

リクエストの本文には、付与するポリシーを含める必要があります。

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

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

{
        "etag": "BwUqMqbViM8=",
        "bindings": [
        {
            "role": "roles/iam.serviceAccountUser",
            "members": [
                "user:alice@example.com"
            ]
        },
        {
            "role": "roles/owner",
            "members": [
            "user:bob@example.com"
            ]
        }
        ]
    }
    

サービス アカウントに関する既存の役割の表示

サービス アカウントはリソースとして扱われるため、他の Google Cloud リソースと同様に Cloud IAM ポリシーが関連付けられています。したがって、サービス アカウントに役割を付与されたメンバーを閲覧するには、serviceAccounts.getIamPolicy() メソッド、Cloud Console、gcloud ツールのいずれかを使用して Cloud IAM ポリシーを取得します。

Console

  1. Cloud Console で [IAM と管理] ページを開きます。

    [IAMと管理] ページを開く

  2. [プロジェクトを選択] をクリックし、プロジェクトを選択して [開く] をクリックします。 このページには、すべてのユーザーと、このプロジェクトの役割が一覧表示されます。

  3. 左側のナビゲーション メニューで [サービス アカウント] をクリックします。

  4. 目的のサービス アカウントの横にあるチェックボックスをオンにして、情報パネルを表示をクリックします。選択したサービス アカウントに付与されている役割の一覧が表示されます。各役割を展開して表示すると、その役割が付与されたサービス アカウントを持つメンバーを閲覧できます。

gcloud

サービス アカウントのポリシーを取得するには、次のコマンドを実行します。

gcloud iam service-accounts get-iam-policy \
        my-sa-123@my-project-123.iam.gserviceaccount.com
    

次のように、ポリシーが出力されます。

bindings:
    - members:
      - user:bob@example.com
      role: roles/owner
    - members:
      - user:alice@example.com
      role: roles/iam.serviceAccountUser
    etag: BwUqLaVeua8=
    version: 1
    

役割をサービス アカウントにまだ割り当てていない場合、出力には etag 値だけが表示されます。

etag: ACAB
    

API

次のコード スニペットでは、サービス アカウント my-sa-123@my-project-123.iam.gserviceaccount.com に対する IAM ポリシーを取得しています。

リクエスト:

POST https://iam.googleapis.com/v1/projects/my-project-123/serviceAccounts/my-sa-123@my-project-123.iam.gserviceaccount.com:getIamPolicy
    
Response:

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

役割をサービス アカウントにまだ割り当てていない場合、レスポンスには 1 つの etag 値だけが含まれます。

{
      "etag": "ACAB"
    }
    

IAM ポリシーの詳細については、ポリシーをご覧ください。