HTTP响应中出现非标准HTTP标头“X-Forwarded-Host”等

时间:2016-02-22 02:32:27

标签: amazon-web-services haproxy x-forwarded-for

我们在AWS上部署了一个应用程序。在前面,AWS负载均衡器接受所有传入的HTTP请求; EC2实例直接位于此平衡器后面。在单个实例上,HAproxy接收所有请求和委托,然后基于Java接收真实的应用程序服务器(在我们的特殊情况下,haproxy和业务应用程序服务器在同一个EC2实例上,haproxy不播放负载平衡角色仅用于中继http请求,换句话说,haproxy和应用服务器是一对一的映射。)

当我们尝试启动对此系统的http调用时:

请求

GET /token HTTP/1.1
Host: xxx.xxx.xxx.xxx

响应

HTTP/1.1 403 Forbidden 
X-Forwarded-Proto: https 
X-Forwarded-For: xxx.xxx.xxx.xxx 
X-Forwarded-Port: 443 
X-Forwarded-Host: xx.xx.xx.xxx 
Date: Wed, 09 Dec 2015 22:04:06 GMT 
Server: WSO2-PassThrough-HTTP 

根据我的理解, X-Forwarded - * 应该只出现在服务器端,以便服务器在中间存在代理时识别传入请求的来源。我不知道为什么这些标题也出现在响应中。这使我担心将内部IP泄露给潜在的恶意客户。

以下是haproxy设置的代码段:

frontend worker
bind :443 ssl crt xxx crt xxx crt xx accept-proxy no-sslv3 no-tls-tickets
mode http
acl forwarded hdr_cnt(X-Forwarded-Host) gt 0
acl trusted src 127.0.0.0/24
capture request header X-Forwarded-For len 64
default_backend worker
http-request deny if METH_TRACE
http-request set-header X-Forwarded-Host %[dst] unless forwarded trusted
http-request set-header X-Forwarded-Port %[dst_port]
http-request set-header X-Forwarded-Proto https if { ssl_fc }
option forwardfor if-none
reqidel ^X-Forwarded-For:.* unless trusted
rspadd Strict-Transport-Security:\ max-age=63072000;\ includeSubdomains;\ preload
use_backend xxx.xxx.xxx if { ssl_fc_sni -i xxx.xxx.xxx }
use_backend xxx.xxx.xxx if { ssl_fc_sni -i xxx.xxx.xxx }

请告知为什么这些非标准标题出现在http响应中,如果这对安全性有风险。

1 个答案:

答案 0 :(得分:3)

AWS ELB会根据AWS ELB docs自动添加X-Forwarded-ForX-Forwarded-PortX-Forwarded-Proto个请求标头。他们使用X-Forwarded-Host标头。因此,haproxy配置中的此规则有点可疑:

acl forwarded hdr_cnt(X-Forwarded-Host) gt 0

相反,您可以尝试:

acl forwarded hdr_cnt(X-Forwarded-For) gt 0

X-Forwarded-Host请求标头更不寻常;除非您的后端服务器(WS02,从它的外观)需要该标头,您可以从X-Forwarded-*配置中完全删除该规则和其他haproxy规则,因为这些值应该来自AWS ELB。也就是说,你可以完全删除它们:

http-request set-header X-Forwarded-Host %[dst] unless forwarded trusted
http-request set-header X-Forwarded-Port %[dst_port]
http-request set-header X-Forwarded-Proto https if { ssl_fc }

至于它是否属于安全问题 - 仅针对HTTP请求, HTTPS请求。而这只是因为,如果没有SSL,某人可能会拦截和窃听这些响应标头。这样的攻击者已经知道客户端的IP地址(因此X-Forwarded-For的值)会知道TCP目标端口(以及X-Forwarded-Port的值),并且知道它的不是 SSL(因此会知道X-Forwarded-Proto: http)。但是,理想情况下,正如您所指出的那样,这些标题根本不会出现在响应中。 (HTTP服务器在响应中 echo X-Forwarded-*这些请求标头是不寻常的;因此我试图阅读WS02文档以查看它是否可以配置为执行类似的东西。)

因此,当您研究此问题时,您可以使用以下内容haproxy删除这些响应标头:

rspdel ^X-Forwarded-.*:.*

希望这有帮助!