sinhaparth5/coraza-waf-mod

GitHub: sinhaparth5/coraza-waf-mod

基于 Coraza 与 OWASP CRS 的单二进制 Go Web 应用防火墙兼反向代理,内置管理控制台,无需外部数据库或配置文件。

Stars: 0 | Forks: 0

# Coraza WAF Mod 一个用于 Go 的单二进制 Web 应用防火墙 + 反向代理,基于 [Coraza](https://github.com/corazawaf/coraza) (OWASP CRS) 构建,并带有内置的管理控制台。无需配置文件,无需外部数据库,无需 Node 工具链 —— 只需一个二进制文件,一个 SQLite 文件,使用 CLI 标志进行引导设置,其余一切均通过控制台完成。Docker 可用于本地开发,但并非必须。 ``` [Client] → [Coraza WAF + Proxy] → [Backend App(s)] ↕ [SQLite DB] ↕ [Admin Dashboard] ``` ## 功能 - **WAF 防护** — 内置于二进制文件中的 Coraza v3 与 OWASP 核心规则集 (CRS)。开箱即用地拦截 SQLi、XSS、RCE、路径遍历、受限文件访问以及已知的扫描器 User Agent。可以在 CRS 之上加载自定义 `.conf` 规则。 - **反向代理 / 多应用路由** — 按 Host 头(虚拟主机)或路径前缀(自动剥离前缀,类似于 nginx 的 `location`)进行路由,支持任意数量的后端应用。 - **IP 与国家/地区封禁** — 手动 IP 允许/拦截规则,以及基于 GeoIP2 的国家/地区封禁 (MaxMind GeoLite2),支持感知 Cloudflare 的真实 IP 提取,以及可选的受信任代理 CIDR(用于 `X-Forwarded-For` / `X-Real-IP`)。 - **TLS** — 纯 HTTP、自动 Let's Encrypt 证书或您自己的证书/私钥 —— 可全局应用和/或应用于单个服务(通过控制台上传证书或为每个后端启用自动签发)。 - **管理控制台** — HTMX/Tailwind 用户界面,提供实时流量和威胁图表、可过滤并带有实时跟踪功能的请求日志、IP/地理规则管理以及服务(后端应用)管理 —— 所有更改立即生效,无需重启。 - **Prometheus 指标** — `/admin/metrics` 暴露请求量、延迟以及按原因细分的拦截计数器 (IP/地理/WAF),并附带 Go runtime 指标。它受与控制台其余部分相同的 session-cookie 管理员身份验证保护(而非 HTTP Basic Auth),因此 scrape job 需要一种方式来携带已登录的 session cookie,而不是普通的用户名/密码。 - **一切皆在 SQLite 中** — 请求日志、IP/地理规则、服务和 TLS 状态全都存储在一个 `waf.db` 文件中。无需搭建 Postgres/Redis/MySQL。 ## 安装 ### 选项 A — 原生二进制(推荐) ``` curl -fsSL https://waf-install.astrareconslabs.com/coraza-waf-mod/install.sh | sudo bash ``` 这会下载适合您系统架构 (amd64/arm64) 的发布版二进制文件,验证其 SHA256 校验和,创建一个专用的非 root 系统用户 (`coraza-waf-mod`,仅授予 `CAP_NET_BIND_SERVICE` 权限,使其无需以 root 身份运行即可绑定 80/443 端口),交互式地提示输入管理员邮箱和密码(或自动生成),并通过 `coraza-waf-mod setup` 将其植入数据库。随后,它会安装一个 systemd unit,使用 CLI 标志启动该二进制文件,并启动服务。 检查其运行状态: ``` sudo systemctl status coraza-waf-mod sudo journalctl -u coraza-waf-mod -f ``` 无需编辑任何配置文件 —— 安装程序设置的所有内容要么是固化在 systemd unit 中的标志(运行 `sudo systemctl cat coraza-waf-mod` 查看),要么是存储在数据库中并通过控制台管理的设置。数据、证书和 `waf.db` 位于 `/var/lib/coraza-waf-mod/` 目录下。 #### 升级 重新运行相同的命令: ``` curl -fsSL https://waf-install.astrareconslabs.com/coraza-waf-mod/install.sh | sudo bash ``` 安装程序会检测到位于 `/usr/local/bin/coraza-waf-mod` 的现有二进制文件并切换至升级模式:它会下载并验证最新版本,替换二进制文件,重写 systemd unit 并重启服务 —— 完全跳过交互式提示。在升级过程中,绝对不会触碰管理员凭据和 TLS 证书。如果希望固定特定版本而不是总是获取最新版本,请使用 `curl -fsSL ... | sudo CORAZA_VERSION=v1.2.3 bash`。 ### 选项 B — 从源码构建 需要 Go 1.25+。 ``` git clone https://github.com/sinhaparth5/coraza-waf-mod.git cd coraza-waf-mod make build # go generate (minifies JS) + go build -> ./coraza-waf-mod # Seed 一个 admin 账户(password 从 stdin 读取,而不是一个 flag): echo "your-password" | ./coraza-waf-mod setup --admin-email you@example.com ./coraza-waf-mod # defaults: --listen :8080 --db waf.db --certs ./certs ``` `make run` 一步完成构建和运行(请先至少运行一次 `setup`,以便能够登录)。全过程纯 Go 实现(SQLite 驱动是 `modernc.org/sqlite`,无 CGO),因此只需 Go 工具链即可干净构建。请参阅 `main.go` 中等效于 `./coraza-waf-mod --help` 的标志,或 `CLAUDE.md` 中的标志表,以了解每个引导选项(`--listen-tls`、`--waf-rules`、`--geo-db`、`--retention`、`--tls-cert`/`--tls-key`、`--trusted-proxies`)。 ### 选项 C — 交叉编译的发布版二进制文件 ``` make dist # cross-compiles Linux amd64/arm64 and Windows amd64 binaries, CGO_ENABLED=0 make checksums # writes dist/checksums.txt ``` ### 选项 D — Docker(本地开发) ``` docker compose run --rm waf setup --db /data/waf.db --admin-email you@example.com docker compose up --build ``` `Dockerfile`(多阶段构建,最终镜像为 `scratch`)和 `docker-compose.yml` 仅供本地容器开发使用 —— 不是推荐的生产环境部署方式(请参见选项 A)。 ## 用法 1. 启动服务器(参见上文安装说明)—— 无需配置文件,仅使用 CLI 标志进行引导设置。 2. 首次登录前,使用 `coraza-waf-mod setup --admin-email you@example.com` 植入管理员账户(密码从标准输入读取)。`install.sh` 会以交互方式为您完成此操作。 3. 在 `http://:/admin` 打开管理控制台(该路径目前固定为 `/admin`),并使用该邮箱和密码登录。 4. 从 **Services** 添加后端应用:为其指定名称、匹配规则(Host 或路径 Prefix)以及后端 URL。向导在保存前会检查后端是否可达。服务完全存储在数据库中 —— 没有配置文件植入步骤。 5. 从各自的控制台页面管理 IP 规则、国家/地区封禁和请求日志 —— 所有操作都会立即生效。 6. (可选)从其所在行的 **Manage** 按钮为单个服务启用 TLS(上传证书,或开启自动签发 —— 从 Settings 页面设置 ACME 联系邮箱,或者在运行 `coraza-waf-mod setup` 时传入 `--domain`/`--acme-email`)。 ### GeoIP 设置(可选) 国家/地区封禁默认使用内置的 MaxMind GeoLite2 Country 数据库,因此全新构建的 Windows/Linux 版本无需手动复制 `.mmdb` 文件即可直接运行。本产品包含由 MaxMind 创建的 GeoLite 数据,可从 [https://www.maxmind.com](https://www.maxmind.com) 获取。 若要使用较新的外部副本覆盖内置数据库: 1. 在 [GeoLite2 注册页面](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data/)创建 MaxMind 账户。 2. 在 MaxMind 账户门户中,生成用于数据库下载的 License Key。 3. 下载 `GeoIP2 Binary (.mmdb)` 格式的 `GeoLite2-Country`,然后解压出 `GeoLite2-Country.mmdb`。 4. 将该文件放在服务可读取的位置,例如: ``` sudo mkdir -p /var/lib/coraza-waf-mod sudo cp GeoLite2-Country.mmdb /var/lib/coraza-waf-mod/ ``` 5. 使用 `--geo-db` 让二进制文件指向它: ``` ./coraza-waf-mod --geo-db /var/lib/coraza-waf-mod/GeoLite2-Country.mmdb ``` (对于 systemd 安装,请将 `--geo-db ...` 添加到 unit 的 `ExecStart=` 行中,并执行 `sudo systemctl daemon-reload && sudo systemctl restart coraza-waf-mod`。) 保持 `--geo-db` 未设置即可使用内置数据库。GeoLite 用户必须保持数据库更新;MaxMind 要求在新版本发布后的 30 天内替换或销毁旧版本的数据库,因此发布构建应定期刷新内置的 `.mmdb`。 ## 开发 ``` make build # build (runs go generate first — required after editing static/js/src/*.js) make test # go test ./... make clean # remove binary, minified JS, dist/ ``` 如果您正在修改代码库,请参阅 `CLAUDE.md` 获取架构说明。
标签:AppImage, EVTX分析, Go语言, SQL注入防护, Web应用防火墙, XSS防护, 反向代理, 日志审计, 流量监控, 程序破解, 自定义请求头, 请求拦截