AWS ELB会在重定向的位置标头中继续显示私有IP

时间:2015-01-14 20:18:17

标签: ruby-on-rails amazon-web-services nginx passenger amazon-elb

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

我们的PCI扫描失败,因为使用HTTP / 1.0,ELB的私有IP显示在Location头中。关于如何解决这个问题的任何想法?我已经研究了好几天,现在真的卡住了。

$ 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=...

2 个答案:

答案 0 :(得分:4)

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

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

  

+11143:551306af:1 | GET / HTTP / 1.1 | host:10.3.2.57 | X-Forwarded-For:删除 | X-Forwarded-Port:443 | X-Forwarded-Proto :HTTPS |连接:保活

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

(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。

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

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

答案 1 :(得分:2)

听起来你的ELB正在接收https然后转发http。所以你的Rails服务器不需要担心SSL,因为它唯一与之通信的是ELB。

(这也是我们设置它的方式。)

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