はじめに
内部統制の一環で、クラウドサービスのユーザ / グループに割り当てたポリシー一覧を出力する必要がありました。
AWSを例にし、CloudShellにて実行できるコマンドで作ってみました。
概要
- 各ユーザ、各グループのポリシーを、1行ずつ出力します
- 複数割り当てていれば、複数レコードになります
- 何も割り当てられていないユーザ / グループは出力されません
- 以下の情報を出力します
- AccountId
- EntityType : User / Group
- EntityName
- PolicyType : AWS managed / Customer managed / Inline
- PolicyName
- PolicyArn
コマンド
以下のコマンドをクリップボードにコピーして、CloudShellに張り付けて実行します。
# 出力ファイル名を変数化
OUTPUT_FILE="iam_user_group_policies.csv"
# アカウントIDを取得
ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
# 出力CSVのヘッダー作成
echo "AccountId,EntityType,EntityName,PolicyType,PolicyName,PolicyArn" > "$OUTPUT_FILE"
##############################
# ユーザーのポリシー取得
##############################
aws iam list-users --query 'Users[].UserName' --output json | jq -r '.[]' | while read USER_NAME; do
echo "Processing user: $USER_NAME..."
# マネージドポリシー(AWS managed / Customer managed 判定)
aws iam list-attached-user-policies --user-name "$USER_NAME" --query 'AttachedPolicies[]' --output json | \
jq -r --arg a "$ACCOUNT_ID" --arg e "$USER_NAME" ' .[] | [$a, "User", $e
, (if .PolicyArn | test("^arn:aws:iam::aws:policy/") then "AWS managed" else "Customer managed" end)
, .PolicyName, .PolicyArn ] | @csv ' >> "$OUTPUT_FILE"
# インラインポリシー(常に Inline)
aws iam list-user-policies --user-name "$USER_NAME" --query 'PolicyNames[]' --output json | \
jq -r --arg a "$ACCOUNT_ID" --arg e "$USER_NAME" ' .[] | [$a, "User", $e
, "Inline"
, ., "N/A"] | @csv ' >> "$OUTPUT_FILE"
done
##############################
# グループのポリシー取得
##############################
aws iam list-groups --query 'Groups[].GroupName' --output json | jq -r '.[]' | while read GROUP_NAME; do
echo "Processing group: $GROUP_NAME..."
# マネージドポリシー(AWS managed / Customer managed 判定)
aws iam list-attached-group-policies --group-name "$GROUP_NAME" --query 'AttachedPolicies[]' --output json | \
jq -r --arg a "$ACCOUNT_ID" --arg e "$GROUP_NAME" ' .[] | [$a, "Group", $e
, (if .PolicyArn | test("^arn:aws:iam::aws:policy/") then "AWS managed" else "Customer managed" end)
, .PolicyName, .PolicyArn ] | @csv ' >> "$OUTPUT_FILE"
# インラインポリシー(常に Inline)
aws iam list-group-policies --group-name "$GROUP_NAME" --query 'PolicyNames[]' --output json | \
jq -r --arg a "$ACCOUNT_ID" --arg e "$GROUP_NAME" ' .[] | [$a, "Group", $e
, "Inline"
, ., "N/A"] | @csv ' >> "$OUTPUT_FILE"
done
echo "出力完了: $OUTPUT_FILE"
以下のような形で出力されます。
iam_user_group_policies.csv
AccountId,EntityType,EntityName,PolicyType,PolicyName,PolicyArn
"123456789012","User","Anisphia","Customer managed","StartStopEc2","arn:aws:iam::123456789012:policy/StartStopEc2"
"123456789012","User","Euphyllia","Customer managed","DenyPermissionBoundaryEdit","arn:aws:iam::123456789012:policy/DenyPermissionBoundaryEdit"
"123456789012","User","Xavier_Olivette","AWS managed","AmazonEC2FullAccess","arn:aws:iam::aws:policy/AmazonEC2FullAccess"
"123456789012","User","Xavier_Olivette","AWS managed","AdministratorAccess","arn:aws:iam::aws:policy/AdministratorAccess"
"123456789012","User","Xavier_Olivette","Inline","testPolicyS3","N/A"
"123456789012","Group","testGroup1","Customer managed","DenyPermissionBoundaryEdit","arn:aws:iam::123456789012:policy/DenyPermissionBoundaryEdit"
"123456789012","Group","testGroup1","AWS managed","AdministratorAccess","arn:aws:iam::aws:policy/AdministratorAccess"
"123456789012","Group","testGroup2","Customer managed","StartStopEc2","arn:aws:iam::123456789012:policy/StartStopEc2"
"123456789012","Group","testGroup2","Inline","testInline","N/A"
成型例
この出力を見栄えよくするために、Googleスプレッドシートでピボットしてみます。
以下のようにしていきます。
- 値のみ張り付け
- [データ] - [テキストを列に分割]
- [表示形式] - [テーブルに変換]
- [挿入] - [ピボット テーブル]
- 以下のように設定
- 行 : EntityType , EntityName
- 列 : PolicyType , PolicyName
- 値 : PolicyArnをカウント
以下のような表になり、どのユーザ / グループに、どのポリシーを割り当てたかの可視化資料にできそうです。
おわりに
今回は、ユーザとグループごとに割り当てたポリシーを出力するコマンドを作ってみました。
成型例のような表を手で作成していましたが、こういった風に出力できれば管理もだいぶ楽になると思います。
この記事がどなたかのお役に立ちましたら幸いです。
