Coraza WAF 是一个由 Go 语言开发的 Web 应用防火墙,它可以作为独立代理运行,也可以嵌入到 Caddy、Nginx 等 Web 服务器中,对 HTTP 请求和响应进行实时检测与拦截。它的最大特点是完整兼容 ModSecurity 的 SecRules 规则语法,因此可以直接使用 OWASP Core Rule Set 等成熟规则集,同时凭借 Go 语言的并发模型获得更低的资源占用和更高的吞吐能力。

相比传统基于 C 语言或 Lua 的 WAF,Coraza 在内存安全和并发性能方面表现突出。它不依赖外部引擎,规则解析和攻击检测都在同一进程内完成,减少了网络延迟和进程间通信开销。对于流量较大的站点,选择 Coraza 往往意味着可以用更少的服务器资源承载同等级别的安全防护。
一、Coraza WAF 的核心优势与部署形态
Coraza WAF 的设计目标是为现代云原生环境提供灵活的应用层防护。它既可以被编译进 Go 应用程序中,作为内嵌安全模块使用,也可以与 Caddy 这类高性能 Web 服务器集成,通过反向代理方式保护后端业务。常见的部署形态包括三种:第一种是作为 Caddy 的插件模块运行,第二种是使用 Docker 容器运行带 Coraza 的 Caddy 镜像,第三种是将 Coraza 编译成独立代理服务。
对于大多数中小型站点和自建服务器用户来说,Caddy 集成是最容易上手的方式。Caddy 本身配置简单、自动管理 HTTPS 证书,而 Coraza 的 Caddy 模块可以直接在 Caddyfile 中声明规则集和防护策略。这样既能享受 Caddy 的易用性,又能获得完整的 WAF 能力,不需要额外维护一套代理程序。
Coraza 的主要优势可以总结为以下几点:
- 兼容 ModSecurity 规则:现有的大量 SecRules 规则可以直接使用,迁移成本低。
- 高性能低延迟:Go 语言编写,支持高并发,适合高流量场景。
- 灵活的嵌入方式:既可以作为库嵌入应用,也可以作为插件集成到 Caddy。
- 活跃的社区维护:OWASP 官方支持的项目,更新及时,规则覆盖全面。
二、准备服务器环境
在开始部署之前,需要准备一台可用的 Linux 服务器,建议使用 Ubuntu 20.04 或更高版本、Debian 11 或 Rocky Linux 9 等主流发行版。服务器至少需要 1 核 CPU 和 1GB 内存,如果计划加载完整的 OWASP CRS 规则集并处理较高流量,建议使用 2 核 CPU 和 2GB 以上内存。
由于本文主要演示通过 Caddy 集成和 Docker 部署,服务器上需要安装基础工具,例如 curl、git 和 wget。对于使用 Caddy 集成的方案,还需要安装 Go 语言环境和 xcaddy 构建工具。如果使用 Docker 方案,则只需要安装 Docker Engine 即可,后续构建镜像时 Docker 会自动处理依赖。
下表列出了两种部署方式对环境的基本要求:
| 部署方式 | 必需软件 | 适用场景 |
|---|---|---|
| Caddy 集成 | Go 1.20 以上、xcaddy、git | 需要精细控制 Caddyfile 配置 |
| Docker 容器 | Docker Engine 20.10 以上 | 快速部署、环境隔离、无编译依赖 |
三、通过 Caddy 集成部署 Coraza WAF
这种方式的核心思路是使用 xcaddy 构建一个带 Coraza 模块的 Caddy 可执行文件,然后在 Caddyfile 中启用 coraza_waf 指令。这样 Caddy 在处理每个 HTTP 请求时,会先经过 Coraza 的规则引擎,再决定是否转发到后端服务。
3.1 安装 Go 和 xcaddy
首先安装 Go 语言环境。以 Ubuntu 为例,可以执行以下命令下载并解压 Go 到 /usr/local 目录,然后将 Go 的 bin 目录加入 PATH 环境变量。安装完成后,运行 go version 确认版本不低于 1.20。
接着安装 xcaddy 工具。xcaddy 是 Caddy 官方提供的构建工具,它可以根据需要自动拉取和编译插件。执行命令 go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest 之后,xcaddy 会被安装到 $HOME/go/bin 目录下。
3.2 构建带 Coraza 模块的 Caddy
使用 xcaddy 构建 Caddy 时,需要通过 --with 参数指定要加入的模块。Coraza 的 Caddy 插件模块路径为 github.com/corazawaf/coraza-caddy/v2。执行 xcaddy build --with github.com/corazawaf/coraza-caddy/v2,构建完成后会在当前目录生成一个名为 caddy 的可执行文件。
如果构建过程中遇到网络问题,可以配置 Go 模块代理,例如 export GOPROXY=https://goproxy.cn,direct。构建成功后,将这个 caddy 文件复制到 /usr/local/bin/ 目录,并赋予可执行权限,后续就可以像使用标准 Caddy 一样使用它。
3.3 编写 Caddyfile 配置文件
Caddyfile 是 Caddy 的核心配置文件。下面是一个最小化的 Coraza WAF 配置示例:
{
order coraza_waf before reverse_proxy
}
:8080 {
coraza_waf {
directives `
SecRuleEngine On
Include /opt/coraza/crs/coraza-crs.conf
SecRequestBodyAccess On
SecResponseBodyAccess On
SecDebugLog /var/log/coraza/debug.log
SecDebugLogLevel 3
`
}
respond "Hello, WAF!" 202
}
在这个配置中,order 指令确保 Coraza 在反向代理之前执行。coraza_waf 块中的 directives 部分用于加载规则集并设置引擎参数。SecRuleEngine On 表示开启拦截模式,如果暂时只想观察日志而不阻断请求,可以改为 DetectionOnly。
配置完成后,使用 caddy run --config Caddyfile 启动服务。此时访问服务器的 8080 端口,如果返回 Hello, WAF!,说明 WAF 已经正常工作。接下来可以发送一些攻击请求验证拦截效果。
四、使用 Docker 容器部署 Coraza WAF
如果不想在服务器上安装 Go 环境,或者希望实现快速部署和回滚,使用 Docker 是更合适的选择。基本思路是构建一个包含 Coraza 模块的 Caddy 镜像,然后把 Caddyfile 和规则集通过卷挂载到容器中。
4.1 编写 Dockerfile
首先创建一个 Dockerfile,使用 Caddy 官方提供的 builder 镜像来构建带 Coraza 插件的 Caddy,然后将构建产物复制到精简的运行时镜像中。示例如下:
FROM caddy:builder AS builder RUN xcaddy build --with github.com/corazawaf/coraza-caddy/v2 FROM caddy:alpine COPY --from=builder /usr/bin/caddy /usr/bin/caddy COPY Caddyfile /etc/caddy/Caddyfile COPY coraza /opt/coraza
这里使用多阶段构建,最终镜像只包含 Caddy 可执行文件和配置,体积较小。Caddyfile 和规则集目录需要放在与 Dockerfile 相同的构建上下文中。
4.2 构建并运行容器
在 Dockerfile 所在目录执行 docker build -t coraza-caddy . 完成镜像构建。构建完成后,运行以下命令启动容器:
docker run -d --name coraza-waf -p 80:80 -p 443:443 -v $(pwd)/logs:/var/log/coraza -v $(pwd)/coraza:/opt/coraza coraza-caddy
容器启动后,Caddy 会监听 80 和 443 端口。日志目录挂载到宿主机后,方便查看 Coraza 的调试日志和拦截记录。如果使用 HTTPS,需要确保 Caddyfile 中的站点地址配置正确,Caddy 会自动申请证书,但需要域名解析到服务器。
五、加载 OWASP CRS 规则集并调优
OWASP Core Rule Set 是应用最广泛的 WAF 规则集,包含针对 SQL 注入、跨站脚本、命令注入、路径遍历等常见攻击的检测规则。Coraza 可以直接加载 CRS 规则,但在使用前需要下载规则文件并创建入口配置。
可以通过 git clone https://github.com/coreruleset/coreruleset.git /opt/coraza/crs 获取规则集。然后在 /opt/coraza 目录下创建 coraza-crs.conf 文件,内容示例如下:
SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecRequestBodyLimit 13107200 SecRequestBodyNoFilesLimit 131072 SecResponseBodyLimit 1048576 Include /opt/coraza/crs/crs-setup.conf Include /opt/coraza/crs/rules/*.conf
其中 crs-setup.conf 是 CRS 的初始化配置文件,可以调整规则阈值和异常评分。rules 目录下的 conf 文件是具体检测规则。加载完整 CRS 后,建议先使用 DetectionOnly 模式运行一段时间,观察误报情况,再切换为 On 模式进行实际拦截。
调优方面,常见操作包括降低 Paranoia Level 以减少误报、对特定路径或参数添加白名单、调整 SecRuleEngine 的检测范围,以及限制请求体大小避免大文件上传被误拦截。对于业务接口中的特殊字符或参数格式,可以通过 SecRuleUpdateTargetById 指令排除特定字段。
六、攻击测试与日志分析
部署完成后,需要验证 WAF 是否能正确识别和拦截攻击。使用 curl 命令可以模拟常见的攻击请求。例如测试 SQL 注入:
curl 'http://localhost:8080/?id=1%27%20OR%20%271%27=%271'
如果规则生效,请求会被拒绝,返回 403 状态码,同时在调试日志中出现对应的规则编号和拦截原因。另一个简单测试是使用包含 nikto 的 User-Agent,因为 CRS 默认会拦截常见扫描器特征。
下表列出几类典型测试请求和预期结果:
| 攻击类型 | 测试请求 | 预期结果 |
|---|---|---|
| SQL 注入 | ?id=1' OR '1'='1 | 403 拦截 |
| XSS 跨站脚本 | ?q=<script>alert(1)</script> | 403 拦截 |
| 路径遍历 | /../../etc/passwd | 403 拦截 |
| 扫描器特征 | User-Agent: nikto | 403 拦截 |
日志文件默认位于 /var/log/coraza/debug.log,查看时可以关注 ruleId、severity 和 data 字段,这些信息能帮助判断攻击类型和触发原因。如果发现正常业务请求被误拦,可以根据 ruleId 在 CRS 中查找对应规则,然后添加例外或调整阈值。
七、生产环境建议与常见故障排查
将 Coraza WAF 部署到生产环境前,建议先进行充分的灰度测试。可以先在 DetectionOnly 模式下运行 3 到 7 天,收集日志并分析误报率。如果误报率低于可接受范围,再切换为 On 模式。切换后持续关注业务接口的成功率和响应时间,确保没有因规则拦截导致功能异常。
性能方面,完整加载 OWASP CRS 规则集会增加一定的请求处理延迟,通常单请求增加 1 到 10 毫秒。对于高并发场景,可以通过调整规则集加载范围、关闭响应体检测、设置合理的请求体限制以及使用缓存规则来降低开销。如果后端服务本身响应较慢,建议将 SecResponseBodyAccess 设为 Off,只检测请求流量。
常见故障包括:Caddy 启动报错找不到 coraza_waf 指令,通常是构建时未正确加入 Coraza 模块;规则文件路径错误导致 Include 失败;容器内无法写入日志目录导致 Caddy 异常退出。排查时先检查 Caddyfile 缩进和路径是否正确,再确认日志目录的写权限是否充足。
另一个需要关注的问题是规则集的更新。OWASP CRS 会定期发布新版本,建议每隔一到两个月通过 git pull 更新规则文件,并在测试环境验证兼容性后再部署到生产环境。只有持续更新和调优,才能让 Coraza WAF 在真实流量中保持稳定高效的防护能力。
Coraza WAFWeb应用防火墙Go语言部署修改时间:2026-08-20 00:56:04