GCP (IAM)

GCP のリソースに対する権限を管理する。 Cloud IAM は追加料金なしで利用できる。

IAM では 3 つの設定をする。

  • 誰が
  • どのリソースに対して
  • 何ができるか

組織内の各ユーザが、業務に必要な最小限の権限だけを持つように設定することが大事。

メンバ

誰がに設定できるものは次のものがある。

  • Google アカウント または Cloud Identity ユーザ
  • Google グループ
  • G Suite ドメイン または Cloud Identity
  • サービスアカウント: アプリに属するアカウント

他に特殊な設定値として次のものがある。

  • allAuthenticatedUsers: Google アカウントまたはサービスアカウントで認証されたユーザ全員
  • allUsers: ネット上の全員

役割

Primitive(基本の役割)

基本の役割では、プロジェクト内の全リソースに対する権限を設定できる。

  • Viewer(閲覧者) リソースの表示ができるが、リソースの状態を変更することはできない。
  • Editor(編集者) Viewer の権限に加えて、リソースの状態を変更できる。
  • Owner(オーナー) Editor の権限に加えて、リソースに対する役割と権限を管理でき、課金の設定もできる。

課金管理アカウントを作る場合は、リソースの変更権限を持たず、課金設定可能なアカウントとして作成するとよい。

Pre defined roles(事前定義された役割)

特定のリソースに対してできる操作の権限を設定できる。 例えば、次のような役割を設定できる

ある G Suites チームは、projectA のすべての Compute Engine の管理権限をもつ

Custom roles(カスタムの役割)

カスタムの役割は、組織レベル、プロジェクトレベルでのみ使用できる。 フォルダレベルでは使用できない。

より細かい権限管理ができるが、権限を管理するコストが生まれるため、カスタムの役割は使うかどうかをよく考えること。

サービスアカウント

ユーザではなく、特定の Compute Engine に権限を与えたい場合などに利用する。 例えば、アプリが Cloud Storage にデータを保存する場合に、インターネット上のユーザからはデータを読み取れないようにし、データにアクセスできるのはアプリからのみとしたい場合など。

サービスアカウントのアカウント名、パスワードは次のようになる。

  • アカウント名 = メールアドレス
  • パスワード = 暗号鍵

IAM ポリシー

Cloud IAM は「Cloud IAM ポリシー」を作成してユーザに役割を付与できる。 ポリシーは、組織レベル、プロジェクトレベル、リソースレベルで設定できる。 上の階層で設定したポリシーは、下の階層に引き継ぐ。

下位のポリシーが優先されるため、例えば次の場合、該当ユーザはバケットの書き込み権限を得るようになる。

  • 組織ポリシーでバケットの読み取りのみを許可
  • プロジェクトポリシーでバケットの読み書きを許可
組織
  - プロジェクトA
    Compute Engine
    App Engine
    ...
  - プロジェクトB
    Cloud Pub/Sub
    Cloud Storage
    ...
  ...

IAM 管理

権限付与には次の方法がある。

  • GCP の GUI
  • Google IAM API を使用したアプリ
  • gcloud(CLI)

また、フォルダを作り複数のプロジェクトをまとめることもできる。

組織
  - フォルダA
    - プロジェクトA
    - プロジェクトB
  - フォルダB
    - プロジェクトC
    - プロジェクトD

フォルダを作る場合は組織が必須で、組織を作るためには G Suite Domain が必要。 G Suite Domain がある場合は自動的に組織が作られる。 G Suite Domain がない場合は Google Cloud ID を使うと組織が作成できる。

::: info 組織を作ったあとは、まず次をやっておくのがおすすめ。

  • プロジェクトや課金アカウントを作成できる人を限定する :::

gcloud で IAM 管理

ロールの表示:

gcloud projects get-iam-policy <PROJECT_ID>

# ユーザに対するRoleのみ表示
gcloud projects get-iam-policy <PROJECT_ID> \
  --flatten="bindings[].members" \
  --filter="bindings.members:user:" \
  --format='table(bindings.members,bindings.role)'

ロールの付与:

gcloud projects add-iam-policy-binding <PROJECT_ID> \
  --member user:<USER_NAME> \
  --role <ROLE>

# ex: 特定のユーザに閲覧権限を付与
gcloud projects add-iam-policy-binding my-project \
  --member user:test-user@gmail.com \
  --role roles/viewer

# ex: 特定のサービスアカウントにPub/Subのパブリッシュ権限を付与
gcloud projects add-iam-policy-binding my-project \
  --member serviceAccount:test-user@my-project.iam.gserviceaccount.com \
  --role roles/pubsub.publisher

USER_NAMEは gmail アドレスなどを、ROLEはロールの名前(roles/viewerなど)を指定する。

指定できるロールの一覧はココを参照: https://cloud.google.com/iam/docs/understanding-roles

ロールの削除:

gcloud projects remove-iam-policy-binding <PROJECT_ID> \
  --member user:<USER_NAME> \
  --role <ROLE>

# ex
gcloud projects remove-iam-policy-binding my-project \
  --member user:test-user@gmail.com \
  --role roles/viewer

add-iam-policy-bindingremove-iam-policy-bindingに変わっただけ。

サービスアカウントの作成

サービス アカウントの作成と管理

gcloud beta iam service-accounts create [SA-NAME] \
    --description "[SA-DESCRIPTION]" \
    --display-name "[SA-DISPLAY-NAME]"

サービスアカウントの鍵を作成する

gcloud iam service-accounts keys create ~/key.json \
  --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

Ref: https://cloud.google.com/iam/docs/creating-managing-service-account-keys?hl=ja