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:SourceVpc | APIリクエストを送信した時点の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”