作者:刘晓瑞(钰诚)
云原生网关:将安全、流量和微服务三合一
作为面向南北向的公网网关,使用 Waf 防护异常流量是很常规的需求,而且随着互联网环境变得越来越复杂,用户对防护的诉求是持续增强的,常规做法是将流量先接入 Waf 安全网关,过滤后再将流量转发给流量网关,最后到达微服务网关,一个典型的多层网关架构如下图所示:
在这个架构中,用 WAF 网关实现安全能力,Ingress 网关实现集群入口网关能力(非 K8s 场景或会部署一层 Nginx),SCG(Spring Cloud Gateway) 实现微服务网关能力。这样的架构下,需要对每一层网关都进行容量评估,每一层网关都是潜在的瓶颈点,都可能需要进行扩容。这样造成的资源成本和运维人力成本都是巨大的。并且每多一层网关,就多一层可用性风险。一旦出现可用性问题,多层网关会导致问题定位复杂度显著上升,对应的平均故障恢复时间(MTTR)将大幅增加。
云原生网关提出了将安全、流量、微服务网关三合一的概念,架构如下图所示:
采用云原生网关三合一的架构,可以显著降低成本,并提高系统整体可用性。同时这也符合 DevSecOps 的微服务演进趋势,微服务开发者可以更多地从业务接口视角关注安全性,而不是采用所有路由一刀切的 WAF 防护模式。
云原生网关技术架构演进的过程如下图所示:
技术架构演进的背后是组织架构演进,这也是微服务 DevOps 一直在强调的,要围绕开发者为核心,从而提升微服务开发效率。向 DevSecOps 演进并没有捷径,依然需要开发角色和运维角色之间的双向奔赴,打破传统开发与运维之间的壁垒,形成从开发、部署、安全运营这样一个全功能化的敏捷团队。
云原生网关安全防护实践
云原生网关以 WAF 插件形式提供安全能力,实现了基于 ModSecurity 的规则防护引擎,可以根据用户配置的规则屏蔽可疑请求,并支持 OWASP CRS,为站点提供基础的防护功能。
插件配置说明
插件使用简单,并且支持路由级/域名级细粒度防护,配置字段包括:
名称 | 数据类型 | 填写要求 | 默认值 | 描述 |
---|---|---|---|---|
useCRS | bool | 选填 | false | 是否开启 OWASP CRS,详情可参考 coreruleset [ 1] |
secRules | array of string | 选填 | - | 用户自定义的 waf 防护规则,语法规则可参考 ModSecurity 中文手册 [ 2] |
配置示例如下:
- 启用默认配置,进行拦截
useCRS: true
- 启用默认配置,仅观测,不拦截
useCRS: true
secRules:
- "SecRuleEngine DetectionOnly"
- 自定义防护规则
useCRS: true
secRules:
- "SecRule REQUEST_URI "@streq /admin" "id:101,phase:1,t:lowercase,deny""
- "SecRule REQUEST_BODY "@rx maliciouspayload" "id:102,phase:2,t:lowercase,deny""
根据该配置,以下请求将被禁止访问:
curl http://example.com/admin
curl http://example.com -d "maliciouspayload"
- 对特定路由或域名开启
useCRS: true
secRules:
- "SecRule REQUEST_URI "@streq /admin" "id:101,phase:1,t:lowercase,deny""
- "SecRule REQUEST_BODY "@rx maliciouspayload" "id:102,phase:2,t:lowercase,deny""
_rules_:
- _match_route_:
- "route-1"
secRules:
- "SecAction "id:102,phase:1,deny""
- _match_domain_:
- "*.example.com"
- test.com
secRules:
- "SecAction "id:102,phase:1,pass""
此例 match_route 中指定的 route-1 即在创建网关路由时填写的路由名称,当匹配到这两个路由时,将使用此段配置;此例 match_domain 中指定的 *.example.com 和 test.com 用于匹配请求的域名,当发现域名匹配时,将使用此段配置;配置的匹配生效顺序,将按照 rules 下规则的排列顺序,匹配第一个规则后生效对应配置,后续规则将被忽略。
开启插件
选择一个网关实例,点击插件市场,搜索 waf,点击进入插件配置界面:
在控制台填写 WAF 防护规则,启动 WAF 插件:
可以在插件日志一栏查看插件产生的日志(下图为 shell 注入攻击时 WAF 插件产生的日志):
攻防示例
向网关发送简单的 web 攻击请求,示例如下:
- shell 注入攻防示例
- sql 注入攻防示例
- 远程文件包含(RFI)攻防示例
- xss 攻防示例
- php 注入攻防示例
整体防护能力评估
GoTestWAF [ 3] 是一款 API 和 OWASP 攻击模拟工具,支持包括 REST、GraphQL、gRPC、WebSockets、SOAP、XMLRPC 等多种 API 协议,旨在评估 Web 应用安全解决方案,如 API 安全代理、Web 应用防火墙(WAF)、IPS、API 网关等。该工具使用放置在 HTTP 请求不同部分的编码有效负载生成恶意请求:其正文、标头、URL 参数等,涵盖了常见的各种攻击类型,多种攻击测试结果如下图所示,测试结果表明 WAF 插件能够有效检测各种攻击类型的非法请求。
GoTestWAF 提供了基于 ModSecurity 的四个 benchmark,benchmark 中 paranoia 表示防护等级,数值越大,防护等级越高,overall score 得分越高。WAF 插件的 overall score 为 74.1,超过了防护等级最高的 benchmark,表明插件具有较好的防护能力。
阿里云 Web 应用防火墙
云原生网关提供的免费 WAF 插件仅支持基础的防护规则,如您有更高的防护需求,可选购阿里云 Web 应用防火墙 [ 4] ,在拥有更高的防护能力、更高的性能之外,还能为您的应用购买一份保险。
在 WAF 控制台 [ 5] 可以管理防护规则:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NdTLRk4V-1689609069956)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/703b1eb7a3514b76b28212e1654d2b6b~tplv-k3u1fbpfcp-zoom-1.image “image”)]
在接入管理一栏可以配置网关实例的接入:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8IZEL4ef-1689609069956)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/838e0929eca5442ea686241e6dc4d79c~tplv-k3u1fbpfcp-zoom-1.image “image”)]
也可以在网关实例处配置接入 WAF:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m3JWntw6-1689609069956)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/343d4f7d020846e98bb6f011b51da03c~tplv-k3u1fbpfcp-zoom-1.image “image”)]
相关链接:
[1] coreruleset
https://github.com/coreruleset/coreruleset/tree/v3.3.2?spm=5176.mse-ops.0.0.ef3f142fSPw8XV&file=v3.3.2
[2] ModSecurity 中文手册
https://help.aliyun.com/document_detail/121053.html
[3] GoTestWAF
https://github.com/wallarm/gotestwaf
[4] 阿里云 Web 应用防火墙
https://help.aliyun.com/document_detail/446889.html
[5] WAF 控制台
https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fyundun.console.aliyun.com%2F%3Fp%3Dwafnew