G-gen の武井です。
当記事は gcloud と jq コマンドシリーズの第2弾として、Google Cloud (旧称 GCP) の IAM に関する情報の取得方法についてご紹介します。
組織 / フォルダ / プロジェクト 編の記事
組織 / フォルダ / プロジェクト編
については以下の記事をご参照ください。
gcloud
コマンドや jq
コマンドの概要の他、コマンドの実行方法についても解説しています。
組織の IAM Policy
IAM ポリシーの表示
組織の IAM Policy 情報を取得するには、gcloud organizations get-iam-policy
コマンドを使用しますが、その中から特定の値を抽出する方法をいくつかご紹介します。
出力例は以下のとおりです。
$ gcloud organizations get-iam-policy ${ORG_ID} --format=json | \ jq -r '.bindings[]' { "members": [ "group:tech@example001.co.jp" ], "role": "roles/accesscontextmanager.gcpAccessAdmin" } { "members": [ "domain:example001.co.jp" ], "role": "roles/browser" } (〜中略〜) { "members": [ "serviceAccount:service-org-1111111111@security-center-api.iam.gserviceaccount.com" ], "role": "roles/securitycenter.serviceAgent" } { "members": [ "group:tech@example001.co.jp", "serviceAccount:service-org-1111111111@security-center-api.iam.gserviceaccount.com" ], "role": "roles/serviceusage.serviceUsageAdmin" }
プリンシパルの抽出
jq コマンドの利用
members
というキーにプリンシパルが入っています。以下のように gcloud
の出力結果をパイプで jq
コマンドに渡すことで、プリンシパルだけを抽出できます。
$ gcloud organizations get-iam-policy ${ORG_ID} --format=json | \ jq -r '.bindings[] |.members[]' group:tech@example001.co.jp domain:example001.co.jp (〜中略〜) serviceAccount:service-org-1111111111@security-center-api.iam.gserviceaccount.com group:tech@example001.co.jp serviceAccount:service-org-1111111111@security-center-api.iam.gserviceaccount.com
重複値の除外 ( unique 構文 )
IAM Policy は members (プリンシパル)
と role (権限)
の組み合わせなので、プリンシパルに対して複数の権限が紐付いている場合は重複して表示されます。
このような場合、unique
構文を使用すると重複値を除外できます。Linux コマンドで言う uniq
コマンドや SQL で言う DISTINCT
に相当します。
$ gcloud organizations get-iam-policy ${ORG_ID} --format=json | \ jq -r '[.bindings[].members[]] | unique | .[]' domain:example001.co.jp group:it-grp@example001.co.jp group:tech@example001.co.jp serviceAccount:sa-cloud-identity@pj002.iam.gserviceaccount.com serviceAccount:service-org-1111111111@security-center-api.iam.gserviceaccount.com serviceAccount:tf-exec@pj001.iam.gserviceaccount.com user:mike@example001.co.jp user:su@example001.co.jp
以下の例では、最後に sed
コマンドに出力を渡し、プリンシパル種別 (group:
や user:
など) の文字列を消しています。
$ gcloud organizations get-iam-policy ${ORG_ID} --format=json | \ jq -r '[.bindings[].members[]] | unique | .[]' | \ sed -e "s|.*:||" example001.co.jp it-grp@example001.co.jp tech@example001.co.jp sa-cloud-identity@pj002.iam.gserviceaccount.com service-org-1111111111@security-center-api.iam.gserviceaccount.com tf-exec@pj001.iam.gserviceaccount.com mike@example001.co.jp su@example001.co.jp
以下の例では、特定のプリンシパル種別 (user:
) に絞って抽出しています。
$ gcloud organizations get-iam-policy ${ORG_ID} --format=json | \ jq -r '[.bindings[].members[]] | unique | .[] | select(startswith("user:"))' | \ sed -e "s|.*:||" mike@example001.co.jp su@example001.co.jp
特定のプリンシパルに紐づくロールの抽出
以下のように jq
コマンドの select
構文を用いることで、特定のプリンシパルに与えられているロールだけを抽出することもできます。
$ gcloud organizations get-iam-policy ${ORG_ID} --format=json | \ jq -r '.bindings[] | select(.members[] == "group:it-grp@example001.co.jp") | .role' roles/cloudsupport.admin roles/orgpolicy.policyAdmin roles/resourcemanager.folderAdmin roles/resourcemanager.organizationAdmin roles/resourcemanager.projectCreator roles/securitycenter.admin
以下のように roles/
という文字列を除外することができます。
$ gcloud organizations get-iam-policy ${ORG_ID} --format=json | \ jq -r '.bindings[] | select(.members[] == "group:it-grp@example001.co.jp") | .role' | \ sed -e "s|roles/||" cloudsupport.admin orgpolicy.policyAdmin resourcemanager.folderAdmin resourcemanager.organizationAdmin resourcemanager.projectCreator securitycenter.admin
特定の文字列を含むプリンシパルを抽出することも可能です。
$ gcloud organizations get-iam-policy ${ORG_ID} --format=json | \ jq -r '.bindings[] | select(.members[] | test("it-grp")) .role' | \ sed -e "s|roles/||" cloudsupport.admin orgpolicy.policyAdmin resourcemanager.folderAdmin resourcemanager.organizationAdmin resourcemanager.projectCreator securitycenter.admin
特定のロールに紐づくプリンシパルの抽出
以下の例ではオーナー権限を持つプリンシパルを抽出します。
$ gcloud organizations get-iam-policy ${ORG_ID} --format=json | \ jq -r '.bindings[] | select(.role == "roles/owner") | .members[]' serviceAccount:sa-cloud-identity@pj002.iam.gserviceaccount.com user:su@example001.co.jp
フォルダの IAM Policy
フォルダの IAM Policy 情報を取得するには、gcloud resource-manager folders get-iam-policy
コマンドを使用します。
出力例は以下のとおりです。
$ gcloud resource-manager folders get-iam-policy ${FLDR_ID} --format=json | \ jq -r '.bindings[]' { "members": [ "user:su@example001.co.jp" ], "role": "roles/resourcemanager.folderAdmin" } { "members": [ "user:yutakei@example002.co.jp" ], "role": "roles/resourcemanager.folderCreator" } { "members": [ "user:su@example001.co.jp", "user:yutakei@example001.co.jp" ], "role": "roles/resourcemanager.folderEditor" } { "members": [ "user:yutakei@example002.co.jp" ], "role": "roles/resourcemanager.folderViewer" }
先程と同じように、出力をパイプで jq
や sed
に渡すことで、様々な出力の加工が可能です。
プロジェクトの IAM Policy
プロジェクトの IAM Policy 情報を取得するには、gcloud projects get-iam-policy
コマンドを使用します。
出力例は以下のとおりです。
$ gcloud projects get-iam-policy ${PRJ_ID} --format=json | \ jq -r '.bindings[]' { "members": [ "user:yutakei@example001.co.jp" ], "role": "roles/accesscontextmanager.policyAdmin" } { "members": [ "serviceAccount:service-999999999999@gcp-sa-servicemesh.iam.gserviceaccount.com" ], "role": "roles/anthosservicemesh.serviceAgent" } (〜中略〜) { "members": [ "serviceAccount:wada2@pj003.iam.gserviceaccount.com", "serviceAccount:wada@pj003.iam.gserviceaccount.com" ], "role": "roles/secretmanager.secretAccessor" } { "members": [ "serviceAccount:service-999999999999@service-networking.iam.gserviceaccount.com" ], "role": "roles/servicenetworking.serviceAgent" }
やはり先程と同じように、出力をパイプで jq
や sed
に渡して出力を加工できます。
武井 祐介 (記事一覧)
クラウドソリューション部所属。G-gen唯一の山梨県在住エンジニア
Google Cloud Partner Top Engineer 2025 選出。IaC や CI/CD 周りのサービスやプロダクトが興味分野です。
趣味はロードバイク、ロードレースやサッカー観戦です。
Follow @ggenyutakei