AWS ELB 在重定向时不断在位置 header 中显示私有 IP

AWS ELB keeps showing private IP in Location header on redirect

我们是 运行 一个简单的 Rails 4.0 应用程序(在 Ubuntu 14.04 上),config.force_ssl = true。 SSL 被上传到我们的 ELB,ELB 上的 443 和 80 端口都转发到服务器上的 80。

我们的 PCI 扫描一直失败,因为在 HTTP/1.0 中,ELB 的私有 IP 显示在位置 header。关于如何解决这个问题的任何想法?我已经对此进行了广泛的研究好几天了,现在真的卡住了。

$ telnet app.ourwebsite.com 80
GET / HTTP/1.0

HTTP/1.1 301 Moved Permanently
...
*Location: https://172.31.26.236/*
Server: nginx/1.6.2 + Phusion Passenger 4.0.57
Set-Cookie: AWSELB=...

听起来您的 ELB 正在接收 https,然后在 http 上转发。因此,您的 Rails 服务器无需担心 SSL,因为它唯一与之通信的是 ELB。

(我们也是这样设置的。)

因此您可以从 Rails 服务器中删除 config.force_ssl = true 并使您的 ELB 需要 SSL。

它不符合 PCI 的原因是因为正在使用的测试 nessus plugin 10759 使用 HTTP 1.0 并且不发送主机 header,并且 AWS ELB 制作了自己的主机 header 当它连接到您的实例时,无论出于何种原因将其设置为负载均衡器的内部 IP。

下面是使用 Apache mod_forensics 捕获的此类请求。注意主机 header,它设置为负载均衡器的内部 IP:

+11143:551306af:1|GET / HTTP/1.1|host:10.3.2.57|X-Forwarded-For:REDACTED|X-Forwarded-Port:443|X-Forwarded-Proto:https|Connection:keep-alive

这是发出请求的方式(在 *nix 上使用 bash):

(echo -ne "GET / HTTP/1.0\r\n\r\n"; sleep 2) | openssl s_client -connect 1.2.3.4:443

其中1.2.3.4是您ELB的IP地址。您必须像这样制作请求,因为 ELB 不会接受 \n\n 直接输入到 openssl.

请注意,此处发送的唯一 header 是 GET

我的网站未能通过 PCI 扫描,这导致我来到这里,所以我觉得这需要进一步解释。