search-all-iam-policiesでIAMを検索する

多くのプロジェクトに関わったエンジニアが退職の意向を示した時、管理者の脳裏に浮かぶのは「どうにかして引き留めよう」ではなく、「個人のIAMで動いてる部分ないだろうか?」ですよね。

「個人のIAMでバッチ処理が実行されていて、いつの間にか止まってた」
なんて事態は避けたいところです。

Google Cloud Consoleで組織の全プロジェクトのIAMを調べるのも良いですが、新たな退職者が増えるだけです。


gcloudコマンドで組織内の全プロジェクトに追加されている特定のアカウントのIAMを調べる

gcloud asset search-all-iam-policiesを使います。
scopeはIAMを検索する検索範囲で、組織・フォルダ・プロジェクトを指定する。最大の範囲は組織です。

--scope organizations/ORGANIZATION_NUMBER
--scope floders/FOLDER_NUMBER
--scope projects/PROJECT_ID or PROJECT_NUMBER

search-all-iam-policiesで取得できるプロジェクト情報はPROJECT_NUMBERでピンとこないので、projects listで取得したプロジェクト情報と結合して、把握しやすいPROJECT_IDに変換します。

下記は指定の組織内で指定のユーザーアカウントにIAMを追加しているPROJECT_IDを取得するシェルスクリプトです。

#!/bin/zsh

target_user=xxx@gcp.biz
organization_id=012345

pjs=$(gcloud projects list --format json | jq -r '.[] | [ .projectId, .projectNumber ] | @csv')

declare -A pj_arr
for pj in $pjs; do
    pj=$(echo $pj | sed -e 's/\"//g')
    pid=$(echo $pj | cut -d , -f 1)
    pno=$(echo $pj | cut -d , -f 2)
    pj_arr[$pno]=$pid
done

pjs=$(gcloud asset search-all-iam-policies --scope organizations/$organization_id --flatten "policy.bindings[].members" --filter "policy.bindings.members:$target_user" --format json | jq -r .[].project | sort | uniq)
for pj in ${pjs}; do
    pj=$(echo $pj | sed -e 's/projects\///')
    echo ${pj_arr[$pj]}
done

実行前の準備

このシェルでIAMを取得するには、実行するユーザーアカウントに組織で下記のIAMを含むロールが割り当てられている必要があります。

resourcemanager.projects.get
cloudasset.assets.searchAllIamPolicies

また、jqが必要なのでインストールしておく。


実行

./search-all-iam.sh

コメント

このブログの人気の投稿

BigQuery テーブルの有効期限を設定する

Cloud Schedulerは必ず実行されるわけではない

ChromebookでAndroidアプリをインストールする方法