概要
GoogleCloudのIAMにおいて、ユーザやサービスアカウントの権限の棚卸しをする際に、とあるIAMパーミッションがどのロール・ユーザ(メンバー)に含まれるか調べる方法です。
事前に以下を知っておくとイメージが付きやすいです。
手順
ロールやユーザ(メンバー)の関係図は次のようになっています。

なので権限に紐付くロールやユーザを抽出する手順は以下の通りです。
- 対象とする権限がどのロールに含まれるかを抽出する
- 1のロールと紐付いている(バインドされている)ユーザを抽出する
対象とする権限がどのロールに含まれるかを抽出する
対象とする権限がどのロールに含まれるかは、次の手順で抽出します。
1. ロールの一覧を取得する
基本ロール、事前定義されたロール一覧を取得します。
$ gcloud iam roles list --format='value(name)' > roles_list.txt
すると次のようなロール一覧が取得できます。
roles/accessapproval.approver roles/accessapproval.configEditor roles/accessapproval.invalidator roles/accessapproval.viewer roles/accesscontextmanager.gcpAccessAdmin roles/accesscontextmanager.gcpAccessReader roles/accesscontextmanager.policyAdmin roles/accesscontextmanager.policyEditor roles/accesscontextmanager.policyReader roles/accesscontextmanager.vpcScTroubleshooterViewer ...
2. ロールが持つパーミッションを取得
ディレクトリrolesを用意し、次のようなスクリプトを用意します。
while read -r role; do echo $role gcloud iam roles describe "$role" --format=json > "$role.json" done < roles_list.txt
実行すると、次のようのロールが持つパーミッションの詳細が、個別ファイル化されて取得できます。
{ "description": "Read-only access to Cloud AlloyDB all resources.", "etag": "AA==", "includedPermissions": [ "alloydb.backups.get", "alloydb.backups.list", "alloydb.backups.listEffectiveTags", "alloydb.backups.listTagBindings", "alloydb.clusters.export", "alloydb.clusters.get", "alloydb.clusters.list", "alloydb.clusters.listEffectiveTags", "alloydb.clusters.listTagBindings", "alloydb.databases.list", "alloydb.instances.get", "alloydb.instances.list", "alloydb.locations.get", "alloydb.locations.list", "alloydb.operations.get", "alloydb.operations.list", "alloydb.supportedDatabaseFlags.get", "alloydb.supportedDatabaseFlags.list", "alloydb.users.get", "alloydb.users.list", "cloudaicompanion.entitlements.get", "recommender.alloydbClusterPerformanceInsights.get", "recommender.alloydbClusterPerformanceInsights.list", "recommender.alloydbClusterPerformanceRecommendations.get", "recommender.alloydbClusterPerformanceRecommendations.list", "recommender.alloydbClusterReliabilityInsights.get", "recommender.alloydbClusterReliabilityInsights.list", "recommender.alloydbClusterReliabilityRecommendations.get", "recommender.alloydbClusterReliabilityRecommendations.list", "resourcemanager.projects.get", "resourcemanager.projects.list" ], "name": "roles/alloydb.viewer", "stage": "BETA", "title": "Cloud AlloyDB Viewer" }
3. 該当するパーミッションのロールを抽出する
$ rg alloydb.backups.delete roles/dlp.projectdriver.json 6: "alloydb.backups.deleteTagBinding", roles/resourcemanager.tagUser.json 6: "alloydb.backups.deleteTagBinding", roles/owner.json 399: "alloydb.backups.delete", 400: "alloydb.backups.deleteTagBinding", roles/alloydb.admin.json 7: "alloydb.backups.delete", 8: "alloydb.backups.deleteTagBinding", roles/dlp.orgdriver.json 6: "alloydb.backups.deleteTagBinding", roles/editor.json 385: "alloydb.backups.delete",
ファイル名=roleなので、これで特定のIAMパーミッションを含むロールが一覧化できました。
ロールと紐付いている(バインドされている)ユーザを抽出
次にロールに紐付くユーザ(メンバー)を抽出します。
IAMポリシー一覧を取得する
まずIAMポリシー一覧を取得します。これは全ての紐付きを返してくれます。
$ gcloud projects get-iam-policy {YOUR_GCP_PJ} --format=json > policy.json
ロールで抽出する
前述のパーミッション→ロール抽出で出てきたロールを元に、ロールにバインドされたユーザを抽出します。
{ "members": [ "group:role.my-gcp-pj@example.com", "serviceAccount:test-service1@my-gcp-pj.iam.gserviceaccount.com" ], "role": "roles/bigtable.admin" },
これにより特定のIAMパーミッションを持つユーザを一覧化できました。
FAQ
カスタムロールの取得は?
カスタムロールを取得したい場合は、--projectフラグでプロジェクトに定義されたカスタムロールを取得します。
1. ロールの一覧を取得する
$ gcloud iam roles list --project={YOUR_GCP_PJ} --format='value(name)' > roles_list.txt
注意としてrolesprefixは基本ロール・事前定義されたロール扱いされてしまうので整形して以下のようにします。
- roles.custom.alloydb.editor - roles.custom.appengine.editor - roles.custom.storage.editor + custom.alloydb.editor + custom.appengine.editor + custom.storage.editor ...
2. ロールが持つパーミッションを取得
ディレクトリcustom_rolesを用意し、次のようなスクリプトを用意します。
while read -r role; do echo $role gcloud iam roles describe "$role" --project={YOUR_GCP_PJ} --format=json > "custom_roles/$role.json" done < custom_roles_list.txt
次のようなパーミッション詳細が個別ファイル化されて取得できます。
{ "description": "Custom AlloyDB Editor", "etag": "GagEABq8ww=", "includedPermissions": [ "alloydb.instances.executeSql", "alloydb.instances.failover" ], "name": "projects/{YOUR_GCP_PJ}/roles/custom.alloydb.editor", "stage": "GA", "title": "Custom AlloyDB Editor" }
まとめ
特定のIAMパーミッションがどのロール・ユーザ(メンバー)に含まれるか調べる方法を説明しました。