CloudFront 源站防护实战:为什么 WAF 挡不住绕过攻击 + VPC Origin 方案

前阵子做安全审计,发现一个不少团队忽略的问题:CDN 前面挂了 WAF,但源站 ALB 还是暴露在公网。攻击者只要通过 DNS 历史、证书日志或 Shodan 扫描拿到源站 IP,就能直接绕过 CDN 打源站——你的 WAF 规则再多也没用。

这篇聊两种 AWS 方案来解决这个问题:多 CDN 场景用 mTLS 双向认证,纯 CloudFront 场景用 VPC Origin 做网络隔离。

问题本质:CDN 前面有 WAF 够不够?

正常流量路径:

Client → CloudFront (WAF) → Origin (公网 ALB)

攻击者绕过 CDN:

Attacker → Origin (公网 ALB)  ← 直接打

源站 IP 泄露的常见方式:

  • DNS 历史记录(SecurityTrails 一搜就有)
  • 证书透明度日志(Certificate Transparency Logs)
  • 全网扫描工具(Shodan、Censys)
  • 配置失误(邮件头、API 响应带源站 IP)

你可能想:"那我在源站前面再加一层 WAF 不就行了?" 实际上不太行。

为什么"双 WAF"方案有缺陷

源站同时接两种请求:

  1. 经 CDN 转发的:TCP 源 IP 是 CDN 节点地址,真实 IP 在 X-Forwarded-For 里
  2. 直连的:TCP 源 IP 就是攻击者 IP,X-Forwarded-For 可能被伪造

源站 WAF 没法同时处理这两种情况——基于 TCP IP 判断?CDN 转发的合法流量全来自少数 CDN 节点。基于 XFF?直连攻击者可以伪造这个头。

正确的思路不是"检测谁是坏人",而是从网络层让源站只能被 CDN 访问

方案一:mTLS 双向认证(多 CDN 架构)

如果你用了多个 CDN(比如同时有 CloudFront 和国内 CDN),源站需要验证"这个请求确实是从我的 CDN 来的"。

原理

CloudFront 回源时携带客户端证书,源站 ALB 验证这个证书。没有正确证书的请求直接拒绝。

CloudFront → 携带客户端证书 → ALB (mTLS验证) → 后端
攻击者 → 无证书 → ALB 拒绝 ✗

配置步骤

1. 创建私有 CA 和客户端证书

# 用 ACM Private CA 或者 OpenSSL 自建 CA
# 这里用 OpenSSL 演示(生产环境建议 ACM PCA)

# 生成 CA
openssl req -x509 -newkey rsa:4096 -keyout ca-key.pem \
  -out ca-cert.pem -days 3650 -nodes \
  -subj "/CN=CDN-Origin-CA"

# 生成客户端证书(给 CloudFront 用)
openssl req -newkey rsa:2048 -keyout cf-key.pem \
  -out cf-csr.pem -nodes \
  -subj "/CN=cloudfront-origin-access"

openssl x509 -req -in cf-csr.pem -CA ca-cert.pem \
  -CAkey ca-key.pem -CAcreateserial \
  -out cf-cert.pem -days 365

2. 配置 CloudFront Origin mTLS

在 CloudFront Distribution 的 Origin 设置里:

  • 上传客户端证书(cf-cert.pem + cf-key.pem)到 ACM
  • Origin 配置里启用 "Origin SSL Client Certificate"
  • 选择刚上传的证书

3. 配置 ALB mTLS 验证

# 上传 CA 证书到 ACM 作为信任锚
aws acm import-certificate \
  --certificate fileb://ca-cert.pem \
  --region us-east-1

# ALB Listener 配置 mTLS
# 在 HTTPS Listener 的 "Mutual Authentication" 设置里
# 选择 "Verify with trust store"
# Trust Store 里添加 CA 证书

配好后,只有持有正确客户端证书的请求才能到达后端。

坑:证书轮换。 客户端证书有过期时间,需要提前规划续期流程。建议用 ACM PCA + 自动化脚本处理。

适用场景

  • 多 CDN 架构(CloudFront + 国内 CDN 并行)
  • 源站必须保留公网入口(第三方回调、Webhook 等)
  • 已有 mTLS 基础设施的企业

方案二:VPC Origin — 网络层隔离(推荐)

如果你只用 CloudFront 做 CDN,有个更干净的方案:直接把源站放到 VPC 私有子网,然后用 CloudFront VPC Origin 做内网回源。

原理

源站 ALB 放在 private subnet,没有公网 IP。CloudFront 通过 VPC Origin 走 AWS 内部网络直连。攻击者连源站 IP 都找不到。

CloudFront → VPC Origin (内网) → Private ALB → 后端
攻击者 → ? → 找不到入口 ✗

配置步骤

1. 把 ALB 改成 internal

# 如果现有 ALB 是 internet-facing,需要新建一个 internal 的
aws elbv2 create-load-balancer \
  --name my-internal-alb \
  --scheme internal \
  --subnets subnet-aaaa subnet-bbbb \
  --security-groups sg-xxxx

2. 创建 VPC Origin

# 在 CloudFront 里创建 VPC Origin
aws cloudfront create-vpc-origin \
  --vpc-origin-endpoint-config '{
    "Name": "my-vpc-origin",
    "Arn": "arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/app/my-internal-alb/abc123",
    "HTTPPort": 80,
    "HTTPSPort": 443,
    "OriginProtocolPolicy": "https-only"
  }'

3. 更新 Distribution 的 Origin 指向 VPC Origin

在 CloudFront Distribution 的 Origin 设置里,把 Origin 从原来的公网 ALB 域名改成 VPC Origin。

4. Security Group 收紧

internal ALB 的 SG 只允许 CloudFront VPC Origin 的 ENI 流量:

# CloudFront VPC Origin 会在你的 VPC 里创建 ENI
# SG 只允许这些 ENI 的流量
aws ec2 authorize-security-group-ingress \
  --group-id sg-xxxx \
  --protocol tcp \
  --port 443 \
  --source-group sg-cloudfront-vpc-origin

配完后,源站 ALB 彻底从公网消失。Shodan 扫不到、DNS 查不到、直连不存在。

适用场景

  • 纯 CloudFront 架构
  • 源站不需要接收 CDN 以外的入站流量
  • 追求最简部署(不用管证书轮换)
  • 新项目优先选这个

方案对比

维度 mTLS VPC Origin
源站暴露面 公网可达但需证书验证 完全不可达
配置复杂度 中(证书管理) 低(网络隔离)
多 CDN 支持 支持 不支持(仅 CloudFront)
证书轮换 需要 不需要
DDoS 防护 L7 靠 WAF,L3/L4 源站仍暴露 源站无公网入口,天然免疫
迁移成本 低(加证书配置) 中(ALB 需改 internal)

我的建议: 如果只用 CloudFront,直接上 VPC Origin——配置简单、安全性高、不用操心证书过期。多 CDN 场景才用 mTLS。

迁移注意事项

从公网 ALB 切到 VPC Origin 时注意:

  1. DNS 切换——CloudFront 的 CNAME 不变,只是 Origin 变了。对用户透明。
  2. 健康检查——确认 CloudFront 对 internal ALB 的 health check 正常
  3. 回滚方案——先保留旧的公网 ALB(SG 里加上 deny all),确认新链路正常后再删
  4. Webhook/回调——如果有第三方服务需要直连源站,这些流量要单独走 API Gateway 或者保留一个公网入口

小结

CDN 前面挂 WAF 不等于源站安全。只要源站还有公网入口,就存在被绕过的风险。

两条路线:

  • 多 CDN → mTLS 双向认证,"有证书才放行"
  • 纯 CloudFront → VPC Origin 网络隔离,"公网根本找不到你"

安全这事,能在网络层解决的就别靠应用层。


参考资料:

posted @ 2026-06-03 20:00  亚马逊云开发者  阅读(15)  评论(0)    收藏  举报