はじめに
皆さん、こんにちは!パナソニック コネクト株式会社の石田と申します。(本稿がQiitaへの初投稿となります!)
最近実務において、AWS上で80名のIAMユーザーを用意する機会があり、AWS CLI × CloudShellを使用して一括で作成しました。今回はその手順を共有いたします。
AWS Identity and Access Management (IAM) とは?
IAMをご存知の方は読み飛ばしていただいて構いません。ここでは、おさらいとしてIAMが提供する「認証・認可」の仕組みについて簡単に説明します。
- 認証:ログインしてくる人が、本当にその人かの確認のこと
- 認可:ログインしてきた人がどんなことしていいかの許可を与えること
以下の4つの基本的な要素から構成されます。
- IAMユーザー: AWSに対してアクセス権限をもつユーザーアカウント
- IAMグループ: 同じアクセス権限をもつIAMユーザーの集合体
- IAMロール: あるAWSリソースが、別のAWSリソースに対して権限を付与する際に使用
- IAMポリシー: できること/できないことを管理するJSON形式のルールリスト
IAMユーザー・IAMグループを一括作成
やりたいこと
以下の手順をシェルスクリプト化し、CloudShellで実行します。
- 手順1. IAMグループを作成する
- 手順2. IAMグループにマネージド型のIAMポリシーをアタッチする
- 手順3. CSVから名簿を取得して複数のIAMユーザーを作成し、IAMグループに所属させる
今回は以下の3つのIAMポリシーを使用します。最初の2つはAWSが提供するマネージドポリシーであり、3つ目のポリシーはカスタムポリシーであるため、事前に作成が必要です。(カスタムポリシーの記述についても、以下で簡易的に説明しています。)
- AdministratorAccess:AWSのすべての操作ができる権限をもつポリシー
- IAMUserChangePassword: 自分のIAMユーザーのパスワードを変更できるポリシー
- MFADeviceUnregisteredLimit: MFA登録をしないと権限が制限されるポリシー
注意事項
AdministratorAccess権限は非常に強力な権限です。AWS では「最小権限の原則」が推奨されているため、本来は必要な権限だけを明示的に許可するカスタムポリシーを使用するのが望ましいです。
いざ実践!
CSV名簿の準備
今回はテストとして3人分のIAMユーザーを作成します。CSVファイルの一行がそのままIAMユーザーのユーザー名となります。各行の末尾には必ず改行を入れるようお願いいたします。
user_test1
user_test2
user_test3
カスタムポリシーの準備
AWSコンソールにログインし、検索ボックスから「IAM」を開いてください。MFAが未設定のIAMユーザーによるAWSへのアクセスを制限し、MFA設定を強制するカスタムポリシー『MFADeviceUnregisteredLimit』を作成します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListActions",
"Effect": "Allow",
"Action": [
"iam:ListUsers",
"iam:ListVirtualMFADevices"
],
"Resource": "*"
},
{
"Sid": "AllowUserToCreateVirtualMFADevice",
"Effect": "Allow",
"Action": [
"iam:CreateVirtualMFADevice"
],
"Resource": "arn:aws:iam::*:mfa/*"
},
{
"Sid": "AllowUserToManageTheirOwnMFA",
"Effect": "Allow",
"Action": [
"iam:EnableMFADevice",
"iam:GetMFADevice",
"iam:ListMFADevices",
"iam:ResyncMFADevice"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowUserToDeactivateTheirOwnMFAOnlyWhenUsingMFA",
"Effect": "Allow",
"Action": [
"iam:DeactivateMFADevice"
],
"Resource": [
"arn:aws:iam::*:user/${aws:username}"
],
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
},
{
"Sid": "BlockMostAccessUnlessSignedInWithMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:ListMFADevices",
"iam:ListUsers",
"iam:ListVirtualMFADevices",
"iam:ResyncMFADevice",
"iam:ChangePassword"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
こちらの記事を参考にしました。IAMポリシーの作成の手順もこちらをご参照ください。
MFA認証を強制したい!
https://qiita.com/Nishi_222/items/57a7dde1774a62d72776
シェルスクリプトファイルを用意
手順1~3をシェルスクリプト化しています。IAMユーザーのパスワードについては、全員共通の『Test@PassWord』を設定しています。また、初回ログイン時にはパスワードの強制変更を有効化しています。また、『MFADeviceUnregisteredLimit』ポリシーにおいては、自身で作成したカスタムポリシーのARNに更新してください。
#!/bin/bash
# IAMグループの名前(適宜変更)
GROUP_NAME="Test_2025"
# CSVファイルのパス
CSV_FILE="user_list.csv"
# IAMグループの作成(手順1)
aws iam create-group --group-name $GROUP_NAME
# IAMポリシーのアタッチ(手順2)
## AdministratorAccessポリシーのアタッチ
aws iam attach-group-policy --group-name $GROUP_NAME --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
## IAMUserChangePasswordポリシーのアタッチ
aws iam attach-group-policy --group-name $GROUP_NAME --policy-arn arn:aws:iam::aws:policy/IAMUserChangePassword
## MFADeviceUnregisteredLimit ポリシーのアタッチ(ARNの変更必須!)
aws iam attach-group-policy --group-name $GROUP_NAME --policy-arn arn:aws:iam::12桁のAWSアカウントID:policy/MFADeviceUnregisteredLimit
## アタッチ済みポリシーの確認
aws iam list-attached-group-policies --group-name $GROUP_NAME
# CSVファイルからユーザー名を読み取り、IAMユーザーを作成 (手順3)
while IFS=, read -r username; do
# 改行文字や制御文字を除去(環境によっては不要かもしれませんが、念のため追加)
username=$(echo "$username" | tr -d '\r\n\t ' | sed 's/^[[:space:]]*//' | sed 's/[[:space:]]*$//')
if [ -z "$username" ]; then
continue
fi
# IAMユーザーの作成
aws iam create-user --user-name "$username"
# IAMユーザーをIAMグループに所属
aws iam add-user-to-group --user-name "$username" --group-name $GROUP_NAME
# IAMユーザーの有効化(共通PWを設定し、強制変更を有効)
aws iam create-login-profile --user-name "$username" --password Test@PassWord --password-reset-required
# グループへのアタッチ確認
aws iam list-groups-for-user --user-name "$username"
echo "ユーザー $username を作成し、グループ $GROUP_NAME に追加しました。"
done < "$CSV_FILE"
CloudShellにファイルアップロード&実行
AWS CloudShell は、ブラウザから利用できるLinuxターミナルで、AWS CLIや主要な開発ツールがあらかじめインストールされているため、特別な設定は不要です。AWSコンソールにログインし、検索ボックスから「CloudShell」を開いてください。右上の「アクション」メニューから「ファイルのアップロード」を選択し、「manage_iam.sh」と「user_list.csv」をアップロードしてください。
CloudShellへのアップロードに成功したら以下のコマンドを実行してください。
スクリプトへの実行権限の付与
chmod +x manage_iam.sh
スクリプトの実行
./manage_iam.sh
実行結果の確認
IAMグループとIAMユーザーが作成できました!🎉
IAMポリシーの設定も問題なさそうですね!MFAを設定していないため、初回ログイン時には以下のように各種リソースへのアクセスが制限された画面になります。
注意事項
本ブログに掲載している内容は、私個人の見解であり、
所属する組織の立場や戦略、意見を代表するものではありません。
あくまでエンジニアとしての経験や考えを発信していますので、ご了承ください。