本节将介绍如何在 Envoy 中使用 WAF 来增强应用安全性,并以 Coraza 为例进行详细讲解。
什么是 WAF?
WAF 是一种安全技术,用于监控、过滤或阻止向 Web 应用发送的恶意流量。WAF 主要保护应用免受 SQL 注入、跨站脚本(XSS)、文件包含等攻击,是现代 Web 应用安全不可或缺的一部分。
WAF 的基本概念
了解下面的概念及组件将有助于你理解 WAF 是如何运行的。
- Envoy 使用 Coraza 作为其 WAF 的实现。
- Coraza 作为 WAF,保护 Web 应用,并支持 SecLang 语言。
- SecLang 是 ModSecurity 的规则语言。
- ModSecurity 定义了 OWASP CRS (OWASP Core Rule Set)。
- OWASP CRS 的具体项目名为
coreruleset
。
下图展示了它们之间的关系。
接下来我们将详细介绍这些概念,并将其与机场安检系统类比,加深你对 WAF 的理解。
OWASP CRS (OWASP Core Rule Set)
OWASP CRS 是一套为 WAF 设计的开源规则集,旨在防护 Web 应用免受广泛的攻击。
示例(配置示例):
# 在Apache服务器上启用OWASP CRS
SecRuleEngine On
Include owasp-modsecurity-crs/crs-setup.conf
Include owasp-modsecurity-crs/rules/*.conf
ModSecurity
ModSecurity 是一个跨平台的开源 WAF 引擎,最初为 Apache HTTP 服务器设计,现已扩展到多个平台,用于实时监控、记录和阻止 HTTP 流量中的恶意请求。
示例(使用方式):
# 在Apache中启用ModSecurity
LoadModule security2_module modules/mod_security2.so
<IfModule mod_security2.c>
Include modsecurity.d/*.conf
Include modsecurity.d/activated_rules/*.conf
</IfModule>
SecLang
SecLang 是 ModSecurity 使用的规则语言,允许用户定义复杂的安全策略来监控和控制进入 Web 应用的 HTTP 流量。
示例(配置示例):
# SecLang规则示例,防止SQL注入
SecRule ARGS "select|insert|update|delete|union|select|drop" "id:'100001',phase:2,deny,status:403,msg:'SQL injection attempt'"
WAF (Web Application Firewall)
WAF 是一种专门设计来监视、过滤和阻止到 Web 应用的恶意流量的安全技术。
示例(使用方式):
# 在Nginx中配置基本的WAF设置
server {
location / {
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
}
}
Coraza
Coraza 是一个开源、高性能的 WAF 库,兼容 ModSecurity 的 SecLang 规则,可作为 Go 应用的库或集成到其他平台。
示例(配置示例):
// 使用 Coraza 在 Go 程序中创建 WAF 实例
import "github.com/corazawaf/coraza/v2"
waf := coraza.NewWaf()
rules, _ := waf.Rules.CompileFile("/path/to/modsec_rules.conf")
这些简要说明和示例展示了每种技术的核心用途和配置方式,有助于理解其在实际应用中的实施和运用。
如果以上解释还不够直观的理解 WAF 是如何运行的,那么将 WAF 比作机场的安检系统,将有助你理解。
类比:机场安全检查系统
-
OWASP CRS:想象 OWASP CRS 是安全检查中使用的检查标准和规程手册。这本手册详细列出了哪些物品是禁止携带的,以及如何检测这些违禁品。
-
ModSecurity:ModSecurity 像是执行这些规程的安检员,他使用手册中的规则来检查旅客和他们的行李是否符合安全标准。
-
SecLang:SecLang 是安检员使用的具体操作语言或指导,确保他们可以准确无误地理解和执行手册中的规则。
-
WAF(Web Application Firewall):整个安检区域,装备了必要的设施和技术(如 X 光机和金属探测器,对应 ModSecurity 和 Coraza)来检查和过滤所有进出的旅客和行李。
-
Coraza:另一位安检员,在同一个安检区域内工作,使用与 ModSecurity 相同的手册,但可能有不同的检查技术或工具。
-
Envoy:Envoy 是整个机场的交通调度系统,负责协调旅客的流动,确保所有人都通过安检区。Envoy 确保信息和数据流在安全的环境下高效流通,优化整个机场的运作。
通过这个类比,我们可以看到 Envoy 如何协调和管理网络流量,而 WAF(如 ModSecurity 和 Coraza)则是进行安全检查的关键组件。OWASP CRS 提供了检查的规则和标准,SecLang 是执行这些规则的具体指南。这种设置保证了网络环境的安全,防止不安全或不合规的数据进入或离开网络系统。
WAF 的使用案例
使用 WAF 的两个常见的例子是防止 SQL 注入和 XSS 攻击。
SQL 注入
SQL 注入是攻击者试图通过 Web 应用执行恶意 SQL 代码的行为。例如,未经过滤的用户输入可能被直接用在 SQL 命令中,从而允许攻击者访问或修改数据库内容。WAF 可以识别并阻止这类恶意输入。
示例场景:假设一个登录页面通过拼接字符串的方式构造 SQL 查询来验证用户名和密码。
SELECT * FROM users WHERE username='$username' AND password='$password';
如果攻击者在用户名字段输入 ' OR '1'='1
,则查询变为:
SELECT * FROM users WHERE username='' OR '1'='1' AND password='';
由于 '1'='1'
总是为真,攻击者可以绕过身份验证,访问系统。
XSS 攻击
跨站脚本攻击(XSS)允许攻击者将恶意脚本注入其他用户会看到的页面中。这可能用于窃取信息或欺骗用户。WAF 通过检测和阻断可疑的脚本执行,帮助防止 XSS 攻击。
示例场景:一个评论功能允许用户提交评论并在页面上显示,而没有对输入进行适当的过滤。
<input type="text" name="comment" />
如果攻击者输入 <script>alert('XSS');</script>
,则当其他用户访问该页面时,会弹出一个警告框,显示“XSS”。这种攻击可以用于窃取用户会话信息、重定向到恶意网站等。
WAF 的工作原理
WAF 通过分析和过滤所有进入 Web 应用的 HTTP 请求来阻止恶意访问。WAF 的核心组件包括:
- 请求和响应监控:WAF 监控所有进入和离开 Web 应用的 HTTP 请求和响应。
- 规则引擎:WAF 使用一系列预定义的或自定义的规则,这些规则基于已知的攻击模式和行为。这些规则用于评估 HTTP 请求中的各种元素,如 URLs、查询字符串、POST 数据、HTTP 头部等。
- 攻击检测逻辑:当 HTTP 请求到达时,WAF 根据其规则引擎分析请求内容。如果发现符合攻击模式的请求,WAF 将根据配置决定拦截请求或仅记录攻击尝试。
- 响应决策:WAF 根据分析结果对请求做出响应。如果请求被确定为恶意的,WAF 可以阻止该请求,并发送错误页面给用户;如果请求是合法的,则允许它继续到达 Web 应用。
下图展示了 WAF 的工作原理。
从图中可以看到,当客户端发送 HTTP 请求时,它最初会被 WAF 拦截,然后才到达 Web 应用程序。WAF 会分析此请求并应用一组预定义的安全规则。根据此分析,WAF 会做出阻止请求或允许其继续的决定。如果请求被阻止,客户端将立即收到一条错误消息。相反,如果允许该请求,则 Web 应用程序将对其进行处理,从而生成响应。随后,此响应将通过 WAF 路由回 WAF,在 WAF 中,它将经历与请求类似的分析和规则应用过程。如果 WAF 在响应中检测到任何恶意内容,它会阻止响应并向客户端发送错误消息。如果未检测到任何问题,则允许将响应传回给客户端。这种全面的检查过程可确保对传入请求和传出响应进行安全威胁审查,从而有效阻止恶意流量,同时允许合法交互与 Web 应用程序顺利进行。
基于 Envoy 集成的 WAF
WAF 作为防火墙需要拦截流量,而 Envoy 代理也同样需要拦截流量,这样我们就可以在 Envoy 中集成 WAF 来拦截恶意流量。Envoy Proxy 可以通过多种方式集成 WAF,以下是一些常见的基于 Envoy 实现的 WAF:
-
WebAssembly 插件:Envoy 本身不具备内置的 WAF 功能,但可以通过 WebAssembly 插件接口实现。开发者可以使用 WebAssembly 编写插件,将现成的 WAF 库(如 Coraza)编译为 WebAssembly,以便在 Envoy 中使用。
-
Wafris:这是一个专为 Envoy Proxy 设计的原生 WAF,能够提升 Envoy 的安全性。Wafris 提供了一个完整的 WAF 安全套件,可以过滤潜在威胁并提供有价值的流量分析(截止到撰写本文时,该 WAF 尚未正式发布)。
-
Next-Gen WAF Agent:可以将 Next-Gen WAF 代理作为 sidecar 部署在 Kubernetes 中,与 Envoy Proxy 集成。此代理通过 Envoy 的 gRPC 服务进行通信,允许在 Envoy 配置中添加额外的安全层。
-
Gloo Edge API Gateway:Gloo Edge 是基于 Envoy 构建的 API 网关,支持 WAF 扩展。它通过在 Envoy 中实现 ModSecurity 框架和规则集来提供 WAF 功能,默认包含 OWASP 核心规则集(CRS),并允许创建和应用自定义规则集。
-
Coraza WAF:Tetrate Enterprise Gateway for Envoy(TEG)内置了Coraza WAF,使用标准的 mod_security 规则格式进行配置。Coraza 默认配置了 OWASP 核心规则集(CRS),可以根据需要进行调整。
实施建议
下图展示了流量如何经过 集成了 WAF 的 Envoy 后处理流程:
步骤说明:
- 客户端发送请求到 Envoy 的 ext_authz 过滤器。
- ext_authz 过滤器将请求转发到 WAF 代理。
- WAF 代理 分析请求并应用规则,决定是否检测到攻击。
- 如果检测到攻击,WAF 代理将返回错误信息给客户端。
- 如果没有检测到攻击,WAF 代理将允许请求,并将其传递给 Web 应用,最终返回响应给客户端。
在实施 WAF 时,建议逐步调整规则以最大化其有效性并尽量减少误报。可以通过以下步骤实现:
- 将 WAF 设置为仅检测模式,以便在不干扰生产环境的情况下测试规则。
- 监控日志,识别并调整规则以减少误报和漏报。
- 在对规则集满意后,将 WAF 切换回正常模式以全面启用其保护功能。
通过合理配置和调整,Envoy 中的 WAF 功能可以显著增强 Web 应用程序的安全性,帮助开发者专注于功能开发,同时减少安全问题的处理时间。
Envoy 版本与功能:使用推荐的 Envoy 版本(v1.11.0 或更高)以获得最佳功能支持。低版本(v1.8.0 及以上)也支持,但可能功能受限。
集成ext_authz
过滤器:
- 将
envoy.ext_authz
过滤器配置在 HTTP 过滤器链中,该过滤器负责将客户端请求的元数据发送到 WAF 代理进行安全审查。 - 根据 WAF 代理的判断,请求可能被允许继续处理或直接阻止。
配置访问日志服务(ALS):
- 将响应数据通过访问日志服务异步发送到 WAF 代理,以便进行后续的审计和分析。
- 这有助于监控响应数据,并可能用于检测响应中的数据泄露等安全问题。
安全和 TLS 配置:
- 对于需要加密的部署,配置 TLS 支持以保证数据传输过程中的安全。
- 配置包括证书和密钥的管理。
请求和响应数据处理:
- 配置 Envoy 以启用对请求体和响应数据的处理,这可能需要在更高版本的 Envoy 中特别配置。
部署模式:
- WAF 代理通常部署为 Kubernetes 中的 sidecar,与 Envoy 代理共存,提供低延迟和高效的数据处理。
Coraza
Coraza 是一个开源的、企业级的高性能 WAF 库,采用 Go 语言编写。它与 ModSecurity 的 SecLang 规则集兼容,并完全支持 OWASP Core Rule Set (CRS) v4。Coraza 旨在保护 Web 应用程序免受广泛攻击,包括 OWASP Top Ten 列出的常见威胁,如 SQL 注入、跨站脚本(XSS)、代码注入等。
主要特性
- 兼容性:Coraza 是 ModSecurity 引擎的替代方案,支持行业标准的 SecLang 规则集。
- 安全性:运行 OWASP CRS v4 以保护 Web 应用程序,减少误报。
- 可扩展性:作为一个库,Coraza 提供多种集成方式,可以在本地部署 WAF 实例。
- 性能:能够处理从大型网站到小型博客的负载,性能影响最小。
- 简单性:源代码易于理解和修改,便于扩展新功能。
- 社区支持:作为一个社区项目,Coraza 接受贡献,欢迎各种想法。
集成
Coraza 项目维护了多个服务器的实现和插件,包括:
- Caddy 反向代理和 Web 服务器插件
- Proxy WASM 扩展(例如用于 Envoy)
- HAProxy SPOE 插件
- Coraza C 库(用于 nginx 等)
使用
Coraza 可以作为 Go 程序的库来实现安全中间件,或与现有的应用程序和 Web 服务器集成。它支持通过 Go 的构建标签调整某些功能,以适应高级用例。也可以编译成 WebAssembly 插件,集成到 Web 服务器中运行。
如何在 Envoy 中集成 Coraza
要想在 Envoy 中集成 Coraza WAF 可以使用 Coraza Proxy WASM 这个项目,参考步骤如下:
-
编译 WASM 插件: 使用 Go 和 TinyGo,你可以通过运行
go run mage.go build
命令来编译 Coraza WASM 插件。编译完成后,你会在./build
目录下找到生成的main.wasm
文件。 -
配置和运行 Envoy: 插件编译后,需要在 Envoy 配置文件中设置 WASM 插件。这涉及到配置 HTTP 过滤器以使用 WASM 扩展,然后指定 WASM 模块的位置和配置。具体配置包括指定处理规则和日志级别等。
-
测试和运行: 使用
mage runExample
和mage teardownExample
命令可以启动和关闭测试环境。测试环境默认在localhost:8080
运行。你可以发送 HTTP 请求来测试 Coraza 的行为和规则。 -
使用 OWASP Core Rule Set (CRS): Coraza Proxy WASM 支持直接集成 OWASP Core Rule Set,允许通过配置文件直接加载和使用。这有助于增强安全性并测试常见的 Web 攻击场景。
-
运行回归测试: 使用
go run mage.go ftw
命令运行 Coraza 的回归测试,确保所有功能按预期工作并且新的更改没有引入错误。
通过这些步骤,你可以成功地部署和使用 Coraza Proxy WASM 来增强你的 Web 应用安全性。更多详细信息和配置示例,请访问 Coraza Proxy WASM 的 GitHub 页面。这里提供了完整的安装指南、示例和配置说明,帮助你更好地理解和使用该项目。
如何在 Istio 中集成 Coraza
与在 Envoy 中集成 Coraza 类似,要想在 Istio 中集成 Coraza,同样需要使用 Wasm 插件——利用 Istio 内置的 WasmPlugin 资源,例如下面的定义。
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: coraza-waf
spec:
selector:
matchLabels:
waf: enabled
url: oci://ghcr.io/corazawaf/coraza-proxy-wasm:0.5.0
imagePullPolicy: IfNotPresent
phase: AUTHN
pluginConfig:
rules: |
SecRuleEngine On
Include @crs-setup-conf
Include @owasp_crs/*.conf
这个配置允许 Istio 在处理请求的认证阶段利用 Coraza WAF 执行额外的安全检查,通过定义的规则集增强安全性。此外,使用 OWASP Core Rule Set 帮助防御常见的 Web 应用攻击,如跨站脚本攻击(XSS)和 SQL 注入等。这种方式使得在 Istio 环境中部署和管理 WAF 更为灵活和集成。