在 CloudFront 和 EC2 之间为 HTTPS 站点使用 HTTP

Using HTTP between CloudFront and EC2 for HTTPS site

我们的应用程序目前在 EC2 实例上 运行,需要 HTTPS(并将 HTTP 重定向到 HTTPS)。我们现在正在考虑通过 CloudFront 处理所有请求并通过 CloudFront 强制执行 HTTPS。我们的想法是,一旦我们这样做,我们就会阻止 HTTP/HTTPS 不是来自 CloudFront 的请求并放宽 HTTPS 要求。这样,对 CloudFront 的所有请求都将通过 HTTPS,但 CloudFront 将通过 HTTP 从 EC2 源检索数据。这样我们将 a) 减少一些服务器开销,因为服务器不必进行 TLS 加密,并且 b) 无需管理 EC2 实例的证书。

出于这个原因或其他不这样做的原因,是否存在任何安全问题?

其实在我工作的公司,有这样的场景。

  • EC2 -> ELB -> CF(+ AWS 证书)= HTTP 和 HTTPS

    • EC2 始终使用 80
    • CF 适用于 443 和 80。

它很容易配置,到目前为止我们没有遇到任何问题。

要增加额外的安全性,您可以执行以下操作。

  • 有一个从 CloudFront 发送的秘密令牌 header,该令牌在 EC2 实例上经过验证以服务于请求。
  • 只允许 IP address ranges 的 CloudFront,在 EC2 或 ELB 的安全组中用于入站请求。

这是我们最后做的事情:

  1. 源 EC2 仅允许 HTTP(端口 80)
  2. ELB 仅允许 HTTPS(端口 443)并通过 HTTP(端口 80)定位 EC2
  3. EC2 安全组限制对 ELB 安全组的 HTTP 访问
  4. 为 origin-blabla.example.com 创建了 Route53 DNS 条目作为 ELB
  5. 的别名
  6. CloudFront 分发重定向 HTTP -> HTTPS
  7. CloudFront 的来源是 origin-blabla.example.com
  8. CloudFront 源具有自定义 HTTP header
  9. CloudFront 和 ELB 都有 *.example.com TLS 证书(我也可以为特定域名使用单独的证书)
  10. URL 重写 blocks/redirects 所有不包含以下内容之一的请求:a) above-mentioned 自定义 HTTP header 或 b) 匹配 ^ 的 UserAgent ELB-HealthChecker$

所以现在所有请求都通过 HTTPS 到达 CloudFront(如果它们以 HTTP 形式到达,它们将被重定向到 HTTPS),它通过 HTTPS 连接到 ELB,后者又通过 HTTP 从 EC2 获取数据。这是无法规避的(除非有人不顾一切地猜测原始 DNS 并暴力破解自定义 HTTP header 并将其添加到他们的浏览器请求中——我不确定他们真正从中获得了什么)所以我们可以放心 a) 所有请求都是安全的,b) 只有一个域名可以用来访问我们的系统,c) 我们不必担心服务器上的证书。