🔐 IAM 権限評価モデル & 操作経路

セキュリティゲートと入口の違いで理解する!完全ガイド

🏢 オフィスビルのセキュリティで例えると超わかりやすい!

IAMの権限評価 = オフィスビルのセキュリティチェック

あなたがビルに入ろうとすると、複数のチェックポイントを通過する必要があります。
「入館証持ってる?」「この階に行く許可ある?」「今日は入れる日?」...

そして 操作経路 は「どの入口から入るか」の違い。
正面玄関(コンソール) 社員専用入口(API/CLI) では
必要なチェック項目が微妙に違うんです!🚪

⚖️ 権限評価モデル - 3つの決定ルール

🏢 オフィスビルのセキュリティチェックで考えよう
あなたは社員で、オフィスビルの「機密資料室」に入りたいとします。

IAMの権限評価は、以下の3段階で決まります:
1️⃣ 「入るな」リスト(明示的拒否) に名前があれば → 即アウト!
2️⃣ リストになければ、 「入ってOK」リスト(明示的許可) を確認
3️⃣ どちらにも名前がなければ → デフォルトで拒否 (安全第一!)

💡 ポイント:「ダメ」と言われたら、どんな「OK」があっても入れない!
🚫
明示的拒否
(Explicit Deny)
ポリシーで「Deny」と明記されている。

「この人は絶対入れない」
ブラックリストに載っている状態。

他にどんな許可があっても
絶対に上書きできない!
👑 最優先(絶対)
明示的許可
(Explicit Allow)
ポリシーで「Allow」と明記されている。

「この人は入ってOK」
許可リストに載っている状態。

明示的拒否がなければ
アクセス許可される
🥈 2番目に確認
🔒
暗黙的拒否
(Implicit Deny)
どこにも書かれていない状態。

「リストに名前がない」 ので
デフォルトで入れない。

AWSは 「許可されていなければ拒否」 が基本原則
🔰 デフォルト動作

📋 権限評価の完全フロー

1
🚫 明示的拒否をチェック
まず最初に「Deny」が書かれているポリシーがないか確認。
SCP、アイデンティティポリシー、リソースポリシー、Permission Boundary... どこかに「Deny」があれば即終了!
🏢 例:「田中さんは機密室への入室を禁止する」と書かれていたら、他に何が書いてあっても入れない
Denyあり → 即拒否!🚫
2
🏛️ SCP(組織ポリシー)をチェック
AWS Organizationsの サービスコントロールポリシー を確認。
「このアカウント全体でこの操作を許可するか?」を決める組織のルール。
🏢 例:「このフロア全体で、夜間の入室は禁止」という全社ルール
Allowあり → 次へ進む ➡️
3
👤 アイデンティティポリシーをチェック
IAMユーザー/ロール/グループに付与された ユーザーベースのポリシー を確認。
「この人は何ができるか?」を定義したもの。
🏢 例:「田中さんの社員証には、会議室A〜Cへの入室権限がある」
Allowあり → 次へ進む ➡️
4
📦 リソースポリシーをチェック
S3バケットポリシーやKMSキーポリシーなど、 リソース側に設定されたポリシー を確認。
「このリソースに誰がアクセスできるか?」を定義。
🏢 例:「機密資料室のドアには、セキュリティ部門のみ入室可能」と書いてある
Allowあり → 次へ進む ➡️
5
🔒 Permission Boundaryをチェック
IAMユーザー/ロールに設定された 権限の上限 を確認。
「この人ができる最大範囲はここまで」という天井を設定。
🏢 例:「田中さんは開発部所属なので、どんな許可があっても人事エリアには入れない」
すべてOK → アクセス許可!✅

🚪 操作経路の違い - コンソール vs API/CLI

🏢 オフィスビルの「入口」で考えよう
同じオフィスビルでも、入口によって体験が違います:

🚪 正面玄関(コンソール)
→ 受付があり、案内板があり、エレベーターまで誘導してくれる
→ 便利だけど、受付を通過するための「追加の確認」が必要なことも

🔑 社員専用入口(API/CLI)
→ 社員証をピッとかざして直接入室
→ シンプルで速いけど、どこに何があるか自分で把握している必要がある
🖥️
AWS Management Console
Webブラウザからの操作
🔍 裏で複数のAPIを呼び出す
画面を開くだけで、一覧表示のために
List* Describe* APIが自動で呼ばれる。
つまり 表示するだけで追加の権限が必要 になることがある。
📋 一覧表示の権限が必要
例:S3コンソールでバケット一覧を見るには
s3:ListAllMyBuckets 権限が必要。
バケット操作はできても一覧が見えない ケースも。
👀 視覚的に分かりやすい
GUIで操作できるため、初心者に優しい。
エラーメッセージも分かりやすく表示される。
ただし 権限エラーが分かりにくい こともある。
⚠️ 注意点
「アクセス拒否」と表示されても、
実は 一覧表示の権限が足りないだけ のことがある。
直接URLでアクセスすると動くことも!
⌨️
API / CLI
プログラムからの直接操作
🎯 必要なAPIだけを呼び出す
コマンドを実行すると、そのAPIだけが呼ばれる。
余計な権限は不要 で、最小権限の原則を守りやすい。
🔧 一覧なしでも操作可能
例: s3:GetObject 権限だけで
ファイルダウンロードが可能。
バケット一覧が見えなくても直接操作できる
📊 詳細なエラー情報
どのAPIでどんなエラーが出たか明確に分かる。
トラブルシューティングがしやすい。
--debug オプションで詳細表示も可能。
🚀 自動化に最適
スクリプトやCI/CDパイプラインで利用。
必要最小限の権限 で自動処理を実行できる。
セキュリティ的にも望ましい。

📊 コンソール vs API/CLI 詳細比較

項目 🖥️ コンソール ⌨️ API/CLI
操作方法 ブラウザでGUI操作 コマンドやコードで実行
必要な権限 操作権限 + 表示権限(List/Describe) 操作権限のみでOK
権限エラーの分かりやすさ ⚠️ 原因が分かりにくいことがある ✅ 詳細なエラー情報
最小権限の原則 ⚠️ 追加権限が必要になりがち ✅ 守りやすい
学習コスト ✅ 直感的で低い ⚠️ コマンド習得が必要
自動化 ❌ 困難 ✅ 最適
監査ログの明確さ ⚠️ 複数APIが混在 ✅ 明確
向いている用途 探索・確認・学習 本番運用・自動化・セキュリティ重視

💡 よくある「あれ?」を解決!実例集

😱

コンソールで「アクセス拒否」なのにCLIでは動く!

📋 シナリオ
S3バケットにファイルをアップロードしたい。
CLIでは aws s3 cp が成功するのに、
コンソールでは「アクセスが拒否されました」と表示される。
✅ 原因と解決策
原因: s3:ListBucket 権限がない

コンソールはバケット一覧を表示するために
s3:ListBucket を呼ぶが、その権限がないと
「アクセス拒否」と表示されてしまう。

解決策:
s3:ListBucket 権限を追加
② または直接URLでバケットにアクセス
🤔

「Allow」があるのに拒否される!

📋 シナリオ
IAMポリシーで "Effect": "Allow" を設定したのに、
操作しようとすると「AccessDenied」エラーが出る。
✅ 確認ポイント
① 明示的拒否がないか?
SCP、Permission Boundary、他のポリシーに「Deny」がないか確認

② リソースポリシーは?
S3バケットポリシーやKMSキーポリシーで拒否されていないか

③ 条件(Condition)は?
IPアドレス制限やMFA必須などの条件を満たしているか

④ リソースARNは正しいか?
ワイルドカード(*)の位置や形式を確認
🔑

クロスアカウントアクセスが動かない!

📋 シナリオ
アカウントAからアカウントBのS3バケットにアクセスしたい。
アカウントAのIAMポリシーで許可したのに動かない。
✅ 原因と解決策
クロスアカウントアクセスは「両方の許可」が必要!

アカウントA側: IAMポリシーでAllow
アカウントB側: バケットポリシーでAllow

どちらか一方だけでは動きません!
両方のアカウントで許可を設定する必要があります。

さっきまで動いてたのに急に動かない!

📋 シナリオ
昨日まで普通に使えていたのに、
今日になって急に「AccessDenied」になった。
✅ 確認ポイント
① SCPの変更
Organizations管理者がSCPを更新していないか

② Permission Boundaryの変更
上限設定が変更されていないか

③ 条件付きポリシーの期限
日時条件やセッション期限が切れていないか

④ リソースポリシーの変更
S3バケットポリシー等が変更されていないか
⚠️ よくある間違い - これだけは避けよう!
❌ 間違い1:「コンソールで動くからCLIでも動くはず」
→ 逆は成り立ちますが、コンソールには追加権限が必要なことがある

❌ 間違い2:「Allowを追加すればDenyを上書きできる」
→ 明示的拒否(Deny)は絶対に上書きできません!

❌ 間違い3:「権限エラー = IAMポリシーの問題」
→ SCP、Permission Boundary、リソースポリシーも確認が必要

❌ 間違い4:「管理者なら何でもできる」
→ SCPやPermission Boundaryで制限されている可能性あり
💡 権限トラブルシューティングの黄金ルール
1. IAM Policy Simulatorを使う:
AWSコンソールの「IAM Policy Simulator」で権限をテストできる。本番環境を触る前に確認!

2. CloudTrailでAPIコールを確認:
どのAPIが呼ばれて、どこで失敗したかを確認。コンソール操作も全てAPIコールとして記録される。

3. 最小権限から始める:
まずCLIで必要な操作ができるか確認 → 動いたらコンソール用の権限を追加検討

4. 「誰が」「何を」「どこで」を明確に:
Principal(誰)、Action(何)、Resource(どこ)を常に意識してポリシーを書く

5. 評価順序を覚える:
明示的拒否 → SCP → アイデンティティポリシー → リソースポリシー → Permission Boundary
この順序で「どこで止まったか」を追跡する

❓ よくある質問

🙋 Q. コンソールとCLIで同じIAMユーザーを使っているのに、権限が違うのはなぜ?
A. コンソールは画面を表示するために追加のAPIを呼び出します。
例えば、EC2コンソールを開くだけで ec2:DescribeInstances が呼ばれます。
CLIで特定の操作だけ許可している場合、コンソールでは「一覧が見えない」という形で権限不足が現れます。
🙋 Q. 明示的拒否(Deny)と暗黙的拒否の違いは何ですか?
A. 明示的拒否 :ポリシーに「Deny」と書かれている。 絶対に上書きできない
暗黙的拒否 :どこにも書かれていない状態。 Allowを追加すれば許可される

つまり「何も書いてない = 拒否」がデフォルトですが、「Denyと書いてある = 永久に拒否」です。
🙋 Q. Permission Boundaryとは何ですか?SCPとの違いは?
A. どちらも「権限の上限」を設定するものですが、適用範囲が違います:

SCP :Organizations全体・OU・アカウント単位で適用
Permission Boundary :個別のIAMユーザー・ロール単位で適用

SCPは「会社全体のルール」、Permission Boundaryは「個人への制限」と考えると分かりやすいです。
🙋 Q. 権限エラーのデバッグで最初にすべきことは?
A. まず以下を確認してください:

IAM Policy Simulator でポリシーをテスト
CloudTrail で失敗したAPIコールを確認(errorCodeとerrorMessageをチェック)
CLI --debug オプションで詳細なエラー情報を取得

これで「どのAPIで」「どんな理由で」失敗したかが分かります。

🎓 まとめ

🏢 オフィスビルのセキュリティ = IAM権限評価

複数のチェックポイントを通過して初めてアクセスできる
一つでも「拒否」があれば入れない仕組みです

🚫
明示的拒否

「Deny」は絶対
どんなAllowも
上書き不可
明示的許可

「Allow」があり
Denyがなければ
アクセス可能
🔒
暗黙的拒否

何も書いてない
= デフォルトで
アクセス拒否
🖥️
コンソール

操作権限 +表示権限 が必要
List/Describeも忘れずに!
⌨️
API/CLI

必要な権限だけ でOK
最小権限の原則を守りやすい

🎯 権限エラーが出たら...

① まずCLIで試す(コンソール特有の問題か確認)
② IAM Policy Simulatorでテスト
③ CloudTrailでAPIエラーを確認
④ SCP・Permission Boundary・リソースポリシーも忘れずに!🔍

Created by SSuzuki1063

AWS SAP Learning Resources