SCPによるEC2認証情報の保護

EC2インスタンスに付与されたIAMロールの認証情報が漏洩した場合に備え、SCPで認証情報の利用をそのEC2インスタンス自身に限定できる

出典: Policies to restrict credentials usage

“You can use the aws:ec2InstanceSourceVpc and aws:ec2InstanceSourcePrivateIPv4 condition keys in your policies to restrict credentials usage.”

使用する条件キー

条件キー説明
aws:ec2InstanceSourceVpc認証情報が発行されたEC2インスタンスのVPC ID
aws:ec2InstanceSourcePrivateIPv4認証情報が発行されたEC2インスタンスのプライベートIP
aws:SourceVpcAPIリクエストを送信した時点のVPC

出典: Condition keys for Amazon EC2

“aws:ec2InstanceSourceVpc – The VPC to which the EC2 instance credentials were delivered”

SCPの例

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:ec2InstanceSourceVpc": "${aws:SourceVpc}"
        },
        "Null": {
          "aws:ec2InstanceSourceVpc": "false"
        }
      }
    }
  ]
}

このSCPの動作:

  • aws:ec2InstanceSourceVpc が存在する場合(= EC2インスタンスからの認証情報)
  • かつ、そのVPCがリクエスト元のVPCと異なる場合に Deny

保護の仕組み

【通常の状態(保護なし)】

┌─────────────────────────────────────────────────────────────────┐
│  VPC                                                            │
│  ┌──────────────┐                                               │
│  │  EC2         │                                               │
│  │  (IAMロール) │──────┐                                        │
│  └──────────────┘      │                                        │
└────────────────────────│────────────────────────────────────────┘
                         │
                         ▼  認証情報が漏洩
                    ┌─────────┐
                    │ 攻撃者  │
                    │ (外部)  │
                    └────┬────┘
                         │ 盗んだ認証情報でAPIコール
                         ▼
                   ┌───────────┐
                   │  AWS API  │  ← 実行されてしまう
                   └───────────┘


【SCP適用後(保護あり)】

┌─────────────────────────────────────────────────────────────────┐
│  VPC (vpc-abc123)                                               │
│  ┌──────────────┐                                               │
│  │  EC2         │                                               │
│  │  (IAMロール) │───────────────────────┐                       │
│  └──────────────┘                       │                       │
└─────────────────────────────────────────│───────────────────────┘
                                          │ aws:ec2InstanceSourceVpc
                                          │ = vpc-abc123
                                          ▼
                                    ┌───────────┐
                                    │  AWS API  │  ← 実行できる
                                    └───────────┘

                    ┌─────────┐
                    │ 攻撃者  │
                    │ (外部)  │
                    └────┬────┘
                         │ 盗んだ認証情報でAPIコール
                         │ aws:ec2InstanceSourceVpc = vpc-abc123
                         │ aws:SourceVpc = (なし or 別のVPC)
                         ▼
                   ┌───────────┐
                   │  AWS API  │  ← 実行できない
                   └───────────┘

ポリシー評価の具体例

ケース1: EC2から正規のAPIコール → 許可

EC2インスタンス内で実行:
$ aws s3 ls

リクエストに含まれる情報:
  aws:ec2InstanceSourceVpc    = "vpc-abc123"  ← 認証情報の発行元VPC
  aws:SourceVpc               = "vpc-abc123"  ← リクエスト元VPC

SCP評価:
  "vpc-abc123" == "vpc-abc123" → 一致 → Denyに該当しない → 許可

ケース2: 攻撃者が外部から盗んだ認証情報を使用 → Deny

攻撃者のPC(自宅など)で実行:
$ aws s3 ls

リクエストに含まれる情報:
  aws:ec2InstanceSourceVpc    = "vpc-abc123"  ← 認証情報に埋め込み済み
  aws:SourceVpc               = (なし)        ← VPC外からのアクセス

SCP評価:
  "vpc-abc123" != (なし) → 不一致 → Deny

ケース3: 攻撃者が別のVPCから使用 → Deny

攻撃者のEC2(別VPC: vpc-xyz789)で実行:
$ aws s3 ls

リクエストに含まれる情報:
  aws:ec2InstanceSourceVpc    = "vpc-abc123"  ← 元の認証情報の発行元
  aws:SourceVpc               = "vpc-xyz789"  ← 攻撃者のVPC

SCP評価:
  "vpc-abc123" != "vpc-xyz789" → 不一致 → Deny

注意点

これらの条件キーはIMDSv2から取得した認証情報にのみ適用される

IMDSv1を使っている場合は機能しないため、IMDSv2を強制する設定も併せて行うべき

出典: Policies to restrict credentials usage

“These condition keys are only present when a request is made by a principal that has credentials delivered through the instance metadata service (IMDS).”

関連用語

IMDSv2(Instance Metadata Service Version 2)

EC2インスタンスがメタデータや認証情報を取得するためのサービス。v2はセッショントークンを必要とするセキュアな方式

出典: Use IMDSv2

“IMDSv2 uses session-oriented requests. With session-oriented requests, you create a session token that defines the session duration”