在应用程序中添加HTTP响应头可以提高Web应用程序的安全性。本文介绍如何通过定义EnvoyFilter添加HTTP响应头。
前提条件
已创建一个ASM实例,并已将ACK集群添加到ASM实例中。具体操作,请参见创建ASM实例和添加集群到ASM实例。
背景信息
OWASP提供了最佳实践指南和编程框架,描述了如何使用安全响应头保护应用程序的安全。HTTP响应头的基准配置如下:
HTTP响应头 | 默认值 | 描述 |
Content-Security-Policy | frame-ancestors none; | 防止其他网站进行Clickjacking攻击。 |
X-XSS-Protection | 1;mode=block | 激活浏览器的XSS过滤器(如果可用),检测到XSS时阻止渲染。 |
X-Content-Type-Options | Nosniff | 禁用浏览器的内容嗅探。 |
Referrer-Policy | no-referrer | 禁用自动发送引荐来源。 |
X-Download-Options | noopen | 禁用旧版本IE中的自动打开下载功能。 |
X-DNS-Prefetch-Control | off | 禁用对页面上的外部链接的推测性DNS解析。 |
Server | envoy | 由Istio的入口网关自动设置。 |
X-Powered-by | 无默认值 | 去掉该值来隐藏潜在易受攻击的应用程序服务器的名称和版本。 |
Feature-Policy | camera ‘none’; microphone ‘none’; geolocation ‘none’; encrypted-media ‘none’; payment ‘none’; speaker ‘none’; usb ‘none’; | 控制可以在浏览器中使用的功能和API。 |
以Bookinfo应用程序为例(详情请参见在ASM实例关联的集群中部署应用),通过Curl命令可以看到应用程序的HTTP响应头信息如下。
curl -I http://{入口网关服务的IP地址}/productpage
# 输出示例
HTTP/1.1 200 OK
content-type: text/html; charset=utf-8
content-length: 5183
server: istio-envoy
date: Tue, 28 Jan 2020 08:15:21 GMT
x-envoy-upstream-service-time: 28
可以看到,在默认情况下,示例应用程序的入口首页响应并没有包含上述表格中安全相关的HTTP响应头。通过Istio EnvoyFilter可以快速添加安全相关的HTTP响应头。
操作步骤
按照ASM实例版本部署EnvoyFilter。
ASM实例版本为1.12.4.0及以上
您可以通过插件市场直接部署EnvoyFilter。
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在插件市场页面,单击添加HTTP响应头,然后在插件详情页面,单击新建插件实例。
在插件生效范围区域,选中网关生效,然后单击添加网关生效范围。
在添加网关生效范围对话框中,在选择网关区域选中ingressgateway,单击图标,将ingressgateway添加到已选择区域中,然后单击确定。
说明ingressgateway为ASM默认部署的网关名称,您也可以选择希望生效添加HTTP响应头能力的其它ASM网关。
在插件配置区域,删除YAML框中的所有内容,然后打开生效开关,等待插件启用。
在插件启用后,ASM会自动创建EnvoyFilter。
ASM实例版本为1.12.4.0以下
您可以执行以下命令,直接部署EnvoyFilter。
proxyVersion
:配置为您当前的Istio版本。EnvoyFilter创建时需要设置proxyVersion来指定期望作用的Istio版本范围,EnvoyFilter配置中的一些字段存在Istio版本不兼容的可能性。不同Istio版本的EnvoyFilter内容不同:如果您使用的Istio1.8及以下版本,请根据版本替换
proxyVersion
字段,并且替换上述EnvoyFilter中的envoy.filters.network.http_connection_manager
为envoy.http_connection_manager
、envoy.filters.http.router
为envoy.router
、type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
为type.googleapis.com/envoy.config.filter.http.lua.v2.Lua
。如果您使用的Istio1.9及以上版本,请根据版本替换
proxyVersion
字段。
执行以下命令,验证安全HTTP响应头是否添加成功。
请将
{入口网关的IP地址}
替换为实际的网关地址。关于如何获取入口网关地址,请参见获取入口网关地址。curl -I http://{入口网关的IP地址}/productpage
预期输出:
HTTP/1.1 200 OK content-type: text/html; charset=utf-8 content-length: 4183 server: istio-envoy date: Tue, 28 Jan 2020 09:07:01 GMT x-envoy-upstream-service-time: 17 content-security-policy: frame-ancestors none; x-frame-options: deny x-xss-protection: 1; mode=block x-content-type-options: nosniff referrer-policy: no-referrer x-download-options: noopen x-dns-prefetch-control: off feature-policy: camera 'none';microphone 'none';geolocation 'none';encrypted-media 'none';payment 'none';speaker 'none';usb 'none';
由预期输出得到,示例应用程序的入口首页响应已经包含了HTTP响应头的基准配置中所描述的安全相关的HTTP响应头。
FAQ
为什么无法访问带有特殊字符的URL?
以特殊字符Á为例,特殊字符Á的编码格式采用Unicode,而不是ASCII。因此请求的URL中带有特殊字符,不符合URL规范。更多信息,请参见Envoy cannot parse non-alphanumeric characters if not urlencoded。