ホーム アイデンティティ・アクセス管理

クロスアカウント IAM ロール設計

クロスアカウント IAM ロールの信頼ポリシー設計、条件キーによる絞り込み、confused deputy 問題とその防止、セッションポリシーを SAA 基礎から SAP 高度設計まで解説。

最終更新: 2026-07-27 カテゴリ: アイデンティティ・アクセス管理

クロスアカウント IAM ロールは、ある AWS アカウントのプリンシパルが別アカウントのロールを引き受ける 仕組みです。 マルチアカウント環境の権限委任の基盤となりますが、設計を誤ると深刻なセキュリティ事故に繋がります。 本記事ではクロスアカウントロールの設計を SAA / SAP 両面から整理します。

SAA レベル:基礎概念

クロスアカウントロールの仕組み

クロスアカウントアクセスは STS (Security Token Service) の AssumeRole で実現します。

[アカウント A (信頼元)]
  ユーザー Alice
    │ (sts:AssumeRole)

[アカウント B (信頼先)]
  ロール CrossAccountRole
    信頼ポリシー: アカウント A の Alice を信頼
    権限ポリシー: S3 読み取り等

SAA レベル:基礎概念

クロスアカウントアクセスは 「信頼ポリシー (誰を信頼するか)」「権限ポリシー (何を許可するか)」 の 2 つのポリシーで構成されます。 信頼ポリシーでアカウント A を信頼し、権限ポリシーでアカウント B 内の操作を許可する、 この 2 段階が SAA の基本構造です。

信頼ポリシー (Trust Policy) の基本

信頼ポリシーは 誰がこのロールを AssumeRole できるか を定義します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::ACCOUNT_A:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

SAA 試験のポイント

信頼ポリシーの Principal に arn:aws:iam::ACCOUNT_A:root を指定すると、 アカウント A の全プリンシパル がこのロールを引き受けられます。 ただし「引き受けられる」だけで、アカウント A 側のユーザーにも sts:AssumeRole を許可する IAM ポリシーが必要です(双方向の許可が必要)。

双方向の許可が必要

クロスアカウントアクセスには 両アカウントでの許可 が必要です。

必要な許可設定場所
信頼元 (アカウント A)sts:AssumeRole をユーザーに許可IAM ポリシー
信頼先 (アカウント B)アカウント A を信頼ロールの信頼ポリシー

SAA 頻出

「信頼ポリシーだけでアクセスできるわけではない」 は SAA の超頻出です。 信頼元アカウントのユーザーにも sts:AssumeRole を許可する IAM ポリシーが必要です。 双方向の許可が揃って初めてアクセス可能になります。

一時クレデンシャルの発行

AssumeRole が成功すると、一時クレデンシャル が発行されます。

  • アクセスキー ID / シークレット / セッショントークン: 一時的
  • 有効期限: 15 分〜 12 時間(最大)
  • Long-lived クレデンシャル不要: アクセスキーの配布・管理が不要

一時クレデンシャルの利点

クロスアカウントアクセスに STS を使うと Long-lived なアクセスキーを配布しなくて済みます。 キー漏洩リスクが大幅に下がるため、AWS はアクセスキーよりロール + STS を推奨しています。

SAP レベル:高度な設計シナリオ

Confused Deputy 問題

SAP で最も重要なセキュリティ論点が Confused Deputy (混同代理) 問題 です。

SAP レベル:高度な設計シナリオ

Confused Deputy 問題 とは、信頼された代理者 (Deputy) が悪意のあるユーザーの リクエストを誤って実行してしまう脆弱性です。 例えば「アカウント A の Lambda がアカウント B のロールを引き受ける」構成で、 信頼ポリシーにアカウント A 全体を許可すると、アカウント A 内の任意のユーザー/ロール (悪意のあるユーザーが作成したものも含む)が B のロールを引き受けられる漏洞が生まれます。

# 脆弱な構成
アカウント B のロール信頼ポリシー:
  Principal: { "AWS": "arn:aws:iam::ACCOUNT_A:root" }   ← アカウント A 全体を信頼

# 攻撃シナリオ
1. 悪意あるユーザーがアカウント A に IAM ロールを作成
2. そのロールからアカウント B のロールを AssumeRole
3. アカウント B のリソースに不正アクセス

Confused Deputy の防止 — aws:SourceArn / aws:SourceAccount

この問題を防ぐには、信頼ポリシーで 条件キーによる絞り込み を行います。

{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::ACCOUNT_A:root"
  },
  "Action": "sts:AssumeRole",
  "Condition": {
    "StringEquals": {
      "aws:SourceAccount": "ACCOUNT_A",
      "aws:SourceArn": "arn:aws:lambda:ap-northeast-1:ACCOUNT_A:function:MyFunction"
    }
  }
}

Confused Deputy 防止の必須条件

aws:SourceArnaws:SourceAccount で具体的なソースを限定 することが Confused Deputy 防止のベストプラクティスです。

  • aws:SourceAccount: アカウントレベルで絞り込み
  • aws:SourceArn: ARN レベルで絞り込み(より厳格) 両方を組み合わせるのが最も安全で、SAP 試験ではこの条件キーが頻出します。

IAM ロールの信頼ポリシー設計パターン

SAP では用途に応じた信頼ポリシーの設計パターンを使い分けます。

パターンPrincipal条件キーユースケース
AWS サービスロールlambda.amazonaws.comaws:SourceArnサービスへの権限委任
クロスアカウント (ユーザー)別アカウントの ARNaws:PrincipalTag特定ユーザーのみ
クロスアカウント (サービス)別アカウントの rootaws:SourceArnLambda 別アカウント等
外部 IdPSAML / OIDC プロバイダSAML:aud, aws:RequestedRegionフェデレーション

サービスロールの信頼ポリシー

Lambda や EC2 など AWS サービスが引き受けるロール の信頼ポリシーでも aws:SourceArnどのリソースがこのロールを使えるか を絞るのが SAP のベストプラクティスです。 これにより Confused Deputy を AWS サービス間でも防止できます。

セッションポリシーによる権限の動的絞り込み

AssumeRole 時に セッションポリシー を渡すと、セッション中の権限を動的に絞り込めます。

ロールの権限: S3 の全バケット读写
  + セッションポリシー: 特定バケットのみ
= 実効権限: 特定バケットのみ
  • 権限の AND: ロール権限 ∩ セッションポリシー = 実効権限
  • 用途: 時限的・条件的な権限絞り込み
  • 制約: 権限を 拡張はできない(絞り込みのみ)

セッションポリシーの活用場面

「普段は ReadOnly だが緊急時に書き込み権限を一時付与」といった Break-Glass (緊急時の権限昇格) シナリオでセッションポリシーが活躍します。 基本ロールは最小権限にし、緊急時にセッションポリシーで追加権限を付与する設計が SAP の定石です。

External ID による第三者委任の保護

External ID は、第三者(SaaS ベンダ等)にアカウントへのアクセスを委任する際の保護機能です。

{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::VENDOR_ACCOUNT:root"
  },
  "Action": "sts:AssumeRole",
  "Condition": {
    "StringEquals": {
      "sts:ExternalId": "一意のランダム文字列"
    }
  }
}

External ID の重要性

SaaS ベンダが複数顧客の AWS アカウントにアクセスする構成では、 External ID なし だと Confused Deputy 問題が発生します。 「顧客 A のリクエストを誤って顧客 B のアカウントで実行」を防ぐため、 External ID は第三者委任では必須です。SAP で頻出のセキュリティ論点です。

ロールの権限ポリシー設計

信頼ポリシーだけでなく、権限ポリシーの最小化 も SAP の論点です。

  • 最小権限の原則: 必要なアクション・リソースのみ許可
  • 条件キーの活用: aws:RequestedRegion, aws:ResourceTag で動的制限
  • ReadOnly ベース + 必要時のみ書き込み: 誤操作防止
  • アクセスアドバイザーの活用: 未使用権限の特定と削除

SAP レベル:高度な設計シナリオ

SAP では IAM Access Analyzer で未使用権限を特定し、 権限の継続的 最小化 (Least Privilege Maintenance) を設計します。 ロール作成時だけでなく運用中の権限ドリフトを検知・是正するプロセスが求められます。

クロスアカウントアクセスの監査

監査項目ログ / ツール設計論点
AssumeRole 実行履歴CloudTrail (AssumeRole)権限使用の追跡
信頼ポリシー変更CloudTrail (IAM API)設定変更の検知
未使用ロールIAM Access Analyzer不要ロールの削除
過剰権限IAM Access Analyzer権限の最小化推奨

監査のベストプラクティス

CloudTrail の AssumeRole イベントは ログ集約アカウント に集め、 GuardDuty で 異常な AssumeRole パターン(未使用ロールの突然使用、新規リージョンからの使用等) を検知する構成が SAP の標準です。

制約とクォータ

項目制約
ロールの最大セッション12 時間
1 アカウントのロール数1000(クォータ拡張可)
信頼ポリシーの Principalアカウント / サービス / SAML / OIDC
セッションポリシー絞り込みのみ(拡張不可)

まとめ

  • SAA: クロスアカウントアクセスは信頼ポリシー + 権限ポリシーの双方向許可、 STS による一時クレデンシャル発行、という基本を理解する。
  • SAP: Confused Deputy 問題と aws:SourceArn / aws:SourceAccount による防止、 External ID、セッションポリシー、権限の継続的最小化が求められる。

次は SCP と RCP で、組織レベルのガードレール設計を学びましょう。

スポンサーリンク(広告枠) 728×90