开放全球应用程序安全项目是一个在线社区,免费提供物联网、系统软件和 Web 应用程序安全领域的文章、方法、文档、工具和技术。 OWASP 提供免费和开放的资源。它由一个名为 OWASP 基金会的非营利组织领导。 2021 年 OWASP Top 10 是基于 40 多个合作伙伴组织汇总的综合数据的最新研究结果。
OWASP 定期发布十大漏洞报告。该报告针对的是网络应用程序中的漏洞。
在这篇文章中,我想描述如何通过Apache APISIX API Gateway修复其中一些问题。
2021年,报告提到:
欲了解更多详情,请查看完整报告。
修复漏洞取决于其确切性质。例如,修复易受攻击和过时的组件是流程驱动的,需要严格管理版本和淘汰旧版本。然而,有些是技术性的,只需要在反向代理或 API 网关中进行适当的配置,例如服务器端请求伪造。
安全性是一个敏感的话题,因为强化安全性不会给业务带来任何价值。以职业为导向的经理不会关心安全,因为他们无法在下一年的评估中展示他们将公司利润提高了 X%。除非董事会认真考虑安全性,否则很可能没有人会关心。出于这个原因,大多数组织实施基于复选框的安全性,也称为合理的否认性。如果您对正确实施安全性感兴趣,我在之前的博客文章中写了一些想法:将安全性视为风险。
总而言之,保护应用程序不会获得太多预算(如果有的话)。因此,我们必须对此保持聪明并寻找现有的组件。幸运的是,OWASP 提供了一个开箱即用的配置来处理前 10 条规则,这可以通过名为Core Rule Set的配置来修复。不幸的是,它的目标是 ModSecurity:
ModSecurity,有时称为 Modsec,是一种开源 Web 应用程序防火墙 (WAF)。它最初被设计为 Apache HTTP Server 的模块,现已发展为提供一系列超文本传输协议请求和响应过滤功能以及跨多个不同平台(包括 Apache HTTP Server、Microsoft IIS 和 Nginx)的其他安全功能。它是在 Apache 许可证 2.0 下发布的免费软件。
虽然理论上可以通过 Apache APISIX 配置来配置 Nnginx,但还有另一种更直接的方法。
核心规则集的描述与我们的需求非常相关:
OWASP® ModSecurity 核心规则集 (CRS) 是一组与 ModSecurity 或兼容的 Web 应用程序防火墙一起使用的通用攻击检测规则。 CRS 旨在保护 Web 应用程序免受各种攻击(包括 OWASP 十大攻击),并尽量减少误报。 CRS 提供针对许多常见攻击类别的保护,包括:
- SQL注入(SQLi)
- 跨站脚本 (XSS)
- 本地文件包含 (LFI)
- 远程文件包含 (RFI)
- PHP 代码注入
- Java代码注入
- HTTP氧
- 炮弹休克
- Unix/Windows Shell 注入
- 会话固定
- 脚本/扫描仪/机器人检测
- 元数据/错误泄漏
OWASP 还提供Coraza ,这是 ModSecurity 的一个端口,可作为 Go 库使用。 Coraza Proxy Wasm构建于 Coraza 之上,并实现proxy-wasm ABI ,它为代理指定了一组 Wasm 接口。最后,Apache APISIX 提供代理-wasm 集成。
我们总结一下:
我们可以通过这种方式使用合理且安全的默认值配置 Apache APISIX。我们开始做吧。
首先,Coraza 不是 Apache APISIX 发行版的一部分。然而,使用 Docker 将其添加到这里非常简单:
FROM apache/apisix:3.8.0-debian ENV VERSION 0.5.0 #1 ENV CORAZA_FILENAME coraza-proxy-wasm-${VERSION}.zip #1 ADD https://github.com/corazawaf/coraza-proxy-wasm/releases/download/$VERSION/$CORAZA_FILENAME . #2 USER root #3 RUN <<EOF apt-get install zip -y #4 unzip $CORAZA_FILENAME -d /usr/local/apisix/proxywasm rm $CORAZA_FILENAME apt-get remove zip -y chown -R apisix:apisix /usr/local/apisix/proxywasm EOF USER apisix #5
apisix
以强化安全性。由于我们需要安装软件包,因此我们必须切换到root
。unzip
(因为未安装),解压下载的存档,删除存档,卸载unzip
并更改解压文件夹的所有者apisix
下一步是配置 APISIX 本身以使用 Coraza Wasm 插件。
wasm: plugins: - name: coraza-filter #1 priority: 7999 #2 file: /usr/local/apisix/proxywasm/coraza-proxy-wasm.wasm #3
Dockerfile
最后,我们可以将插件分配给路由或将其设置为全局规则以应用于每个路由。我正在使用静态配置:
global_rules: - id: 1 plugins: coraza-filter: #1 conf: directives_map: #2 default: - SecDebugLogLevel 9 #3 - SecRuleEngine On #4 - Include @crs-setup-conf #5 - Include @owasp_crs/*.conf #6 default_directives: default #7
coraza-filter
插件default
,但我们可以定义多个并在不同的路由中使用不同的default
配置
我们继续定义到https://httpbin.org/ 的路由来测试我们的设置。让我们将路由称为/get
:
curl localhost:9080?user=foobar
响应如预期:
{ "args": { "user": "foobar" }, "headers": { "Accept": "*/*", "Host": "localhost", "User-Agent": "curl/8.4.0", "X-Amzn-Trace-Id": "Root=1-65b9fa13-75900dc029e156ec764ae204", "X-Forwarded-Host": "localhost" }, "origin": "192.168.65.1, 176.153.7.175", "url": "http://localhost/get?user=foobar" }
现在,让我们尝试在查询字符串中发送 JavaScript。这个请求不可能是服务器端的,所以我们的基础设施应该保护我们免受它的影响。
curl 'localhost:9080?user=<script>alert(1)</script>'
响应是 403 HTTP 状态代码。如果我们查看日志,我们可以看到以下提示:
Coraza: Warning. XSS Attack Detected via libinjection [file "@owasp_crs/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] Coraza: Warning. NoScript XSS InjectionChecker: HTML Injection Coraza: Warning. Javascript method detected Coraza: Access denied (phase 1). Inbound Anomaly Score Exceeded in phase 1
科拉萨做到了!
大多数组织不会对安全进行激励。因此,我们需要明智地对待它并尽可能地使用现有的组件。
我们可以使用 Coraza 和核心规则集针对 OWASP Top 10 强化 Apache APISIX。
更进一步:
这篇文章的完整源代码可以在GitHub上找到。
最初于 2024 年 2 月 4 日发表于A Java Geek