IAMは整理しなければユーザやロールがどんどん増えていくもの。
長期間使用していないユーザは棚卸し漏れの可能性もありますし、定期的にチェックするのが望ましいです。
長期間使われていないからといっていきなり削除するのではなく、関係者にヒアリングしたい場合もあると思うので、エクセルで開きやすいようにCSVで出します。
前提としてAWS CLIとjqコマンドを使うのでまだインストールしていない人は下記参照してください。
コード
次のコードをコピペして保存してください。
#! /bin/bash
# この日付以降使用されていないユーザをリストアップ。IAMロールは400日以上使用されていないものをリストアップ
date=2021-04-01
IFS=$'\n'
echo '種別,名前,ARN,ID,作成日,最終使用日'
aws iam list-users | jq \
".Users[] | select(.PasswordLastUsed < \"$date\") |
if has(\"PasswordLastUsed\") then . else .PasswordLastUsed|=\"パスワード無しor使用していない\" end |
[
\"IAMユーザ\",
.UserName,
.Arn,
.UserId,
.CreateDate,
.PasswordLastUsed
]
| @csv" -r
accesskeys=`aws iam list-access-keys --profile ss | jq '.AccessKeyMetadata[].AccessKeyId' -r`
for accesskey in $accesskeys; do
aws iam get-access-key-last-used --access-key-id $accesskey --profile ss | jq \
"select(.AccessKeyLastUsed.LastUsedDate < \"$date\") |
if .AccessKeyLastUsed.LastUsedDate!=null then . else .AccessKeyLastUsed.LastUsedDate|=\"使用していない\" end |
[
\"IAMユーザ アクセスキー\",
.UserName,
\"\",
\"$accesskey\",
\"\",
.AccessKeyLastUsed.LastUsedDate
] | @csv" -r
done
rolenames=`aws iam list-roles | jq '.Roles[].RoleName' -r`
for role in $rolenames; do
aws iam get-role --role-name $role --profile ss | jq \
'.Role| select(.RoleLastUsed == {}) | [
"IAM Role",
.RoleName,
.Arn,
.RoleId,
.CreateDate,
"400日以上前"
] | @csv' -r
done
保存後は実行権限をつけください。
chmod +x get-unused-iam-users.sh
こんな感じに実行してCSV保存。ロールとかユーザ多いとちょっと時間かかります。
./get-unused-users.sh > unused-iam-users.csv
CSVをエクセル等で開くとこのようにIAMユーザ、IAMユーザのアクセスキー、IAMロールのうち最近使用されていないものを確認できる。
ロジック
すべてAWS CLIで情報取得し、jqコマンドで整形しています。興味がある方はスクリプト見てみてください。
IAMユーザ
コードの4行目、「date=2021-04-01」というところで基準の日付を設定しています。この日付より以前にしかログインしていないユーザを出力。この日付は自分の好きなものに変更してもらって大丈夫。
最終使用日のカラムに最終使用日の日付と時間がでますが、2015年以前にしか使用していなかったり、パスワードが設定されていないものは、「パスワード無しor使用していない」と表示されます。
IAMユーザ アクセスキー
IAMユーザと同じくコードの4行目、「date=2021-04-01」というところで基準の日付を設定しています。
ARNと作成日は今回は空白で出力されます。
最終使用日のカラムに最終使用日の日付と時間がでますが、2015年以前にしか使用していなかったり、そもそも使っていない場合は「使用していない」と表示されます。
IAMユーザでパスワード使ってマネジメントコンソールにはログインしていないけど、CLIとかでは使っているという場合もあるのでIAMユーザとIAMユーザ アクセスキーの両方を見て管理されるのが良いかと思います。
IAMロール
RoleLastUsedというプロパティを使っています。これには400日以内に何かしらのアクティビティがあれば日付が入り、400日間動きがなければ何も値が入りません。
今回はこのプロパティに何も値が入っていない、つまり400日以上アクティビティがないIAMロールを出力しています。