【问题标题】:AWS ELB keeps showing private IP in Location header on redirectAWS ELB 在重定向时不断在 Location 标头中显示私有 IP
【发布时间】:2015-03-13 03:39:05
【问题描述】:

我们正在运行一个简单的 Rails 4.0 应用程序(在 Ubuntu 14.04 上),config.force_ssl = true。 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=...

【问题讨论】:

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


    【解决方案1】:

    它未能通过 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|连接:保持活动状态

    这是发出请求的方式(在 *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 中。

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

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

    【讨论】:

    • 嗨,丹尼尔。非常感谢您提供 s_client 示例。我能够重现该问题。那你解决了吗?我现在在重定向到位置时遇到了稍微不同的问题:172.31.44.79/users/sign_in。这是 Devise gem 强制用户登录。
    • 很抱歉我之前没有看到这条评论。我希望 SO 在发生这种情况时给我发电子邮件,但显然它没有这样做。我最终不得不在代码中解决这个问题。如果 HOST 标头设置为任何看起来像以 10 开头的 IP 地址,则基本上不返回任何内容,因为我的 ELB 所在的子网位于该范围内。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您对 evanbikes 的建议。您能否澄清“使 ELB 需要 SSL”的意思?有没有办法在 ELB 中将 http 转发到 https?我无法找到解决方案。
    猜你喜欢
    • 2016-03-20
    • 2023-03-31
    • 2013-02-12
    • 2015-04-17
    • 1970-01-01
    • 2011-02-07
    • 2012-04-23
    • 2018-03-07
    • 1970-01-01
    相关资源
    最近更新 更多