IAM 基礎・権限設計 ハンズオン

IAM User / Group / Role / Policy を作成し、最小権限・AssumeRole・ポリシーシミュレーターを実践する

IAM User IAM Role Policy AssumeRole 最小権限 マネコン操作 所要時間 60〜75 分 v1.0

📋 概要

AWS Identity and Access Management(IAM)は、AWS リソースへのアクセスを安全に制御する基盤サービスです。このハンズオンでは IAM User / Group / Role / Policy の関係を理解し、最小権限の原則に沿ったポリシー設計、ロールへの一時的な権限委譲(AssumeRole)、ポリシーシミュレーターによる権限検証を実践します。

項目内容
対象サービスIAM(User / Group / Role / Policy / Policy Simulator)
主な学習内容ユーザー・グループ管理 / カスタムポリシー設計 / ロールと AssumeRole / 権限検証
所要時間60〜75 分
難易度★★☆☆☆(初〜中級者向け)
前提知識AWS マネジメントコンソールの基本操作・JSON の読み書き
費用目安0 USD(IAM 自体は無料。検証用 EC2 を使う場合のみ少額)
ℹ️ IAM の 4 つの基本要素
要素説明
User(ユーザー)人や個別アプリに紐づく永続的な ID。長期認証情報を持つ
Group(グループ)複数ユーザーをまとめ、ポリシーを一括付与する箱
Role(ロール)一時的な認証情報を発行する ID。サービスやユーザーが「引き受ける」
Policy(ポリシー)「誰が・何に・何をできるか」を定義する JSON 文書
⚠️ ルートユーザーは使わない

このハンズオンの操作は、管理者権限を持つ IAM ユーザー で行ってください。ルートユーザーは MFA を有効化し、日常運用では使用しないのが鉄則です。

🏗️ 権限設計の全体像

👤 IAM User handson-developer
パスワード + MFA でコンソールにログイン
↓ 所属
👥 IAM Group handson-developers
グループにポリシーをアタッチ(ユーザーが継承)
↓ アタッチ
📄 カスタムポリシー S3ReadOnlyHandson
特定バケットの読み取りのみ許可(最小権限)
↓ sts:AssumeRole で一時的に切り替え
🎭 IAM Role handson-s3-admin-role
S3 フルアクセス(必要なときだけ引き受ける)

このハンズオンで作るもの

✅ 前提条件

ℹ️ IAM はグローバルサービス

IAM にはリージョンの概念がありません。どのリージョンを選択していても同じ設定が適用されます。

👤 ステップ 1 ― IAM ユーザーとグループの作成

開発者用の IAM ユーザーを作成し、グループに所属させて権限を一括管理する構造を作ります。

1-1. IAM コンソールを開く

マネジメントコンソール上部の検索バーで 「IAM」 を検索して開きます。左メニューの 「ユーザーグループ」→「グループを作成」 をクリックします。

1-2. グループを作成
ユーザーグループ名handson-developers

「許可ポリシーをアタッチ」では、まず AWS 管理ポリシー AmazonS3ReadOnlyAccess を検索してチェックを入れます(後でカスタムポリシーに置き換えます)。「ユーザーグループを作成」をクリックします。

1-3. IAM ユーザーを作成

左メニュー 「ユーザー」→「ユーザーの作成」 をクリックします。

ユーザー名handson-developer
コンソールアクセスAWS マネジメントコンソールへのアクセスを有効化
パスワード自動生成 or カスタム(次回ログイン時に変更を要求)

「次へ」をクリックします。

1-4. グループに追加

「許可を設定」画面で 「ユーザーをグループに追加」 を選び、handson-developers にチェックを入れます。「次へ」→「ユーザーの作成」をクリックします。

表示される サインイン URL・ユーザー名・パスワード を控えておきます(CSV ダウンロード可)。

1-5. MFA を有効化する

作成したユーザー handson-developer を開き、「セキュリティ認証情報」タブ→「MFA デバイスの割り当て」 をクリックします。

デバイス名handson-mfa
MFA デバイス認証アプリケーション

表示される QR コードを認証アプリで読み取り、連続する 2 つのコードを入力して「MFA を追加」をクリックします。

✅ 確認ポイント

シークレット(プライベート)ウィンドウでサインイン URL を開き、handson-developer でログインできること、MFA コードの入力が求められることを確認します。

📄 ステップ 2 ― 最小権限のカスタムポリシー設計

「特定の S3 バケットだけを読み取れる」最小権限ポリシーを作成し、グループにアタッチします。

2-1. ポリシーを作成する

IAM 左メニュー 「ポリシー」→「ポリシーの作成」 をクリックします。「JSON」タブに切り替えて以下を貼り付けます(handson-bucket-xxxx は実在のバケット名に置き換え)。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ListSpecificBucket",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": "arn:aws:s3:::handson-bucket-xxxx"
    },
    {
      "Sid": "ReadObjects",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": "arn:aws:s3:::handson-bucket-xxxx/*"
    }
  ]
}
2-2. ポリシーに名前を付けて作成
ポリシー名S3ReadOnlyHandson
説明Read-only access to the handson bucket only

「ポリシーの作成」をクリックします。

2-3. グループのポリシーを差し替える

「ユーザーグループ」→ handson-developers →「許可」タブを開きます。先ほどの AmazonS3ReadOnlyAccess「削除」 し、「許可を追加」→「ポリシーをアタッチ」 から S3ReadOnlyHandson をアタッチします。

ℹ️ 最小権限の原則(Least Privilege)
  • Action はワイルドカード(s3:*)を避け、必要な API だけを列挙する
  • Resource* ではなく具体的な ARN に絞る
  • まず最小で始めて、足りなければ追加する(引き算ではなく足し算)
  • バケットレベル(ListBucket)とオブジェクトレベル(GetObject)で ARN の書き方が異なる点に注意
✅ 確認ポイント

handson-developer でログインし直し、S3 コンソールで対象バケットの中身は見られるが、別のバケットを開こうとすると「アクセス拒否」になることを確認します。オブジェクトのアップロード(PutObject)も拒否されます。

🎭 ステップ 3 ― IAM ロールの作成

普段は読み取りのみのユーザーが、必要なときだけ「引き受ける」昇格用ロールを作成します。

3-1. ロールを作成する

IAM 左メニュー 「ロール」→「ロールを作成」 をクリックします。「信頼されたエンティティタイプ」で 「カスタム信頼ポリシー」 を選択します。

3-2. 信頼ポリシーを設定

以下の JSON を貼り付けます(<AccountId> は自分のアカウント ID に置き換え)。これにより、同一アカウントの IAM ユーザーがこのロールを引き受けられるようになります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<AccountId>:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "Bool": { "aws:MultiFactorAuthPresent": "true" }
      }
    }
  ]
}
ℹ️ Condition で MFA を必須化

aws:MultiFactorAuthPresent を条件に入れることで、MFA 認証済みのユーザーしかこのロールを引き受けられなくなります。昇格には追加の保証を求める設計です。

3-3. 許可ポリシーをアタッチ

「許可を追加」画面で、AWS 管理ポリシー AmazonS3FullAccess を検索してチェックを入れます(このロールを引き受けると S3 フルアクセスになる)。「次へ」をクリックします。

3-4. ロール名を設定して作成
ロール名handson-s3-admin-role
説明Elevated S3 full access, assumed with MFA

「ロールを作成」をクリックします。作成後、ロール詳細画面の ARN をメモしておきます。

✅ 確認ポイント

ロール一覧に handson-s3-admin-role が表示され、信頼関係タブに自アカウントの root が、許可ポリシーに AmazonS3FullAccess が表示されれば成功です。

🔄 ステップ 4 ― AssumeRole で権限を切り替える

handson-developer がロールを引き受けて、一時的に S3 フルアクセスへ昇格する流れを体験します。

4-1. AssumeRole を許可するポリシーを付与

ユーザー自身にロールを引き受ける権限が必要です。「ポリシー」→「ポリシーの作成」 で以下を作成し、グループ handson-developers にアタッチします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::<AccountId>:role/handson-s3-admin-role"
    }
  ]
}

ポリシー名は AllowAssumeS3AdminRole とします。

方法① マネジメントコンソールでロールを切り替える

4-2. ロールの切り替え

handson-developer でログインした状態で、画面右上のアカウントメニューから 「ロールの切り替え」 をクリックします。

アカウント<AccountId>
ロールhandson-s3-admin-role
表示名s3-admin

「ロールの切り替え」をクリックすると、画面右上の表示が切り替わり、S3 への書き込みなどフルアクセス操作が可能になります。

方法② CLI(CloudShell)で AssumeRole する

4-3. STS で一時認証情報を取得

CloudShell またはローカルの AWS CLI で以下を実行します。

aws sts assume-role \ --role-arn arn:aws:iam::<AccountId>:role/handson-s3-admin-role \ --role-session-name handson-session \ --serial-number arn:aws:iam::<AccountId>:mfa/handson-mfa \ --token-code <MFAコード6桁>

返ってきた AccessKeyId / SecretAccessKey / SessionToken を環境変数に設定すると、そのセッションだけロールの権限で操作できます。

export AWS_ACCESS_KEY_ID=<...> export AWS_SECRET_ACCESS_KEY=<...> export AWS_SESSION_TOKEN=<...> aws sts get-caller-identity # Arn が assumed-role/... になっていれば成功
✅ 確認ポイント

ロール切り替え前は PutObject が拒否され、切り替え後は成功することを確認します。これが「普段は最小権限、必要なときだけ昇格」という設計の体験です。

⚠️ 一時認証情報の有効期限

AssumeRole で得た認証情報には有効期限(デフォルト 1 時間)があります。期限が切れたら再度取得が必要です。長期キーよりも安全な理由がこれです。

🧪 ステップ 5 ― ポリシーシミュレーターで権限を検証する

実際に操作する前に、ポリシーが意図通りかをシミュレーターで安全に検証します。

5-1. ポリシーシミュレーターを開く

ブラウザで https://policysim.aws.amazon.com/ を開きます(IAM コンソールのユーザー詳細「アクセスのテスト」からも遷移可)。左ペインで検証対象の ユーザー / グループ / ロール を選択します。

5-2. アクションを選んでシミュレート

サービスに 「S3」、アクションに GetObject / PutObject / ListBucket を選択します。「Run Simulation」をクリックします。

対象アクション期待結果
handson-developers3:GetObjectallowed
handson-developers3:PutObjectdenied
handson-s3-admin-roles3:PutObjectallowed
5-3. リソース ARN を指定して厳密に検証

「Resource」に対象バケットの ARN を入れると、Resource 制限が効いているかまで検証できます。別バケットの ARN を入れると denied になることを確認します。

ℹ️ 権限評価のロジック(重要)
  • デフォルトはすべて 暗黙的な拒否(Implicit Deny)
  • いずれかのポリシーで Allow があれば許可される
  • ただし 明示的な拒否(Explicit Deny) があれば、他に Allow があっても必ず拒否
  • 評価順序:明示的 Deny > 明示的 Allow > 暗黙的 Deny
✅ 確認ポイント

シミュレーション結果が期待結果の表と一致すれば、最小権限ポリシーと昇格ロールが正しく設計できています。

🧹 クリーンアップ

⚠️ 不要な認証情報は残さない

IAM 自体に料金は発生しませんが、不要なユーザー・ロール・アクセスキーはセキュリティリスクになります。検証後は削除しましょう。

削除手順(逆順で実施)

  1. IAM ロールを削除
    IAM → ロール → handson-s3-admin-role を選択 → 「削除」
  2. IAM ユーザーを削除
    IAM → ユーザー → handson-developer を選択 → 「削除」(MFA デバイスは自動的に解除される)
  3. IAM グループを削除
    IAM → ユーザーグループ → handson-developers を選択 → 「削除」
  4. カスタムポリシーを削除
    IAM → ポリシー → S3ReadOnlyHandsonAllowAssumeS3AdminRole をそれぞれ削除
  5. 検証用 S3 バケットを削除(このハンズオンで作成した場合)
✅ クリーンアップ完了の確認
  • IAM → ユーザー一覧に handson-developer が消えた
  • IAM → ロール一覧に handson-s3-admin-role が消えた
  • IAM → ポリシー(カスタム管理)一覧が空になった

学習のまとめ

習得したスキル実践内容
ユーザー・グループ管理ユーザー作成 → MFA 設定 → グループによる一括権限管理
最小権限ポリシー設計特定バケット・特定アクションに絞った JSON ポリシー作成
ロールと信頼ポリシーMFA 必須の信頼ポリシーで昇格用ロールを作成
AssumeRole(権限委譲)コンソール切替・STS による一時認証情報の取得
権限検証ポリシーシミュレーターで allow / deny を事前確認