本系列文章讲讲述阿里云服务网格ASM的一些扩展能力:
- 阿里云服务网格ASM之扩展能力(1):在ASM中通过EnvoyFilter添加HTTP请求头
- 阿里云服务网格ASM之扩展能力(2):在ASM中支持自定义外部授权
- 阿里云服务网格ASM之扩展能力(3):在ASM中使用开放策略代理OPA
- 阿里云服务网格ASM之扩展能力(4):在ASM中实现分布式跟踪
欢迎扫码入群进一步交流:
背景信息
安全的HTTP请求头可以支持以非常简单的方式提高Web应用程序的安全性。OWASP提供了最佳实践指南和编程框架,描述了如何使用安全请求头保护应用程序的安全,包括了如下的基准设置:
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 |
通过curl命令可以看到Bookinfo示例应用程序的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请求头。
接下来,将会介绍如何在ASM中通过Istio EnvoyFilter添加安全的HTTP请求头。
定义EnvoyFilter
- 如果还没有建立 kubectl 命令行客户端与 ASM 实例的连接,请参见通过 kubectl 连接 ASM 实例进行配置。
部署Istio EnvoyFilter,执行如下命令:
-
apply -f - <apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: security-by-default-header-filter
spec:
filters:-
listenerMatch:
listenerType: GATEWAY
filterType: HTTP
filterName: envoy.lua
filterConfig:inlineCode: | function envoy_on_response(response_handle) function hasFrameAncestors(rh) s = rh:headers():get("Content-Security-Policy"); delimiter = ";"; defined = false; for match in (s..delimiter):gmatch("(.-)"..delimiter) do match = match:gsub("%s+", ""); if match:sub(1, 15)=="frame-ancestors" then return true; end end return false; end if not response_handle:headers():get("Content-Security-Policy") then csp = "frame-ancestors none;"; response_handle:headers():add("Content-Security-Policy", csp); elseif response_handle:headers():get("Content-Security-Policy") then if not hasFrameAncestors(response_handle) then csp = response_handle:headers():get("Content-Security-Policy"); csp = csp .. ";frame-ancestors none;"; response_handle:headers():replace("Content-Security-Policy", csp); end end if not response_handle:headers():get("X-Frame-Options") then response_handle:headers():add("X-Frame-Options", "deny"); end if not response_handle:headers():get("X-XSS-Protection") then response_handle:headers():add("X-XSS-Protection", "1; mode=block"); end if not response_handle:headers():get("X-Content-Type-Options") then response_handle:headers():add("X-Content-Type-Options", "nosniff"); end if not response_handle:headers():get("Referrer-Policy") then response_handle:headers():add("Referrer-Policy", "no-referrer"); end if not response_handle:headers():get("X-Download-Options") then response_handle:headers():add("X-Download-Options", "noopen"); end if not response_handle:headers():get("X-DNS-Prefetch-Control") then response_handle:headers():add("X-DNS-Prefetch-Control", "off"); end if not response_handle:headers():get("Feature-Policy") then response_handle:headers():add("Feature-Policy", "camera 'none';".. "microphone 'none';".. "geolocation 'none';".. "encrypted-media 'none';".. "payment 'none';".. "speaker 'none';".. "usb 'none';"); end if response_handle:headers():get("X-Powered-By") then response_handle:headers():remove("X-Powered-By"); end end
EOF
-
- 将看到以下输出显示过滤器已成功部署:
envoyfilter.networking.istio.io/security-by-default-header-filter created
验证HTTP请求头
- 通过curl命令确认添加了安全HTTP请求头,执行如下:
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请求头。
由此可见,在ASM中可以使用EnvoyFilter以非常简单的方式添加HTTP请求头。