Carpe Diem

備忘録

あるIAMパーミッションがどのロール・ユーザに含まれるか調べる方法

概要

GoogleCloudのIAMにおいて、ユーザやサービスアカウントの権限の棚卸しをする際に、とあるIAMパーミッションがどのロール・ユーザ(メンバー)に含まれるか調べる方法です。

事前に以下を知っておくとイメージが付きやすいです。

christina04.hatenablog.com

手順

ロールやユーザ(メンバー)の関係図は次のようになっています。

なので権限に紐付くロールやユーザを抽出する手順は以下の通りです。

  1. 対象とする権限がどのロールに含まれるかを抽出する
  2. 1のロールと紐付いている(バインドされている)ユーザを抽出する

対象とする権限がどのロールに含まれるかを抽出する

対象とする権限がどのロールに含まれるかは、次の手順で抽出します。

  1. ロールの一覧を取得する
  2. ロールの持つパーミッションを取得する
  3. 該当するパーミッションのロールを抽出する

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. 該当するパーミッションのロールを抽出する

最後にgrepを使ってパーミッション名で抽出します。

$ 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パーミッションがどのロール・ユーザ(メンバー)に含まれるか調べる方法を説明しました。