ぽくつなです

GCP IAM ロールの持つ権限を比較するテク

メンバーやサービスアカウントの権限を考える際に、ロールの持つ権限を比較したいことがしばしばある。そういう時は gclouddiff を使うことで比較できるという素朴なテク。

ロールと権限

ロール(role)は roles/{roleName}, roles/{service}.{roleName} などで表され、許可されている操作を表す権限(permission)の集合である。

例えば BigQuery データ閲覧者 (roles/bigquery.dataViewer) は、以下の permission を持つ。

  • bigquery.datasets.get
  • bigquery.datasets.getIamPolicy
  • bigquery.models.export
  • bigquery.models.getData
  • bigquery.models.getMetadata
  • bigquery.models.list
  • bigquery.routines.get
  • bigquery.routines.list
  • bigquery.tables.createSnapshot
  • bigquery.tables.export
  • bigquery.tables.get
  • bigquery.tables.getData
  • bigquery.tables.getIamPolicy
  • bigquery.tables.list
  • resourcemanager.projects.get
  • resourcemanager.projects.list

cloud.google.com

ロールの比較

個別のロールと権限について確認したいときは以下のドキュメントを見る、GCP 屈指の縦に長いページ

role をいじっていると以下のような疑問が湧いてくることがある。

  • roles/bigquery.dataViewerroles/bigquery.metadataViewer ってテーブルのデータ読める以外に何が違うんだっけ?
  • roles/browserroles/resourcemanager.folderViewer ってどう違うんだっけ?
  • roles/editor は強い権限だけど、意外と SecretManager で出来ない操作あった気がする

上のドキュメントを行ったり来たりしてもいいけど、* でサービス内の個別の permission が省略されていたりするのでいまいち分からないし大変。

diff で比較する

そういう時は gcloud コマンドで role の permission を得つつ、diff で比較するとよい

$ gcloud iam roles describe ROLE で権限のリストが得られるので、これを diff -y で左右に並べる。
(見づらいので間のスペースは適当に削ってある)

roles/bigquery.dataViewerroles/bigquery.metadataViewer の違いは、

$ diff -y -W80 <(gcloud iam roles describe roles/bigquery.dataViewer) <(gcloud iam roles describe roles/bigquery.metadataViewer)
description: Access to view datasets  | description: Access to view table and
etag: AA==                              etag: AA==
includedPermissions:                    includedPermissions:
- bigquery.datasets.get                 - bigquery.datasets.get
- bigquery.datasets.getIamPolicy        - bigquery.datasets.getIamPolicy
- bigquery.models.export              <
- bigquery.models.getData             <
- bigquery.models.getMetadata           - bigquery.models.getMetadata
- bigquery.models.list                  - bigquery.models.list
- bigquery.routines.get                 - bigquery.routines.get
- bigquery.routines.list                - bigquery.routines.list
- bigquery.tables.createSnapshot      <
- bigquery.tables.export              <
- bigquery.tables.get                   - bigquery.tables.get
- bigquery.tables.getData             <
- bigquery.tables.getIamPolicy          - bigquery.tables.getIamPolicy
- bigquery.tables.list                  - bigquery.tables.list
- resourcemanager.projects.get          - resourcemanager.projects.get
- resourcemanager.projects.list         - resourcemanager.projects.list
name: roles/bigquery.dataViewer       | name: roles/bigquery.metadataViewer
stage: GA                               stage: GA
title: BigQuery Data Viewer           | title: BigQuery Metadata Viewer

ほうほう、roles/bigquery.dataViewer はテーブルやモデルのスナップショットやエクスポートも取れるんですね。

includedPermissions 以下だけ欲しいなら --format オプションで中身だけ取ることもできる。
--format='value[delimiter="\\n"](includedPermissions)'
(目で見てわかればよいのであまりやらない)

gcloud の format オプションについてはこちら

roles/browserroles/resourcemanager.folderViewer の違いは、

$ diff -y \
  <(gcloud iam roles describe roles/browser --format='value[delimiter="\\n"](includedPermissions)') \
  <(gcloud iam roles describe roles/resourcemanager.folderViewer --format='value[delimiter="\\n"](includedPermissions)')
                                       > orgpolicy.constraints.list
                                       > orgpolicy.policies.list
                                       > orgpolicy.policy.get
resourcemanager.folders.get              resourcemanager.folders.get
resourcemanager.folders.list             resourcemanager.folders.list
resourcemanager.organizations.get      <
resourcemanager.projects.get             resourcemanager.projects.get
resourcemanager.projects.getIamPolicy  <
resourcemanager.projects.list            resourcemanager.projects.list

フムフム。

多くの permission を持つ権限なら比較したい部分で grep すればいいですね。

roles/editor のうち、SecretManager で、roles/secretmanager.admin より弱いのは、

$ diff -y <(gcloud iam roles describe roles/editor | grep secretmanager) <(gcloud iam roles describe roles/secretmanager.admin | grep secretmanager)
- secretmanager.locations.get           - secretmanager.locations.get
- secretmanager.locations.list          - secretmanager.locations.list
- secretmanager.secrets.create          - secretmanager.secrets.create
- secretmanager.secrets.delete          - secretmanager.secrets.delete
- secretmanager.secrets.get             - secretmanager.secrets.get
- secretmanager.secrets.getIamPolicy    - secretmanager.secrets.getIamPolicy
- secretmanager.secrets.list            - secretmanager.secrets.list
                                      > - secretmanager.secrets.setIamPolicy
- secretmanager.secrets.update          - secretmanager.secrets.update
                                      > - secretmanager.versions.access
- secretmanager.versions.add            - secretmanager.versions.add
- secretmanager.versions.destroy        - secretmanager.versions.destroy
- secretmanager.versions.disable        - secretmanager.versions.disable
- secretmanager.versions.enable         - secretmanager.versions.enable
- secretmanager.versions.get            - secretmanager.versions.get
- secretmanager.versions.list           - secretmanager.versions.list
                                      > name: roles/secretmanager.admin

roles/editor でも、secret に IAM Policy を設定することと、実際の version の読み取りができないのだな〜ということが分かる。

gclouddiff を使うとこういう感じで比較できます。

適切なロールを選ぶとともに、IAM の推奨事項を見て絞ったりできるとよりよいですね。

cloud.google.com