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

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"
        ]
    },
    ]
}

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

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

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

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

Console

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

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

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

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

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

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

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

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

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 ポリシーの詳細については、ポリシーをご覧ください。