{ユーザー名}.txt
のような形でユーザー数分のテキストファイルが出るようになれば、対外的に適切なユーザー管理している資料として十分なので、作成しました。
s3user.txt
-----------------------------------------------------------
| GetUser |
+---------------------------------------------------------+
|| User ||
|+-------------+-----------------------------------------+|
|| Arn | arn:aws:iam::123456789012:user/s3user ||
|| CreateDate | 2018-01-01T20:00:00+00:00 ||
|| Path | / ||
|| UserId | ABCDEFGHIJKLMNOYQRSTU ||
|| UserName | s3user ||
|+-------------+-----------------------------------------+|
------------------
|ListUserPolicies|
+----------------+
------------------------------------------------------------------------
| ListAttachedUserPolicies |
+----------------------------------------------------------------------+
|| AttachedPolicies ||
|+---------------------------------------------+----------------------+|
|| PolicyArn | PolicyName ||
|+---------------------------------------------+----------------------+|
|| arn:aws:iam::aws:policy/AmazonS3FullAccess | AmazonS3FullAccess ||
|+---------------------------------------------+----------------------+|
----------------------------------
| GetPolicyVersion |
+--------+----------+------------+
| Action | Effect | Resource |
+--------+----------+------------+
| s3:* | Allow | * |
+--------+----------+------------+
-------------------
|ListGroupsForUser|
+-----------------+
簡単かと思いきや、権限がユーザーグループ経由かユーザー直アタッチの場合分けと、更にlist-attached-user-policies
とlist-user-policies
から両方取る必要があり、かつその後のパーミッション詳細のとり方まで違い、多くのコマンドが必要になってしまいました。
上記の一人分を出すために以下のスクリプトを作りました。
one.sh
#!/bin/bash
set -e
if [[ -z "${USERNAME}" ]]; then
USERNAME=$(aws iam get-user --query 'User.UserName' --output text)
fi
aws iam get-user --user-name $USERNAME --output table
aws iam list-user-policies --user-name $USERNAME --output table
for POLICY_NAME in $(aws iam list-user-policies --user-name $USERNAME --query "PolicyNames" --output text) ; do
aws iam get-user-policy --user-name $USERNAME --policy-name $POLICY_NAME --output table
done
aws iam list-attached-user-policies --user-name $USERNAME --output table
for POLICY_ARN in $(aws iam list-attached-user-policies --user-name $USERNAME --query "AttachedPolicies[].PolicyArn" --output text) ; do
VERSION=$(aws iam get-policy --policy-arn $POLICY_ARN --output json --output text --query "Policy.DefaultVersionId")
aws iam get-policy-version --version-id $VERSION --policy-arn $POLICY_ARN --query "PolicyVersion.Document.Statement" --output table
done
aws iam list-groups-for-user --user-name $USERNAME --output table
for GROUP in $(aws iam list-groups-for-user --user-name $USERNAME --output text --query "Groups[].GroupName") ; do
aws iam list-group-policies --output table --group-name $GROUP --output table
for POLICY_NAME in $(aws iam list-group-policies --output table --group-name $GROUP --query "PolicyNames" --output text) ; do
aws iam get-group-policy --group-name $GROUP --policy-name $POLICY_NAME --output table
done
aws iam list-attached-group-policies --output table --group-name $GROUP;
for POLICY_ARN in $(aws iam list-attached-group-policies --group-name $GROUP --query "AttachedPolicies[].PolicyArn" --output text) ; do
VERSION=$(aws iam get-policy --policy-arn $POLICY_ARN --output json --output text --query "Policy.DefaultVersionId")
aws iam get-policy-version --version-id $VERSION --policy-arn $POLICY_ARN --query "PolicyVersion.Document.Statement" --output table
done
done
使い方はそのままです。
sh one.sh # 引数無しで自身のパーミッション詳細をとる
USERNAME=s3user sh one.sh # ユーザーは引数USERNAMEで指定する
one.sh
を全ユーザーまわして取得するall.sh
を作りました。フォルダoutput
を作成し中にファイルを吐きます。
mkdir output;
aws iam list-users | jq '.Users[].UserName' | xargs -I% sh -c 'USERNAME=% sh one.sh | tee ./output/%.txt'
工数が多くなればなるほど車輪の再開発をしてる気がしたのですが、他にやり方ないでしょうか。Githubで似たプロジェクトをいくつか見つけたものも、star数百程度でベストプラクティスとして普及しているレベルのものは見つからずでした。どなたか教えてくだされば幸いです。
レポジトリはこちらです。
https://github.com/umihico/iam-user-permissions-viwer