IAM ユーザーが所属している IAM グループとアタッチされている IAM ポリシーの一覧を AWS CLI で取得する

単なる IAM ユーザーの一覧ではなく、所属しているグループとアタッチされたポリシーの内訳も必要な場合に。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

IAM ユーザーの現状を棚卸ししたい

コンバンハ、千葉(幸)です。

IAM ユーザーはきちんと管理されていますか?最近 100名近く IAM ユーザーが存在する環境をご支援する機会がありました。ユーザーがどんなグループに所属していてそれぞれどんな権限を有しているか、きっちりした設計書が無く。まずはそれを棚卸ししてからあるべき構成を考えていきましょう、というアプローチを取りました。

単に IAM ユーザーの一覧を取得するだけであれば以下のエントリにある内容を踏襲すればいいのですが、今回はそれより詳細な情報が必要です。

ということで、AWS CLI で一覧を取得してみました。(その後にスプレッドシートで頑張りました。)

IAM ユーザーに割り当てられるポリシーについておさらい

IAM ユーザー、グループ、ポリシーについておさらいしておきましょう。

  • IAM ユーザー、IAM グループそれぞれに IAM ポリシーをアタッチできる
  • IAM ユーザーは自身が所属する IAM グループにアタッチされた IAM ポリシーを継承する
  • IAM ポリシーには管理ポリシーとインラインポリシーがある *1 *2

つまり、IAM ユーザーに割り当てられた IAM ポリシーを一覧で確認しようとすると以下の情報を取得する必要があります。

  • IAM ユーザーが所属する IAM グループの一覧
  • IAM グループにアタッチされた管理ポリシーの一覧
  • IAM グループにアタッチされたインラインポリシーの一覧
  • IAM ユーザーに直接アタッチされた管理ポリシーの一覧
  • IAM ユーザーに直接アタッチされたインラインポリシーの一覧

全部の情報を統合していい感じに出力できればいいのですが、実現しようとするとかなり複雑になりそうなので、今回はそれぞれ独立した情報で取得します。今回のエントリで行うのはそこまでです。

それらを必要に応じてスプレッドシートで加工・統合して情報を整理してもらえればと思います。

実行環境

今回使用した AWS CLI のバージョンは以下です。特に目新しいコマンドは使わないので、ある程度古いバージョンでも問題なく動作するかと思います。

% aws --version
aws-cli/2.8.8 Python/3.9.11 Darwin/22.1.0 exe/x86_64 prompt/off

また、わたしは主に Mac 端末で実行しましたが、AWS CloudShell でも問題なく動作しました。

IAM ユーザーが所属する IAM グループ一覧の取得

まずは IAM ユーザーごとに、所属する IAM グループの一覧を取得します。これはサーバーワークスさんの以下のエントリを参考にさせていただきました。

コマンドの内容は以下です。

echo "UserName Groups" > /tmp/awscli.tmp
aws iam list-users --query "Users[].[UserName]" --output text | sort | while read line;\
do
   echo ${line} > /tmp/awscli-group.tmp;\
   aws iam list-groups-for-user --user-name ${line} --query "Groups[].[GroupName]" --output text >> /tmp/awscli-group.tmp;\
   cat /tmp/awscli-group.tmp | tr "\n" " " | sed 's/$/\n/g' >> /tmp/awscli.tmp;\
done
column -t /tmp/awscli.tmp;\
rm /tmp/awscli.tmp /tmp/awscli-group.tmp

これの実行結果のイメージはこんな感じ。

UserName         Groups
Chiba            GroupB
Saitama
Kanagawa         GroupA  GroupB  GroupC
test-user-tokyo

出力結果をスプレッドシートに貼り付けて列分割をすればいい感じになります。

IAM_User_List

コマンドの内訳を見てみる

上記のコマンドの内訳を簡単に確認しておきます。

  1. /tmp/awscli.tmpにヘッダーを出力
  2. IAM ユーザーの一覧を取得し、ユーザーごとに以下をループ
    1. /tmp/awscli-group.tmpにユーザー名を出力(上書き)
    2. ユーザーが所属している IAM グループの一覧を/tmp/awscli-group.tmpに出力
    3. /tmp/awscli-group.tmpの内容を「改行を除外」&「末尾に改行を付与」し/tmp/awscli.tmpに出力(追記)
  3. /tmp/awscli.tmpの内容を表形式に整形する
  4. /tmp/awscli.tmp/tmp/awscli-group.tmpを削除

/tmp/awscli-group.tmpがループ処理の中で都度上書きされ、そこでの内容が/tmp/awscli.tmpに追記されて最終出力のベースになる、ということですね。

2.2. の段階における/tmp/awscli-group.tmpの中身はこんな感じ。

Kanagawa
GroupA
GroupB
GroupC

これを 2.3. で以下のような形にして/tmp/awscli.tmpに追記していく、という形です。

Kanagawa GroupA GroupB GroupC

使用されている AWS CLI コマンドは以下の通り。

以降のコマンドも、使用する AWS CLI コマンドが異なるだけで基本的な構文は同様です。

IAM グループにアタッチされた管理ポリシー一覧の取得

echo "GroupName Policies" > /tmp/awscli.tmp
aws iam list-groups --query "Groups[].[GroupName]" --output text | sort | while read line;\
do
   echo ${line} > /tmp/awscli-policy.tmp;\
   aws iam list-attached-group-policies --group-name ${line} --query "AttachedPolicies[].[PolicyName]" --output text >> /tmp/awscli-policy.tmp;\
   cat /tmp/awscli-policy.tmp | tr "\n" " " | sed 's/$/\n/g' >> /tmp/awscli.tmp;\
done
column -t /tmp/awscli.tmp;\
rm /tmp/awscli.tmp /tmp/awscli-policy.tmp

IAM グループにアタッチされたインラインポリシー一覧の取得

echo "GroupName InlinePolicies" > /tmp/awscli.tmp
aws iam list-groups --query "Groups[].[GroupName]" --output text | sort | while read line;\
do
   echo ${line} > /tmp/awscli-policy.tmp;\
   aws iam list-group-policies --group-name ${line} --query "PolicyNames[]" --output text >> /tmp/awscli-policy.tmp;\
   cat /tmp/awscli-policy.tmp | tr "\n" " " | sed 's/$/\n/g' >> /tmp/awscli.tmp;\
done
column -t /tmp/awscli.tmp;\
rm /tmp/awscli.tmp /tmp/awscli-policy.tmp

IAM ユーザーにアタッチされた管理ポリシー一覧の取得

echo "UserName Policies" > /tmp/awscli.tmp
aws iam list-users --query "Users[].[UserName]" --output text | sort | while read line;\
do
   echo ${line} > /tmp/awscli-policy.tmp;\
   aws iam list-attached-user-policies --user-name ${line} --query "AttachedPolicies[].[PolicyName]" --output text >> /tmp/awscli-policy.tmp;\
   cat /tmp/awscli-policy.tmp | tr "\n" " " | sed 's/$/\n/g' >> /tmp/awscli.tmp;\
done
column -t /tmp/awscli.tmp;\
rm /tmp/awscli.tmp /tmp/awscli-policy.tmp

IAM ユーザーにアタッチされたインラインポリシー一覧の取得

echo "UserName InlinePolicies" > /tmp/awscli.tmp
aws iam list-users --query "Users[].[UserName]" --output text | sort | while read line;\
do
   echo ${line} > /tmp/awscli-policy.tmp;\
   aws iam list-user-policies --user-name ${line} --query "PolicyNames[]" --output text >> /tmp/awscli-policy.tmp;\
   cat /tmp/awscli-policy.tmp | tr "\n" " " | sed 's/$/\n/g' >> /tmp/awscli.tmp;\
done
column -t /tmp/awscli.tmp;\
rm /tmp/awscli.tmp /tmp/awscli-policy.tmp

あとはスプレッドシートで頑張ろう

ここまでで大体材料が揃ったので、あとは必要に応じてスプレッドシートで頑張りましょう。

わたしの場合は COUNTIF や VLOOKUP が活躍しました。結局スプレッドシート捏ねてる時がいちばん楽しいですよね。

終わりに

IAM ユーザーについて、所属しているグループ、アタッチされているポリシーを一覧で取得したい、という話でした。

情報を一覧で取得するということにおいてはやはり AWS CLI が便利ですね。IAM ユーザーをきちんと管理できていないな、という場合に活用してもらえればと思います。

テンポラリなファイルに書き込んで終わったら消す、という方式が勉強になりました。

以上、 チバユキ (@batchicchi) がお送りしました。

追記

IAM ロールで同様のことを行うエントリを書きました。

脚注

  1. 管理ポリシーはさらにカスタマー管理ポリシーと AWS 管理ポリシーに分類できますが、ここでは特に区別しないことにします。
  2. インラインポリシーを「アタッチ」というのか?「埋め込み」の方が適切なのでは?という問題もありますが、今回は「アタッチ」という表現でいきます。