【テクニカル・上級編】 クラウド環境におけるクロスアカウント攻撃と信頼関係の悪用 – オフェンシブセキュリティ & リバースエンジニアリング防御ガイド

クラウドの「信頼」をハックする:クロスアカウント攻撃の深淵とアーキテクチャの陥穽

多くのクラウドアーキテクトは、「IAMロールの信頼関係」を単なるアクセス制御のリストだと誤解している。だが、レッドチームの視点から見れば、それは「攻撃者がピボット(足場)を確保するための、最も効率的な高速道路」に他ならない。

今回は、AWSのクロスアカウントアクセス、特に sts:AssumeRole を軸にした信頼関係の悪用と、外部ID(External ID)の設計上の盲点について、実戦的な視点から解剖する。

—

1. 信頼関係の「暗黙の了解」に潜む攻撃ベクトル

クロスアカウントアクセスを構成する際、多くのエンジニアは Principal にアカウントIDを直書きし、それで安全だと錯覚する。だが、攻撃者は「そのアカウント内での権限昇格」を突破口にする。

攻撃のロジック:コンプロマイズの連鎖

1. 初期侵入: 被害者のアカウントAで、EC2インスタンスメタデータや、開発者のローカルPCからIAMクレデンシャルを奪取。
2. 偵察: aws sts get-caller-identity で権限を確認後、list-roles を実行し、信頼関係を持つターゲット(アカウントB)への AssumeRole パスを特定。
3. ピボット: アカウントBのロールに対して sts:AssumeRole を実行。ここで「外部ID」が設定されていなければ、攻撃は成功する。

ここで重要なのは、「信頼関係は一方通行ではない」ということだ。アカウントAの管理者が「アカウントBを信用する」と決めた瞬間、アカウントBの管理者(あるいはBを乗っ取った攻撃者)に、アカウントAの権限を明け渡したことになる。

—

2. 外部ID(External ID)の真の価値と「見せかけの防御」

AWSが提唱する「外部ID」は、いわゆる「Confused Deputy(混同された代理人)」問題を防ぐための鍵だ。しかし、現場ではこの外部IDが「ただのパスワード」として扱われ、推測可能な値(例:company-name-123など)に設定されているケースが後を絶たない。

脆弱な信頼関係ポリシー(アンチパターン)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::123456789012:root" },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "sts:ExternalId": "StaticExternalID" 
          // 外部IDが静的かつ推測可能だと、総当たり攻撃や情報漏洩で即座に突破される
        }
      }
    }
  ]
}

レッドチームの監査ポイント:
外部IDは、予測不可能なランダムなUUIDを使用し、かつ「そのロールで何ができるか」を最小権限(Least Privilege)で厳密に制限しなければならない。もし sts:AssumeRole された先が AdministratorAccess であれば、クロスアカウント攻撃は「全権奪取」と同義となる。

—

3. 防御の最前線:ガードレイルとリアルタイム監査

生成AIが台頭する現在、攻撃者はプロンプトインジェクションを用いて、クラウド環境のIAM情報や設定ファイルを読み出そうと躍起になっている。防御側は、ポリシーを「書く」だけでなく「監視」するフェーズに移行する必要がある。

推奨される防御アーキテクチャ(ガードレイル)

1. SCP (Service Control Policies) による遮断:
組織全体で、特定のアカウント以外への AssumeRole を明示的に拒否するガードレイルを敷く。
2. CloudTrailを用いた異常検知:
AssumeRole イベントの requestParameters を監視し、本来の運用フローから逸脱した principalId や送信元IPアドレスを検知する。

監視用クエリ例(CloudWatch Logs Insights)

# クロスアカウントアクセスを追跡し、異常なアクセス元を特定する
fields @timestamp, @message
| filter eventName = "AssumeRole"
| parse requestParameters.roleArn "arn:aws:iam::*:role/*" as targetAccount, roleName
| filter targetAccount != "自身の信頼するアカウントID"
| display @timestamp, userIdentity.arn, targetAccount, roleName, sourceIpAddress
| sort @timestamp desc

—

4. 未来への備え:耐量子暗号とゼロトラストの融合

今後、耐量子計算機(PQC)の出現により、現在の通信プロトコル(TLS 1.3)や署名アルゴリズムが脅かされる可能性がある。AWSは既にKMSでのハイブリッド鍵交換を導入し始めているが、我々アーキテクトは「IAMの信頼関係」自体を、「物理的なデバイス認証(FIDO2/WebAuthn)とリンクした一時的なセッション」に置き換える設計を検討すべきだ。

「信頼」とは、証明書やトークンが発行された「瞬間」にのみ存在する。その後の継続的なアクセスは、継続的なリスクスコアリング(コンテキストベースの評価)によってのみ許可されるべきだ。

結論:プロフェッショナルとしての心得

攻撃者は、あなたが「設定したつもり」になっている場所を正確に突き刺す。信頼関係を定義する際は、単に動く設定を作るのではなく、「もしこのアカウントが完全に陥落したら、被害はどこまで波及するか?」という最悪のケースを常にシミュレーションしてほしい。

セキュリティは静的な壁ではない。動的な脅威に対する、絶え間ないアーキテクチャの最適化そのものである。

コメント

タイトルとURLをコピーしました