gcloudとjqでGoogle Cloudのリソース情報を取得(IAM編)

記事タイトルとURLをコピーする

G-gen の武井です。

当記事は gcloud と jq コマンドシリーズの第2弾として、Google Cloud (旧称 GCP) の IAM に関する情報の取得方法についてご紹介します。

組織 / フォルダ / プロジェクト 編の記事

組織 / フォルダ / プロジェクト編 については以下の記事をご参照ください。

gcloud コマンドや jq コマンドの概要の他、コマンドの実行方法についても解説しています。

blog.g-gen.co.jp

組織の 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"
}

先程と同じように、出力をパイプで jqsed に渡すことで、様々な出力の加工が可能です。

プロジェクトの 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"
}

やはり先程と同じように、出力をパイプで jqsed に渡して出力を加工できます。

武井 祐介 (記事一覧)

2022年4月にジョイン。クラウドソリューション部所属。G-gen唯一の山梨県在住エンジニア

Google Cloud Partner Top Engineer 2024 に選出。IaC や CI/CD 周りのサービスやプロダクトが興味分野です。

趣味はロードバイク、ロードレースやサッカー観戦です。