IAM — ポリシー評価・権限境界・クロスアカウント
IAMポリシー評価ロジック、Permission Boundary、SCP、ABAC、フェデレーションを徹底解説
IAM 権限評価の全体像
AWS IAMの権限評価は、複数のポリシータイプが階層的に作用する仕組みです。ここではそのメカニズムを正確に理解することが、本試験の合格と実務での事故防止の鍵になります。
ポリシー評価エンジンの流れ
権限評価の判定フローは、以下の順序で進みます。
- デフォルトは「明示的な拒否」
- Organizations SCP(Service Control Policy)でチェック
- リソースベースのポリシー(存在時)
- Permission Boundary でチェック
- Identity-based ポリシーでチェック
- セッションポリシー(AssumeRole時)でチェック
- どのポリシーにも「拒否」があれば → アクセス拒否
- すべてを通過したら → アクセス許可
重要な原則:
- 明示的な拒否は覆らない。どのポリシーで許可されていても、1つの「Deny」ですべてがブロックされます
- 許可には複数の同意が必要。例えば Permission Boundary では「許可」していても、Identity-based で「許可」されていなければアクセス不可
- 評価順序は概ね決まっているが、実装詳細は非公開部分あり。試験では「最終的な結果」を問う問題が多い
試験で狙われるポイント:
- SCPと Identity-based の両方で Deny がある場合の結果
- Permission Boundary が有効な際の複雑な権限構成
- Cross-Account での評価順序
IAM ポリシー評価フロー図
Loading diagram...
ポリシーエディタの実際の操作画面
AWS マネジメントコンソールの IAM ポリシーエディタは以下のように表示されます。

ポリシーの種類と役割
1. Identity-based ポリシー
ユーザー、グループ、ロールに直接アタッチされるポリシーです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "10.0.0.0/8"
}
}
}
]
}
特徴:
- 最も一般的な権限付与方式
- 複数のポリシーをアタッチ可能
- 最大管理ポリシーサイズは 10 KB(インラインポリシー)、管理ポリシーは 10 KB
- ユーザーあたりアタッチできる管理ポリシー数は最大 20 個
制約と落とし穴:
- インラインポリシーの数に上限がない(10 KB 制限内)が、数が多いと管理が破綻しやすい
- 過去に AWS ではインラインポリシー推奨から管理ポリシー推奨へシフト
"Action": "*"と"Resource": "*"は Admin アクセスと同等(S3以外)
2. Resource-based ポリシー
S3、SNS、SQS、KMS などのリソース側に設定されるポリシーです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT-B:root"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-a/*"
}
]
}
特徴:
- Principal を指定して、「誰が」アクセスできるかを定義
- Cross-account アクセスの主要な手段
- リソース所有者が直接制御
- IAM ロールも Principal として指定可能
評価時の重要性:
- Identity-based で許可されていなくても、Resource-based で許可されていればアクセス可能(ただし同じ AWS アカウント内など条件あり)
- Cross-account の場合は、両方のアカウントで許可されている必要がある
- アカウント A のロール:Identity-based で s3:GetObject を許可
- アカウント B のバケット:アカウント A のロールを Principal に s3:GetObject を許可
- この両方が必要
3. Permission Boundary(権限境界)
ユーザーまたはロールが取得できる最大権限を定義します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:*",
"s3:GetObject",
"s3:PutObject"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "logs:*",
"Resource": "*"
},
{
"Effect": "Deny",
"Action": "iam:*",
"Resource": "*"
}
]
}
重要な特性:
| 特性 | 説明 |
|---|---|
| 「最大権限」の概念 | Identity-based で許可されていても、Boundary に含まれていなければアクセス不可 |
| デフォルト動作 | Boundary が未設定の場合、制限なし(Identity-based のみで評価) |
| 複数設定 | Boundary は1つのみ設定可能。複数は不可 |
| Deny との関係 | Boundary の Deny は Identity-based の Allow を「論理積」で制限 |
| 評価順序 | Identity-based と Boundary の交集合を取る |
複雑な例:権限の交集合
ユーザーに以下を設定した場合:
Identity-based:
{
"Effect": "Allow",
"Action": ["ec2:*", "s3:*"],
"Resource": "*"
}
Permission Boundary:
{
"Effect": "Allow",
"Action": ["ec2:DescribeInstances", "s3:GetObject"],
"Resource": "*"
}
結果: ユーザーが実行できるのは ec2:DescribeInstances と s3:GetObject のみ。他の EC2 操作や S3 操作はすべてブロック。
試験で狙われるポイント:
- Boundary で “Deny” は使わない(制限しない)。必ず “Allow” で上限を定義
- Boundary の交集合を正確に計算できるか
- Boundary が設定されていない場合の挙動
Permission Boundary の交集合図
Loading diagram...
4. Organizations SCP(Service Control Policy)
組織レベルで全アカウントに対して適用される最大権限ポリシーです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
},
{
"Effect": "Deny",
"Action": "iam:DeleteUser",
"Resource": "*"
}
]
}
重要な特性:
| 特性 | 説明 |
|---|---|
| ルート(親組織)に適用 | ルート OU(Organizational Unit)に適用すると配下のすべてのアカウントに適用 |
| IAMユーザーには影響しない | ルートアカウントのユーザー・API キーは SCP の影響を受けない |
| 管理アカウントは除外可能 | 設定次第で管理アカウントのみ SCP を回避可能 |
| 白リストと黒リストの混在 | フルパス時には "Allow": "*" と "Deny": "..." を混在させて使用 |
| クォータ | 組織あたり最大 SCP の数、アカウント/OU あたりの SCP の関連付けなどに上限あり |
よくある設計パターン:黒リストベース
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
},
{
"Effect": "Deny",
"Action": [
"iam:DeleteRole",
"iam:DeleteRolePolicy",
"iam:PutRolePolicy"
],
"Resource": "*"
}
]
}
設計パターン:白リストベース
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:*",
"s3:*",
"rds:*"
],
"Resource": "*"
},
{
"Effect": "Deny",
"Action": [
"iam:*",
"organizations:*"
],
"Resource": "*"
}
]
}
制約と落とし穴:
- SCP は委任アカウント(Delegated Admin)でも管理不可。管理アカウント(Management Account)のみ
- ルートアカウントのアクセスキーは SCP の影響を受けない(IAM ユーザーのみ対象)
- SCP を無効化すると「すべてが許可される」状態になる。実装時は明示的な
"Allow"を含める
試験で狙われるポイント:
- SCP が適用されないケース(ルートユーザー、ルートアカウント IAM ユーザー)
- 複数の SCP が適用される場合の評価(共通部分のみが有効)
- SCP と IAM ポリシーの評価順序
5. セッションポリシー
AssumeRole や GetSessionToken 時に、一時的に権限をさらに制限する仕組みです。
import boto3
sts = boto3.client('sts')
response = sts.assume_role(
RoleArn='arn:aws:iam::123456789012:role/MyRole',
RoleSessionName='session-1',
DurationSeconds=900,
Policy='''
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/public/*"
}
]
}
'''
)
重要な特性:
- ロール本体の Identity-based よりも更に制限できる
- セッションポリシーなしでロールアシューム → ロール本体の権限をすべて取得
- セッションポリシーありでロールアシューム → ロール本体と セッションポリシーの交集合のみ
制約:
- セッションポリシーの最大サイズ:2048 バイト
Denyステートメントは無視される(制限のみ)- 一時的なセッション中のみ有効
試験で狙われるポイント:
- AssumeRole 時のセッションポリシーの効果
- Root トークンでのセッションポリシー(IAM ユーザーのアクセスキー経由の場合)
ポリシー評価の複雑なシナリオ
シナリオ 1:Permission Boundary と Identity-based の交集合
Identity-based(ユーザーAに付与):
{
"Effect": "Allow",
"Action": ["ec2:*", "s3:*"],
"Resource": "*"
}
Permission Boundary(ユーザーAに設定):
{
"Effect": "Allow",
"Action": ["ec2:DescribeInstances", "ec2:StartInstances"],
"Resource": "*"
}
結果: ユーザーA が実行できるのは ec2:DescribeInstances と ec2:StartInstances のみ。S3 操作はすべて拒否。
シナリオ 2:SCP と Identity-based の Deny
SCP(組織ルートに適用):
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
(ここでは事実上、制限なし)
Identity-based(ユーザーに付与):
{
"Effect": "Deny",
"Action": "iam:DeleteUser",
"Resource": "*"
}
結果: ユーザーは iam:DeleteUser を実行不可。
シナリオ 3:Cross-Account + Permission Boundary
アカウント A のロール(Permission Boundary 設定)が、アカウント B のリソースにアクセスする場合:
アカウント A側(ロールの Identity-based):
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
アカウント A側(Permission Boundary):
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "*"
}
アカウント B側(S3 バケットポリシー):
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT-A:role/MyRole"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-b/*"
}
結果: ロールが実行できるのは s3:GetObject のみ。
Conditions(条件)の活用
IAM ポリシーの条件句は、権限を時間軸・ネットワーク・タグなどで動的に制限する最強ツールです。
主要な Condition キー
| Condition キー | 説明 | 例 |
|---|---|---|
aws:SourceIp | リクエスト元 IP | VPN 接続時のみ許可 |
aws:PrincipalOrgID | 組織 ID | 同じ組織内のアカウントのみ |
aws:username | IAM ユーザー名 | 特定ユーザーのみ許可 |
aws:CurrentTime | 現在時刻 | 営業時間のみ許可 |
aws:SourceArn | リクエスト元の ARN | 特定のロール/ユーザーのみ |
aws:SecureTransport | HTTPS 使用 | true の場合のみ |
s3:x-amz-acl | S3 ACL(リクエストパラメータ) | public-read を禁止 |
ec2:ResourceTag/* | リソースのタグ値 | タグベースアクセス制御(ABAC) |
複雑な Condition 例:ABAC(属性ベースアクセス制御)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*",
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Environment": "${aws:username}"
}
}
}
]
}
このポリシーは、ユーザー名と同じ値を Environment タグに持つ EC2 インスタンスにのみアクセス可能にします。例えば、ユーザー alice は Environment=alice のインスタンスにのみアクセス可能。
利点:
- ポリシー数が減少(リソースごとにポリシーを書く必要がない)
- スケーラビリティが向上(新しいリソース追加時、タグ付けのみで権限が自動適用)
試験で狙われるポイント:
${aws:username}などの政策変数の使用- タグベースの Condition の評価
- AND / OR の論理評価(複数の Condition)
できないこと・制約
クォータと上限
| 対象 | 上限 | 影響 |
|---|---|---|
| IAM ユーザー数(アカウント) | デフォルト 5000、上限緩和申請可 | 大規模組織では申請必須 |
| グループ数 | デフォルト 300、上限緩和申請可 | フラット構造が推奨 |
| ロール数 | デフォルト 1000、上限緩和可 | Cross-account 多用時は注意 |
| ユーザー/ロール あたりの管理ポリシー数 | 20 | インラインポリシーで補う必要なし |
| インラインポリシーサイズ | 10 KB | 管理ポリシー使用推奨 |
| 管理ポリシーサイズ | 10 KB | 大規模権限は分割が必須 |
| AssumeRole のセッション名 | 64 文字 | CloudTrail ログに記録される |
| セッションポリシーサイズ | 2048 バイト | JSON の簡潔化が必須 |
ポリシー評価での制約
| 制約 | 説明 | 回避方法 |
|---|---|---|
| Deny は覆らない | 明示的な Deny があれば、すべてが拒否される | - |
| カラムベース制限なし | IAM はテーブルのカラム単位での制限不可(KMS など一部例外) | RDS や他サービスで補完 |
| Resource の正規化 | ワイルドカード展開の時点で評価(動的な値は使用不可) | Condition で代替 |
| リソースタグでの制限 | すべてのリソースがタグをサポートしていない | IAM ポリシーで明示的に指定 |
よくある落とし穴
落とし穴 1:ワイルドカード の誤解
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucket/*"
}
このポリシーでは、s3:GetBucketPolicy など バケット自体への操作は許可されていません。バケット操作とオブジェクト操作は ARN が異なります。
修正:
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket",
"arn:aws:s3:::bucket/*"
]
}
落とし穴 2:Permission Boundary で Deny を使う
// 間違い
{
"Effect": "Deny",
"Action": "iam:DeleteUser",
"Resource": "*"
}
Permission Boundary は 上限を定義するものであり、制限は "Allow" で明示的に列挙します。Deny を使うと予期しない動作が発生します。
落とし穴 3:Cross-Account の片側だけ許可
アカウント A のロールが、アカウント B のバケットにアクセスする場合:
- アカウント A の Identity-based で許可 ✓
- アカウント B のバケットポリシーで許可 ✓
- 両方 必須
どちらか片方だけでは失敗します。
落とし穴 4:AssumeRole の ExternalId を無視
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT-A:role/MyRole"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "unique-secret-123"
}
}
}
ExternalId なしでは、アカウント A のどのロールでも AssumeRole できます。本試験では セキュリティベストプラクティスとして出題される可能性が高い。
落とし穴 5:SCP がルート IAM ユーザーに効かない
- ルートアカウントの IAM ユーザー → SCP の影響を受ける
- ルートアカウント(Management Account)の IAM ユーザー → SCP の影響を受ける
- ルートアカウント認証情報(アクセスキー) → SCP の影響を受けない(ルートユーザーの API キー)
試験では「どのユーザーが SCP の影響を受けるか」を問う問題が頻出です。
クロスアカウント設計パターン
パターン 1:AssumeRole ベース(最推奨)
構成:
アカウント A(信頼元)
- ユーザー alice → ロール RoleA をアシューム
アカウント B(信頼先)
- ロール RoleB(AssumeRole 許可の信頼ポリシー)
アカウント A 側(Identity-based):
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::ACCOUNT-B:role/RoleB"
}
アカウント B 側(RoleB の信頼ポリシー):
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT-A:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "unique-secret"
}
}
}
利点:
- セッション権限で一時的な制限が可能(セッションポリシー)
- CloudTrail で監査追跡が明確
- リスク分離が可能
パターン 2:リソースベースのポリシー
構成:
アカウント A
- ロール RoleA
アカウント B
- S3 バケット(バケットポリシーで RoleA を許可)
バケットポリシー:
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT-A:role/RoleA"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}
利点:
- AssumeRole 不要(直接アクセス)
- シンプルな設定
欠点:
- 権限の一時的な制限(セッションポリシー)が使えない
- RoleA 本体の権限に依存
パターン 3:ロール チェーン(スイッチロール)
構成:
アカウント A
- ロール RoleA → AssumeRole → RoleB(アカウント B)
- RoleB → AssumeRole → RoleC(アカウント C)
各ロールが次のロールをアシューム可能に設定します。
注意点:
- 監査が複雑になる(CloudTrail で追跡困難)
- パフォーマンス低下(複数の AssumeRole が必要)
- 試験では避けるべき設計として言及される可能性
Cross-Account アクセスの評価フロー
Loading diagram...
フェデレーション と IAM Identity Center
SAML ベースのフェデレーション
外部の IDP(IdP)から AWS へのアクセスを提供します。
フロー:
ユーザー(Okta など)
- SAML Assertion ↓ IdP
- SAML 信頼ポリシー ↓ IAM ロール
- Assume ↓ AWS リソース
IAM ロールの信頼ポリシー例:
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::123456789012:saml-provider/Okta"
},
"Action": "sts:AssumeRoleWithSAML",
"Condition": {
"StringEquals": {
"SAML:aud": "https://signin.aws.amazon.com/saml"
}
}
}
特徴:
- 既存の企業 IDP を統合可能(Active Directory など)
- Federation Token は最大 1 時間(更新不可)
- CloudTrail で federated principal として記録される
IAM Identity Center(IAM Identity Center)
AWS が提供するマネージドフェデレーションサービス。
構成:
IAM Identity Center
- Cloud Identity Directory(AWS が管理)
- External IDP 統合(Okta, Azure AD など) ↓ ユーザー・グループ管理 ↓ Permission Sets ↓ アカウント・ロール割り当て
Permission Sets の例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["ec2:DescribeInstances"],
"Resource": "*"
}
]
}
特徴:
- 複数アカウント管理が一元化
- セッション期限をコントロール可能
- Permission Sets は組織全体で再利用可能
Identity Center vs SAML:
| 特性 | SAML | Identity Center |
|---|---|---|
| セットアップ複雑度 | 高い(手動設定多い) | 低い(ウィザード) |
| 複数アカウント管理 | 複雑 | シンプル |
| ユーザー同期 | 手動 | 自動 |
| セッション期限 | 1 時間固定 | カスタマイズ可能 |
| コスト | 無料 | 有料(ユーザーあたり) |
試験で狙われるポイント:
- SAML Federation の信頼ポリシー
- Identity Center の Permission Sets と組織設計の関係
ABAC(属性ベースアクセス制御)
基本概念
IAM ポリシーでユーザーやリソースの属性(タグ) に基づいてアクセスを制御します。
例:
User: alice
- Tags:
- Department=Engineering
- Level=Senior
EC2 Instance:
- Tags:
- Owner=alice
- Environment=production
- Level=Senior
ポリシー: alice が Owner タグを持つリソースにアクセス可能
ABAC のポリシー例
{
"Effect": "Allow",
"Action": "ec2:TerminateInstances",
"Resource": "arn:aws:ec2:*:*:instance/*",
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Owner": "${aws:username}",
"ec2:ResourceTag/Department": "${aws:PrincipalTag/Department}"
}
}
}
この例:
- ユーザーが Owner タグとして自分のユーザー名を持つインスタンス
- AND ユーザーのタグ Department とリソースの Department タグが同じ
- この両方の条件を満たすインスタンスのみ終了可能
ABAC vs RBAC
| 特性 | RBAC | ABAC |
|---|---|---|
| スケーラビリティ | ロール数が増加 | タグ量で管理 |
| リソース追加時 | 新しいロール作成が必要 | タグ付けのみ |
| ポリシー数 | 多い | 少ない |
| 複雑度 | 低い | 高い |
| 適用範囲 | AWS IAM に限定 | EC2, S3, RDS, DynamoDB など一部 |
ABAC 利用時のベストプラクティス:
-
タグスキーマを統一
- 命名規則を決める(
Department,Environment,Ownerなど) - チーム全体で徹底
- 命名規則を決める(
-
タグの自動付与
- CloudFormation や Terraform で自動化
- Launch Template で EC2 の自動タグ付け
-
Permission Boundary + ABAC
{ "Effect": "Allow", "Action": "ec2:*", "Resource": "*", "Condition": { "StringEquals": { "ec2:ResourceTag/Department": "${aws:PrincipalTag/Department}" } } }
試験で狙われるポイント:
- 政策変数(
${aws:username},${aws:PrincipalTag/*}など)の使用 - ABAC の限界(すべてのリソースタイプをサポートしない)
ベストプラクティス
1. 最小権限の原則(Principle of Least Privilege)
ポリシー設計の基本:
// 間違い:広すぎる
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
// 正しい:必要最小限
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/documents/*"
]
}
段階的なレビュー:
- 設計段階:ユースケースを書き出す(何をするのか)
- 実装段階:必要なアクションのみ定義
- 監査段階:CloudTrail で実際の使用を確認、不要なアクションを削除
2. 権限の定期的な監査
CloudTrail を使った監査:
import boto3
import json
cloudtrail = boto3.client('cloudtrail')
events = cloudtrail.lookup_events(
LookupAttributes=[
{
'AttributeKey': 'ResourceType',
'AttributeValue': 's3'
}
]
)
for event in events['Events']:
print(json.dumps(json.loads(event['CloudTrailEvent']), indent=2))
Access Analyzer を使った自動分析:
- 外部アクセス可能なリソースを自動検出
- ポリシーの妥当性を検証
3. グループベースの権限管理
aws-developers グループ
├── EC2 読み取り権限
├── S3 開発環境へのアクセス
└── CloudWatch ログ読み取り
aws-admins グループ
├── IAM 全操作
├── Organization 管理
└── Billing
ポリシーアタッチ:
aws iam attach-group-policy \
--group-name aws-developers \
--policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess
4. Service-Linked Roles の活用
AWS 一部サービスが自動作成し管理するロール。
# AWS Lambda が自動作成する実行ロール
aws iam get-role --role-name AWSLambdaBasicExecutionRole
特徴:
- 削除不可(サービスがアンリンクするまで)
- 信頼ポリシーは変更不可
- 権限は事前に定義(カスタマイズ不可)
5. MFA の強制
{
"Effect": "Allow",
"Action": "iam:DeleteUser",
"Resource": "*",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
実装例(IAM ユーザーの管理操作時):
{
"Effect": "Deny",
"Action": "iam:*",
"Resource": "*",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
他サービスとの連携パターン
CloudTrail との連携
すべての IAM アクションは CloudTrail に記録されます。
{
"eventVersion": "1.05",
"userIdentity": {
"type": "IAMUser",
"principalId": "AIDACKCEVSQ6C2EXAMPLE",
"arn": "arn:aws:iam::123456789012:user/alice",
"accountId": "123456789012",
"userName": "alice"
},
"eventTime": "2026-04-27T10:30:45Z",
"eventSource": "iam.amazonaws.com",
"eventName": "CreateUser",
"awsRegion": "us-east-1",
"sourceIPAddress": "192.0.2.1",
"userAgent": "aws-cli/2.10.0"
}
監査ポイント:
eventName:何のアクションが実行されたかsourceIPAddress:どこから実行されたかrequestParameters:具体的なパラメータ
AWS Config との連携
IAM 設定の変更を自動検追跡。
Rule: iam-policy-no-statements-with-admin-access
→ Admin 権限を持つポリシーを自動検出
Rule: iam-root-access-key-check
→ ルートアカウントのアクセスキー使用を検出
Organizations + SCP との連携
Organization Root
├── SCP: 組織全体で IAM 削除禁止
├── OU: Production
│ ├── SCP: EC2 削除禁止
│ └── Account A
├── OU: Development
│ ├── SCP: なし(より自由)
│ └── Account B
└── OU: Security
├── SCP: 厳密
└── Account C (Delegated Admin)
AWS SSM Session Manager との連携
IAM ロールベースの EC2 へのセッションレス接続。
{
"Effect": "Allow",
"Action": [
"ssm:StartSession",
"ssm:ResumeSession",
"ssm:TerminateSession"
],
"Resource": [
"arn:aws:ssm:*:*:session/SessionManager-*",
"arn:aws:ec2:*:*:instance/*"
],
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Environment": "production"
}
}
}
試験で狙われるポイント総まとめ
| トピック | ポイント | 頻度 |
|---|---|---|
| ポリシー評価順序 | 明示的 Deny → SCP → Boundary → Identity-based → セッションポリシー | 必出 |
| Permission Boundary | 交集合、Deny は非推奨、最大権限の定義 | 高確度 |
| Cross-Account | 両アカウントの許可が必須、ExternalId の重要性 | 必出 |
| SCP の制約 | ルートユーザー IAM キーに効かない | 高確度 |
| ABAC | 政策変数の使用、スケーラビリティ | 中程度 |
| フェデレーション | SAML vs Identity Center、信頼ポリシー | 中程度 |
| Condition | タグベース制限、SourceIp、MFA 強制 | 高確度 |
| できないこと | クォータ、カラムベース制限、ワイルドカード誤解 | 中程度 |
まとめ
IAM の本質は「複数のポリシーレイヤーの交集合と AND 演算」です。
- Identity-based:基本の権限定義
- Permission Boundary:上限の定義
- SCP:組織全体の大枠
- Resource-based:リソース所有者の最終判定
- セッションポリシー:一時的な制限
この5つが各レイヤーで協調することで、スケーラブルで監査可能なアクセス制御が実現します。
試験では「複雑なシナリオで最終的なアクセス許可・拒否を判定する」問題が必出。各ポリシーの評価順序と、複数ポリシーの交集合を正確に計算できることが合格の鍵です。