AWS IAM VISUALIZER

AWS IAM ポリシー評価ロジック

AWSリソースへのアクセスを安全に管理する認証・認可サービス

シナリオ
S3 GetObject — 全評価レイヤーを通過して Allow に至る正常系フロー
ステップ1 / 9
評価中
IAM リクエストの受信
AWSサービスがIAMに認可リクエストを送信しました。プリンシパル(誰が)、アクション(何を)、リソース(どこに)、条件(どんな条件で)の4要素で構成されます。
POLICY EVALUATION FLOWSTEP 1
CODE VIEW
── IAM Authorization Request ──
 
Principal : arn:aws:iam::123456789012:user/dev-tanaka
Action : s3:GetObject
Resource : arn:aws:s3:::company-data/reports/q4.pdf
Condition : aws:SourceIp = 203.0.113.0/24
 
→ ポリシー評価を開始します...
Allow / Pass
Deny
評価中
N/A (スキップ)
未評価
解説

📌
IAMとは何か

AWS Identity and Access Management(IAM)は、AWSリソースへのアクセスを安全に制御するためのサービスです。 建物の入退室管理システムに例えると、IAM は「社員証(認証)」と「どのフロアに入れるか(認可)」を一元管理する仕組みに相当します。 「誰が」「何を」「どのリソースに」「どんな条件で」アクセスできるかを、JSONポリシー文書できめ細かく定義します。

IAM は無料で利用でき、グローバルサービス(リージョンに依存しない)として動作します。 主要なコンポーネントはユーザー(User)グループ(Group)ロール(Role)ポリシー(Policy)の4つです。 これらが組み合わさって、アクセス制御の全体像が形成されます。

設計思想の中心にあるのは最小権限の原則(Least Privilege Principle)です。 必要最小限の権限だけを付与することでセキュリティリスクを最小化します。 IAM はデフォルトですべてを「拒否」しており、明示的な Allow ステートメントがある場合のみアクセスが許可されます。

IDENTITIESUserGroupRolePOLICYPolicy Document (JSON)AWS SERVICESS3EC2LambdaRDSSQS
// IAM ポリシーの基本構造(JSON)
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}]
}

🗺️
ポリシーの全体像

IAM には複数の種類のポリシーがあり、それぞれ役割が異なります。「どれがどれの一部なのか」が混乱しやすいので、まず全体の関係を整理します。

ポリシーは大きく分けて「権限を与えるもの」「権限の上限を制限するもの」の2種類があります。これらは別々の仕組みであり、親子関係ではありません。

権限を与えるもの(Allow を定義)ポリシー(アイデンティティベースポリシー)ユーザー・ロールにアタッチ「この人は何ができるか」リソースベースポリシー(S3バケットポリシー等)リソース側にアタッチ「このリソースは誰に使わせるか」権限の上限を制限するもの(フィルター)SCP組織レベル(OU / アカウント)全社の統制ルールPermissionBoundaryユーザー / ロール単位権限委任の上限セッションポリシー一時セッション単位AssumeRole 時に絞る上段が「できること」を定義、下段が「できることの上限」を定義(親子関係ではない)
権限を与えるもの

ポリシー(アイデンティティベース)とリソースベースポリシーの2つ。「s3:GetObject を許可する」のようにAllowを定義します。これがないと何もできません

権限の上限を制限するもの(フィルター)

SCP・Permission Boundary・セッションポリシーの3つ。これら自体は何も許可しません。「上で許可された権限のうち、ここに書いてある範囲だけ通す」というフィルターです。

例えるなら、ポリシーが「社員証」で、フィルターが「建物の入館ゲート」です。社員証(ポリシー)を持っていても、ゲート(フィルター)が通してくれなければ入れません。逆にゲートが開いていても、社員証がなければ入れません。

SCP: 「この会社の社員は全員、この建物にしか入れない」(組織全体の上限)
Permission Boundary: 「この社員は3階までしか入れない」(個人の上限)
セッションポリシー: 「今回の訪問では会議室Aだけ使える」(一時的な上限)
よくある誤解: セッションポリシーや Permission Boundary は「ポリシー(アイデンティティベースポリシー)の一部」ではありません。それぞれ独立した仕組みで、JSON の形式は同じですが、アタッチ先と役割が異なります。IAM の評価エンジンはこれらを別々のレイヤーとして順番に評価します。

👤
ポリシー

正式名称はアイデンティティベースポリシー(Identity-based Policy)ですが、一般的に「IAMポリシー」や単に「ポリシー」と呼ばれます。IAM ユーザー・グループ・ロールにアタッチして、「このプリンシパルは何ができるか」を定義する最も基本的なポリシー形式です。

アイデンティティベースポリシーには管理方法の違いから3種類があります。それぞれ再利用性・柔軟性・管理コストのトレードオフが異なります。 実務ではカスタマー管理ポリシーを最小権限で作成して再利用するのがベストプラクティスとされています。 インラインポリシーは「このエンティティだけに絶対に共有させたくない」例外的なケースに限定して使うのが推奨されます。

AWS 管理ポリシーAmazonS3ReadOnlyAccessAdministratorAccessAmazonEC2FullAccessAWSが事前定義複数エンティティに共有カスタマイズ不可カスタマー管理MyS3WritePolicyLambdaDeployPolicyReadOnlyDevPolicy自分で作成・管理複数エンティティに共有完全カスタマイズ可インラインポリシー User / Role / Group↳ inline policy(直接埋め込み)エンティティに直接埋込共有・再利用不可例外的なケースに限定
AWS 管理ポリシー(AWS Managed Policy)

AWS が事前に用意した定義済みポリシーです(例: AmazonS3ReadOnlyAccess)。 導入が手軽で複数のユーザー・ロールに共有できますが、細かいカスタマイズは不可能です。最小権限の原則を厳密に守りたい場合には不向きです。

カスタマー管理ポリシー(Customer Managed Policy)

自分で作成・管理するポリシーです。最小権限の原則に従い必要な権限だけを定義でき、複数のユーザー・ロールに再利用可能です。 バージョン管理機能もあり、ポリシーの変更履歴を追跡できます。実務では最も推奨される方式です。

インラインポリシー(Inline Policy)

特定のユーザー・ロールに直接埋め込むポリシーです。他のエンティティとは共有できません。エンティティを削除するとポリシーも消えます。 「このロールだけに絶対に共有させたくない」という1対1の厳密な管理が必要な場合に限定して使います。

ポリシーの JSON 構造

ポリシーは JSON 形式で定義します。中心となるのは Statement 配列で、各ステートメントが「何を許可/拒否するか」を1つずつ定義します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",        // 許可 or 拒否("Deny")
      "Action": [              // どの操作を
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [             // どのリソースに対して
        "arn:aws:s3:::my-bucket",
        "arn:aws:s3:::my-bucket/*"
      ]
    }
  ]
}
Effect: Allow(許可)か Deny(拒否)のどちらか
Action: 対象の操作。s3:GetObject のように「サービス:操作」の形式で指定
Resource: 対象のリソース。ARN で指定。* は全リソース

📦
リソースベースポリシー

リソースベースポリシー(Resource-based Policy)は、S3 バケット、SQS キュー、Lambda 関数などのリソース側に直接アタッチするポリシーです。 アイデンティティベースポリシーが「この人は何ができるか」を定義するのに対し、リソースベースポリシーは「このリソースは誰に使わせるか」を定義します。Principal フィールドで許可するユーザー・ロール・アカウントを明示します。

特に重要なのがクロスアカウントアクセスのシナリオです。同一アカウント内と異なるアカウント間とで、許可に必要なポリシーの組み合わせが変わります。この違いを正確に理解することがセキュリティ設計の要です。

同一アカウント内IAM UserID-basedAllow ✓ORResource-basedAllow ✓アクセス許可どちらか一方のAllow で可クロスアカウントAccount AID-basedAllow ✓ANDResource-basedAllow ✓両方必須片方だけでは不可
同一アカウント内アクセス
ID ベースまたはリソースベースのどちらか一方に Allow があれば許可されます。両方に Allow がなくても問題ありません。
クロスアカウントアクセス
両方のポリシーで Allowが必要です。呼び出し元アカウントのIDベースポリシーと、リソース側のリソースベースポリシーの両方に Allow が必要です。片方だけでは許可されません。
すべてのサービスがリソースベースポリシーに対応しているわけではありません。S3・SQS・Lambda・SNS・KMS などは対応していますが、EC2 インスタンスなどは非対応です。非対応サービスへのクロスアカウントアクセスには IAM ロールの AssumeRole を使います。
JSON 例: S3 バケットポリシー
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::999888777666:root"
    },
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::my-bucket/*"
  }]
}

ポリシーとの違いは Principal フィールドがあることです。「誰に」許可するかをリソース側で指定します。上の例では別アカウント(999888777666)からの S3 読み取りを許可しています。

🏢
SCP(Service Control Policies)

SCP(サービスコントロールポリシー)は、AWS Organizations で使用する組織レベルのガードレールです。 会社の就業規則に例えると、「どんな部署の社員でも、これは絶対にやってはいけない」という全社規程に相当します。 OU(Organizational Unit)またはアカウントにアタッチし、そのアカウント内のすべてのIAMエンティティが実行できる操作の「上限」を定義します。

重要な点は、SCP は権限を「与える」ものではなく「制限する」ものだということです。 SCP はあくまで「許可してよい操作の範囲」を定義するフィルターであり、SCP 単体では何も許可しません。IAM ポリシーで Allow があっても、SCP の範囲外ならアクセスは拒否されます。 また、管理アカウント(Management Account)自体には SCP は適用されません

Organization (Root)SCPOU: DevelopmentSCPAccount AIAM UserIAM RoleRoot UserSCPが適用されるAccount BIAM UserIAM RoleManagement AccountSCP 非適用SCPの影響なしIAM Userも RootUserもSCPによる制限を受けない※セキュリティ上の注意点
SCP の評価モデル
SCP は許可の「フィルター(上限)」として機能します。SCP で許可されていないアクションは、IAM ポリシーで Allow されていても実行できません。 逆に、SCP で Allow されていても IAM ポリシーで Allow がなければアクセスはできません。
ルートユーザーにも適用される
通常の IAM ポリシーはルートユーザーに適用されませんが、SCP はルートユーザーにも適用されます。 これが SCP の大きな特徴であり、組織全体のセキュリティ統制に SCP が重要な役割を果たす理由です。
JSON 例: 開発 OU の SCP(許可リスト方式)
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": [
      "s3:*",
      "ec2:*",
      "lambda:*",
      "dynamodb:*"
    ],
    "Resource": "*"
  }]
}

このSCPでは S3, EC2, Lambda, DynamoDB のみ許可しています。このOUのアカウントでは、IAMポリシーで iam:CreateUser を Allow にしていても、SCPの許可リストに iam:* が含まれていないため実行できません

🔒
Permission Boundary(アクセス許可境界)

Permission Boundary は大規模組織で権限委任をする場面で使う機能です。個人や小規模チームではほとんど使いません。ただし IAM の評価ロジックを正確に理解するには知っておくべき概念です。

Permission Boundary(アクセス許可境界)は、IAM ユーザーやロールが持てる権限の「上限」を設定する機能です。

通常のポリシー(アイデンティティベースポリシー)は「何ができるか」を定義しますが、Permission Boundary は「何ができるかの最大範囲」を定義します。ポリシーで許可されていても、Boundary の範囲外なら拒否されます。

重要なポイントは、Boundary を設定しただけでは何も許可されないということです。ポリシーと Boundary の両方で許可されている操作だけが実行できます(積集合)。

具体例: 開発者ユーザー dev-tanaka の場合
ポリシーで許可s3:*ec2:*iam:CreateRoleiam:AttachRolePolicyBoundary で上限設定s3:*ec2:Describe*lambda:*(iam:* は含まれていない)↓ 両方で許可されているもの = 有効な権限実際に使える権限s3:* ✓ec2:Describe* ✓拒否される操作(Boundary 外)ec2:TerminateInstances ✕iam:CreateRole ✕
なぜ必要なのか? — 権限エスカレーションの防止

開発者に「自分で IAM ロールを作る権限」を渡したい場面を考えます。しかしポリシーだけで制御すると、開発者が AdministratorAccess を持つロールを作成し、自分の権限を超える操作ができてしまいます。

Permission Boundary を使えば、「ロールを作ってもよいが、この Boundary の範囲内のロールしか作れない」と制限できます。管理者が上限を決め、開発者はその範囲内で自由にロールを作成・管理できるので、セキュリティと開発の自由度を両立できます。

JSON 例: DevTeamBoundary ポリシー
// Permission Boundary 用ポリシー
// この範囲外の操作は、ポリシーで Allow でも拒否される
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"s3:*",
"ec2:Describe*",
"lambda:*",
"cloudwatch:*",
"logs:*"
],
"Resource": "*"
}]
}

この Boundary を付けたユーザーは、ポリシーで ec2:* を許可されていても、実行できるのは ec2:Describe* だけです。iam:* が含まれていないので、IAM 関連の操作はすべて拒否されます。

設定例: 管理者が開発者に Boundary を付ける
管理者が Boundary 用のポリシー(例: DevTeamBoundary)を作成する
開発者ユーザーに Boundary をアタッチする
開発者がロールを作成する際にも同じ Boundary を付けることを強制する
# ② 開発者に Boundary をアタッチ
aws iam put-user-permissions-boundary \
--user-name dev-tanaka \
--permissions-boundary \
arn:aws:iam::123456789012:policy/DevTeamBoundary
# 結果: dev-tanaka のポリシーに ec2:* があっても
# Boundary に ec2:Describe* しかなければ
# ec2:TerminateInstances は実行できない
ポリシーと Boundary の関係(Venn図)
ポリシーs3:*, ec2:*iam:CreateRolePermissionBoundarys3:*, ec2:Describe*lambda:*有効な権限s3:*ec2:Describe*(両方で許可された部分だけ)iam:CreateRole → Boundary外 → 拒否= 実際に使える権限
有効な権限 = ポリシー ∩ Permission Boundary。 Boundary は「権限の上限フィルター」であり、それだけでは何も許可しません。ポリシーで Allow かつ Boundary にも含まれている操作だけが実行できます。

⏱️
セッションポリシー

セッションポリシー(Session Policy)は、AssumeRoleGetFederationToken を呼び出す際にインラインで渡すポリシーです。 一時認証情報のスコープをさらに絞り込む仕組みで、ロールが持つ権限を超えることは絶対にできません。 Permission Boundary と同様に「交差(AND)」ロジックで動作します。

セッションポリシーが特に有効なのはマルチテナント環境です。 同じ強力なロールを使いながらも、セッションごとに異なるテナントのリソースだけにアクセスを制限できます。 これにより、ロールを大量に作成せずとも細かいアクセス制御が実現できます。

Caller(App / User)AssumeRole+ SessionPolicyAWS STSRole Policy ∩ SessionPolicy一時認証SessionAccessKeyIdSecretKeySessionTokenS3有効な権限 = Role Policy ∩ Session Policyセッションポリシーはロールの権限を超えることができない(縮小のみ)
有効な権限の計算方法
最終的な権限は「ロールのIAMポリシーで許可されている」かつ「セッションポリシーでも許可されている」のAND(交差)です。 セッションポリシーは権限を「広げる」ことはできず、「絞り込む」ことしかできません。
マルチテナントでの活用
全テナントのデータを操作できる強いロールを1つ用意しておき、各テナントのセッションではCondition: s3:prefix == tenant-id/のような制約をセッションポリシーで渡すことで、そのセッション中は自テナントのデータのみにアクセスを制限できます。
JSON 例: AssumeRole 時にセッションポリシーを渡す
# ロール自体は s3:* の権限を持っているが
# セッションポリシーで tenant-a のデータのみに絞る
aws sts assume-role \
--role-arn arn:aws:iam::123456:role/DataRole \
--role-session-name tenant-a-session \
--policy '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": "arn:aws:s3:::data-bucket/tenant-a/*"
}]
}'

ロールは s3:* を許可していますが、セッションポリシーで tenant-a/* に絞っています。このセッション中は tenant-b のデータにはアクセスできません。

評価の優先順位(黄金ルール)

IAM ポリシーの評価は、複数のポリシーが存在する場合でも常に決定論的なルールに従います。 最も重要な黄金ルールは「明示的 Deny は常に勝つ」です。 どんなに多くの Allow があっても、1つの Deny があれば必ず拒否されます。

IAM の評価は否定ベース(Deny-by-default)で設計されています。 何も設定されていない状態ではすべて拒否であり、明示的な Allow で初めてアクセスが可能になります。 この設計は「必要なものだけを許可する」最小権限の原則と一致しています。

リクエスト到着明示的 Deny あり?YES✕ DENYNO明示的 Allow あり?YES✓ ALLOWNO暗黙的 Deny(デフォルト)✕ DENY優先度①優先度②優先度③
1. 明示的 Deny(Explicit Deny)— 最優先

いずれかのポリシーに Effect: "Deny" でマッチするステートメントがあれば、他のすべての Allow を無視して即座に拒否します。SCP・Permission Boundary・ID ベース・リソースベースのどのポリシーに書かれた Deny であっても同様です。

2. 明示的 Allow(Explicit Allow)

明示的 Deny がなく、いずれかのポリシーに Allow があればアクセスを許可します。ただし SCP・Permission Boundary・セッションポリシーが存在する場合は、それらすべての「フィルター」も通過する必要があります。

3. 暗黙的 Deny(Implicit Deny)— デフォルト

何もポリシーがマッチしない場合、デフォルトで Deny になります。IAM ではすべてが暗黙的に拒否されており、明示的 Allow で初めてアクセスが可能になります。「Deny を書かなくても安全」なのはこのデフォルト Deny があるからです。

よくある質問(SAA頻出)

Q: 全ポリシーで Allow なのにアクセスできない場合は?
A: SCP または Permission Boundary が原因の可能性が高いです。これらは許可の「上限フィルター」を定義するため、ID ベースポリシーで Allow があっても、上限の範囲外なら拒否されます。AWS CloudTrail のログで "Access Denied" の詳細を確認し、どのポリシーが拒否しているかを特定しましょう。IAM Policy Simulator も有効です。
Q: SCP と Permission Boundary の違いは?
A: SCP は組織レベル(OU / アカウント単位)で適用されるガードレールで、ルートユーザーにも効きます。Permission Boundary はエンティティレベル(ユーザー / ロール単位)の上限です。SCP はセキュリティチームが全社統制のために管理し、Boundary は開発チームへの権限委任で権限エスカレーションを防ぐために使うのが一般的です。
Q: リソースベースポリシーだけでアクセスできる?
A: 同一アカウント内であれば可能です。S3 バケットポリシーで明示的に Allow されていれば、ID ベースポリシーの Allow がなくてもアクセスできます。ただしクロスアカウントの場合は、呼び出し元アカウントの ID ベースポリシーとリソース側のリソースベースポリシーの両方で Allow が必要です。
Q: ポリシーが何もない場合はどうなる?
A: IAM のデフォルトはすべて「暗黙的 Deny」です。ポリシーが1つもアタッチされていないユーザーやロールは、AWS リソースに対して何もできません。これは意図的な設計で、最小権限の原則を自然に強制する仕組みです。明示的 Allow がない限り、すべてのアクションが拒否されます。
Q: Condition キーはどのタイミングで評価される?
A: 各ポリシーのステートメントが評価される際に、Condition ブロックも同時に評価されます。Condition が満たされない場合、そのステートメントはマッチしないものとして扱われます(Allow にも Deny にもカウントされません)。aws:SourceIp や aws:RequestedRegion などの条件キーを使うことで、より細かいコンテキストベースのアクセス制御が可能です。

関連コンテンツ