在 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 的安全组中用于入站请求。
这是我们最后做的事情:
- 源 EC2 仅允许 HTTP(端口 80)
- ELB 仅允许 HTTPS(端口 443)并通过 HTTP(端口 80)定位 EC2
- EC2 安全组限制对 ELB 安全组的 HTTP 访问
- 为 origin-blabla.example.com 创建了 Route53 DNS 条目作为 ELB
的别名
- CloudFront 分发重定向 HTTP -> HTTPS
- CloudFront 的来源是 origin-blabla.example.com
- CloudFront 源具有自定义 HTTP header
- CloudFront 和 ELB 都有 *.example.com TLS 证书(我也可以为特定域名使用单独的证书)
- 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) 我们不必担心服务器上的证书。
我们的应用程序目前在 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 的安全组中用于入站请求。
这是我们最后做的事情:
- 源 EC2 仅允许 HTTP(端口 80)
- ELB 仅允许 HTTPS(端口 443)并通过 HTTP(端口 80)定位 EC2
- EC2 安全组限制对 ELB 安全组的 HTTP 访问
- 为 origin-blabla.example.com 创建了 Route53 DNS 条目作为 ELB 的别名
- CloudFront 分发重定向 HTTP -> HTTPS
- CloudFront 的来源是 origin-blabla.example.com
- CloudFront 源具有自定义 HTTP header
- CloudFront 和 ELB 都有 *.example.com TLS 证书(我也可以为特定域名使用单独的证书)
- 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) 我们不必担心服务器上的证书。