IAM User / Group / Role / Policy を作成し、最小権限・AssumeRole・ポリシーシミュレーターを実践する
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 を使う場合のみ少額) |
| 要素 | 説明 |
|---|---|
| User(ユーザー) | 人や個別アプリに紐づく永続的な ID。長期認証情報を持つ |
| Group(グループ) | 複数ユーザーをまとめ、ポリシーを一括付与する箱 |
| Role(ロール) | 一時的な認証情報を発行する ID。サービスやユーザーが「引き受ける」 |
| Policy(ポリシー) | 「誰が・何に・何をできるか」を定義する JSON 文書 |
このハンズオンの操作は、管理者権限を持つ IAM ユーザー で行ってください。ルートユーザーは MFA を有効化し、日常運用では使用しないのが鉄則です。
handson-developerhandson-developersS3ReadOnlyHandsonhandson-s3-admin-rolehandson-developer(コンソールアクセス + MFA)handson-developers(読み取り権限を付与)S3ReadOnlyHandson(最小権限)handson-s3-admin-role(AssumeRole で昇格)iam:*)を持っていることIAM にはリージョンの概念がありません。どのリージョンを選択していても同じ設定が適用されます。
開発者用の IAM ユーザーを作成し、グループに所属させて権限を一括管理する構造を作ります。
マネジメントコンソール上部の検索バーで 「IAM」 を検索して開きます。左メニューの 「ユーザーグループ」→「グループを作成」 をクリックします。
「許可ポリシーをアタッチ」では、まず AWS 管理ポリシー AmazonS3ReadOnlyAccess を検索してチェックを入れます(後でカスタムポリシーに置き換えます)。「ユーザーグループを作成」をクリックします。
左メニュー 「ユーザー」→「ユーザーの作成」 をクリックします。
「次へ」をクリックします。
「許可を設定」画面で 「ユーザーをグループに追加」 を選び、handson-developers にチェックを入れます。「次へ」→「ユーザーの作成」をクリックします。
表示される サインイン URL・ユーザー名・パスワード を控えておきます(CSV ダウンロード可)。
作成したユーザー handson-developer を開き、「セキュリティ認証情報」タブ→「MFA デバイスの割り当て」 をクリックします。
表示される QR コードを認証アプリで読み取り、連続する 2 つのコードを入力して「MFA を追加」をクリックします。
シークレット(プライベート)ウィンドウでサインイン URL を開き、handson-developer でログインできること、MFA コードの入力が求められることを確認します。
「特定の S3 バケットだけを読み取れる」最小権限ポリシーを作成し、グループにアタッチします。
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/*"
}
]
}
「ポリシーの作成」をクリックします。
「ユーザーグループ」→ handson-developers →「許可」タブを開きます。先ほどの AmazonS3ReadOnlyAccess を 「削除」 し、「許可を追加」→「ポリシーをアタッチ」 から S3ReadOnlyHandson をアタッチします。
s3:*)を避け、必要な API だけを列挙する* ではなく具体的な ARN に絞るListBucket)とオブジェクトレベル(GetObject)で ARN の書き方が異なる点に注意handson-developer でログインし直し、S3 コンソールで対象バケットの中身は見られるが、別のバケットを開こうとすると「アクセス拒否」になることを確認します。オブジェクトのアップロード(PutObject)も拒否されます。
普段は読み取りのみのユーザーが、必要なときだけ「引き受ける」昇格用ロールを作成します。
IAM 左メニュー 「ロール」→「ロールを作成」 をクリックします。「信頼されたエンティティタイプ」で 「カスタム信頼ポリシー」 を選択します。
以下の 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" }
}
}
]
}
aws:MultiFactorAuthPresent を条件に入れることで、MFA 認証済みのユーザーしかこのロールを引き受けられなくなります。昇格には追加の保証を求める設計です。
「許可を追加」画面で、AWS 管理ポリシー AmazonS3FullAccess を検索してチェックを入れます(このロールを引き受けると S3 フルアクセスになる)。「次へ」をクリックします。
「ロールを作成」をクリックします。作成後、ロール詳細画面の ARN をメモしておきます。
ロール一覧に handson-s3-admin-role が表示され、信頼関係タブに自アカウントの root が、許可ポリシーに AmazonS3FullAccess が表示されれば成功です。
handson-developer がロールを引き受けて、一時的に S3 フルアクセスへ昇格する流れを体験します。
ユーザー自身にロールを引き受ける権限が必要です。「ポリシー」→「ポリシーの作成」 で以下を作成し、グループ handson-developers にアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::<AccountId>:role/handson-s3-admin-role"
}
]
}
ポリシー名は AllowAssumeS3AdminRole とします。
handson-developer でログインした状態で、画面右上のアカウントメニューから 「ロールの切り替え」 をクリックします。
「ロールの切り替え」をクリックすると、画面右上の表示が切り替わり、S3 への書き込みなどフルアクセス操作が可能になります。
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 を環境変数に設定すると、そのセッションだけロールの権限で操作できます。
ロール切り替え前は PutObject が拒否され、切り替え後は成功することを確認します。これが「普段は最小権限、必要なときだけ昇格」という設計の体験です。
AssumeRole で得た認証情報には有効期限(デフォルト 1 時間)があります。期限が切れたら再度取得が必要です。長期キーよりも安全な理由がこれです。
実際に操作する前に、ポリシーが意図通りかをシミュレーターで安全に検証します。
ブラウザで https://policysim.aws.amazon.com/ を開きます(IAM コンソールのユーザー詳細「アクセスのテスト」からも遷移可)。左ペインで検証対象の ユーザー / グループ / ロール を選択します。
サービスに 「S3」、アクションに GetObject / PutObject / ListBucket を選択します。「Run Simulation」をクリックします。
| 対象 | アクション | 期待結果 |
|---|---|---|
| handson-developer | s3:GetObject | allowed |
| handson-developer | s3:PutObject | denied |
| handson-s3-admin-role | s3:PutObject | allowed |
「Resource」に対象バケットの ARN を入れると、Resource 制限が効いているかまで検証できます。別バケットの ARN を入れると denied になることを確認します。
Allow があれば許可されるシミュレーション結果が期待結果の表と一致すれば、最小権限ポリシーと昇格ロールが正しく設計できています。
IAM 自体に料金は発生しませんが、不要なユーザー・ロール・アクセスキーはセキュリティリスクになります。検証後は削除しましょう。
handson-s3-admin-role を選択 → 「削除」handson-developer を選択 → 「削除」(MFA デバイスは自動的に解除される)handson-developers を選択 → 「削除」S3ReadOnlyHandson・AllowAssumeS3AdminRole をそれぞれ削除handson-developer が消えたhandson-s3-admin-role が消えた| 習得したスキル | 実践内容 |
|---|---|
| ユーザー・グループ管理 | ユーザー作成 → MFA 設定 → グループによる一括権限管理 |
| 最小権限ポリシー設計 | 特定バケット・特定アクションに絞った JSON ポリシー作成 |
| ロールと信頼ポリシー | MFA 必須の信頼ポリシーで昇格用ロールを作成 |
| AssumeRole(権限委譲) | コンソール切替・STS による一時認証情報の取得 |
| 権限検証 | ポリシーシミュレーターで allow / deny を事前確認 |