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

Mat*_*yan 3 security amazon-web-services pci-compliance amazon-elb

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

telnet site_url 80
GET / HTTP/1.0
Run Code Online (Sandbox Code Playgroud)

并返回标题:

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
Run Code Online (Sandbox Code Playgroud)

当然,这也发生在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]
Run Code Online (Sandbox Code Playgroud)

Bru*_*e P 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
Run Code Online (Sandbox Code Playgroud)

如果定义了虚拟主机,那么请求的主机部分是必需的,以便Apache知道请求应该路由到哪个虚拟主机.

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

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

这将确保如果有人试图访问您的网站而不提供包含标题的完整请求,它将重定向到正确的域.


Mik*_*ler 5

一位朋友今天发布了这个消息,尽管已经有了答案,我还以为我会详细介绍我发现的细节.

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

但是,经过仔细检查,提供的地址不是我的任何实例地址 - 而是它似乎是ELB实例本身的IP地址.

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

# 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
Run Code Online (Sandbox Code Playgroud)

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

没有超出ELB内部IP地址的曝光,无需担心.快乐的乌云密布!

  • 感谢复兴.这对我来说是有问题的,以实现PCI合规性.在我的经验中,它始终是一个内部地址,但这仍然太过暴露,不符合要求. (3认同)