Amazon web services 非标准HTTP头文件';X-Forwarded-Host';etc出现在HTTP响应中

Amazon web services 非标准HTTP头文件';X-Forwarded-Host';etc出现在HTTP响应中,amazon-web-services,haproxy,x-forwarded-for,Amazon Web Services,Haproxy,X Forwarded For,我们在AWS上部署了一个应用程序。在前面,AWS负载平衡器接受所有传入的HTTP请求;EC2实例直接位于该平衡器的后面。在单个实例上,HAproxy接收所有请求,然后委托给基于Java的实际应用程序服务器(在我们的特例中,haproxy和business application server位于同一个EC2实例上,haproxy不只是为了中继http请求而扮演负载平衡角色,换句话说,haproxy和application server是一对一的映射) 当我们尝试对此系统启动http调用时: 请求

我们在AWS上部署了一个应用程序。在前面,AWS负载平衡器接受所有传入的HTTP请求;EC2实例直接位于该平衡器的后面。在单个实例上,HAproxy接收所有请求,然后委托给基于Java的实际应用程序服务器(在我们的特例中,haproxy和business application server位于同一个EC2实例上,haproxy不只是为了中继http请求而扮演负载平衡角色,换句话说,haproxy和application server是一对一的映射)

当我们尝试对此系统启动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响应中,以及这是否对安全有风险。

AWS ELBs会根据自动添加
X-Forwarded-for
X-Forwarded-Port
、和
X-Forwarded-Proto
请求头;它们不使用
X-Forwarded-Host
头r、 因此,
haproxy
config中的这条规则有点可疑:

acl forwarded hdr_cnt(X-Forwarded-Host) gt 0
相反,您可以尝试:

acl forwarded hdr_cnt(X-Forwarded-For) gt 0
X-Forwarded-Host
请求头更不寻常;除非您的后端服务器(从外观上看是WS02)需要该标题,您可以从您的
haproxy
配置中删除该标题和其他
X-Forwarded-*
规则,因为这些值应该来自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服务器在响应中回显
X-Forwarded-*
这样的请求头是不常见的;因此,我试图阅读WS02文档,看看是否可以将其配置为这样做。)

因此,当您研究这个问题时,您可以使用如下方法让haproxy删除这些响应头:

rspdel ^X-Forwarded-.*:.*

希望这有帮助!

AWS ELBs会根据自动添加
X-Forwarded-For
X-Forwarded-Port
、和
X-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)需要该标题,您可以从您的
haproxy
配置中删除该标题和其他
X-Forwarded-*
规则,因为这些值应该来自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服务器在响应中回显
X-Forwarded-*
这样的请求头是不常见的;因此,我试图阅读WS02文档,看看是否可以将其配置为这样做。)

因此,当您研究这个问题时,您可以使用如下方法让haproxy删除这些响应头:

rspdel ^X-Forwarded-.*:.*

希望这有帮助!

您是否仅在通过
haproxy
服务器或AWS ELB或两者同时发送请求时才看到这些
X转发-*
响应头?您是否仅在通过
haproxy
服务器或AWS ELB或两者发送请求时才看到这些
X转发-*
响应头?因此unds非常有用!我需要试一试,稍后再讨论。非常感谢。至于WS02为什么会将请求头视为响应头,如果我假设ESB如何处理“消息”,那么设置可能会产生这种效果是正确的。如果有的话,你有什么配置值?我们使用wso2的默认属性;因为我需要X-Forwarded-Host来记录日志,删除此配置听起来不切实际,我们将首先尝试更改wso2中的配置。听起来非常有帮助!我需要尝试一下,稍后再讨论。非常感谢。至于WS02可能会出现的原因如果我假设ESB如何处理“消息”,那么将请求头视为响应头,该设置可能会产生这种效果是正确的。您有什么配置值(如果有的话)?我们使用wso2的默认属性;因为我需要X-Forwarded-Host进行一些日志记录,删除此配置听起来不切实际,我们将尝试