通过揭示内部私有IP来阻止Elastic Load Balancer

时间:2015-03-26 18:49:54

标签: security amazon-web-services amazon-elb pci-compliance

我注意到,当发出特定类型的请求时,即使在私有子网中,也会显示ELB背后的ec2实例的内部IP。特别是具有空HOST值的那个。

telnet site_url 80
GET / HTTP/1.0

返回的标题:

HTTP/1.1 301 Moved Permanently
Cache-Control: max-age=1209600
Content-Type: text/html; charset=iso-8859-1
Date: Thu, 26 Mar 2015 18:47:22 GMT
Expires: Thu, 09 Apr 2015 18:47:22 GMT
Location: https://10.0.7.35/
Server: Apache
Content-Length: 226
Connection: Close

当然,这也会在443上打开ssl请求时发生。

是否有人知道此问题的解决方案或锻炼?我知道IIS有相同的症状,但我的问题是AWS ELB特有的。

编辑:

Apache重定向强制HTTPS。

RewriteCond %{HTTPS} off
RewriteCond %{SERVER_ADDR} !^127\.0\.0\.1
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

4 个答案:

答案 0 :(得分:7)

这与ELB无关,与Apache有关,这显然是返回此信息(因此输出中的server: Apache行)。

您显然在Apache配置中定义了某种重定向,以将流量从端口80重定向到端口443.您应该更新您的问题以包含Apache配置文件的相关部分,包括任何重写规则, ServerName,.htaccess设置等

编辑:

您在重写规则中使用HTTP_HOST,这与请求中提供的主机相对应。在您提供的示例中,您未提供主机,因此请尝试执行此操作:

$ telnet www.example.com 80
GET / HTTP/1.0
Host: www.example.com

如果定义了虚拟主机,则必须执行请求的主机部分,以便Apache知道应将请求路由到哪个虚拟主机。

您可能还想在这些行中添加另一个重写条件:

RewriteCond %{HTTP_HOST} !^www.example.com
RewriteRule ^(.*)$ https://www.example.com$1 [R=301,L]

这将确保如果某人试图访问您的网站而未提供包含标头的完整请求,则会将其重定向到正确的域。

答案 1 :(得分:5)

一位朋友今天发布了这个消息,尽管已经有答案,我还以为我会把我发现的细节放进去。

使用原始帖子中描述的机制,我能够重现所描述的场景,其中返回的Location标头确实是https://地址。

但是,经过仔细检查后,提供的地址我的任何实例地址 - 而不是 ELB实例本身中的IP地址。。 p>

我通过检查ELB背后的一个实例进一步证实了这一点,并使用这样的命令序列,我能够确认GET /命令返回的IP地址确实是ELB的。< / p>

# These commands are purely to assist in obscuring my own IPs. :)
$ export LOCALIP=$(ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}')
$ export DISCOVEREDIP=<the IP from the GET test>

# I'm also using `sed` here to replace real IPs with strings to demonstrate which node is which
$ ss -tn | grep $DISCOVEREDIP | sed -e "s/$LOCALIP/localip/" -e "s/$DISCOVEREDIP/discoveredip/" | head -n 3
ESTAB      0      0            localip:80           discoveredip:3950
ESTAB      0      0            localip:80           discoveredip:4157
ESTAB      0      0            localip:80           discoveredip:4148

因此,我可以推断出我的Web服务器的本地IP地址正在侦听ELB指向的端口80,并且ELB的IP正在使用更高的端口连接到我的Web服务器。

没有超出ELB内部IP地址的曝光,无需担心。快乐的云彩!

答案 2 :(得分:3)

我们最近一直在研究这个问题并得出结论:

  1. 当ELB看到没有Host标头的请求时,它必须(善意地)决定代表您添加一个请求并使用自己的私有IP地址作为其值。
  2. 这为Apache提供了(更多)有效请求,因此它生成的任何重定向都使用未修改的HTTP_HOST值。
  3. 我们找到了一个适合我们的解决方案(我们只需要在我们的&#34;默认&#34; VirtualHost中解决这个问题),您可以考虑将其添加到您的VirtualHost:< / p>

    UseCanonicalName On
    

    在我们的评估中,这指示一些Apache行为在ServerName指令的响应中正式替换HTTP_HOST,这解决了我们试图解决的问题。

答案 3 :(得分:-1)

通过将作为公共VPC子网上的IP的主机字段重写为我们的主域名来解决Varnish Cache中的此问题。

    if(req.http.host ~ "10.30.0") {
     set req.http.host = "www.mydomain.com";
    }