メンバーやサービスアカウントの権限を考える際に、ロールの持つ権限を比較したいことがしばしばある。そういう時は gcloud
と diff
を使うことで比較できるという素朴なテク。
ロールと権限
ロール(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
ロールの比較
個別のロールと権限について確認したいときは以下のドキュメントを見る、GCP 屈指の縦に長いページ
- role から permission
- permission からそれを持つ role
role をいじっていると以下のような疑問が湧いてくることがある。
roles/bigquery.dataViewer
とroles/bigquery.metadataViewer
ってテーブルのデータ読める以外に何が違うんだっけ?roles/browser
とroles/resourcemanager.folderViewer
ってどう違うんだっけ?roles/editor
は強い権限だけど、意外と SecretManager で出来ない操作あった気がする
上のドキュメントを行ったり来たりしてもいいけど、*
でサービス内の個別の permission が省略されていたりするのでいまいち分からないし大変。
diff で比較する
そういう時は gcloud コマンドで role の permission を得つつ、diff で比較するとよい
$ gcloud iam roles describe ROLE
で権限のリストが得られるので、これを diff -y
で左右に並べる。
(見づらいので間のスペースは適当に削ってある)
roles/bigquery.dataViewer
と roles/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/browser
と roles/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 の読み取りができないのだな〜ということが分かる。
gcloud
と diff
を使うとこういう感じで比較できます。
適切なロールを選ぶとともに、IAM の推奨事項を見て絞ったりできるとよりよいですね。