6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWSCLI × CloudShellでIAMユーザー・IAMグループを一括作成

Posted at

はじめに

皆さん、こんにちは!パナソニック コネクト株式会社の石田と申します。(本稿が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_list.csv
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に更新してください。

manage_iam.sh
#!/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」をアップロードしてください。

image.png

image.png

CloudShellへのアップロードに成功したら以下のコマンドを実行してください。

スクリプトへの実行権限の付与
chmod +x manage_iam.sh
スクリプトの実行
./manage_iam.sh

実行結果の確認

image.png

IAMグループとIAMユーザーが作成できました!🎉

image.png

IAMポリシーの設定も問題なさそうですね!MFAを設定していないため、初回ログイン時には以下のように各種リソースへのアクセスが制限された画面になります。

image.png

注意事項
本ブログに掲載している内容は、私個人の見解であり、
所属する組織の立場や戦略、意見を代表するものではありません。​
あくまでエンジニアとしての経験や考えを発信していますので、ご了承ください。​

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?