threatailwaf/threatail-node
GitHub: threatailwaf/threatail-node
Rust 编写的自托管 Web 应用防火墙,通过反向代理在流量到达后端前进行签名检测、机器学习异常分析和速率限制等多层防护。
Stars: 1 | Forks: 0
# Threatail Node
一个作为反向代理运行在您的站点之前的 Web 应用防火墙。使用 Rust 编写,以单个静态二进制文件发布,并将所有流量保留在您自己的基础设施中。
```
client ──▶ threatail-node ──▶ your backend
(inspect,
block, log)
```
**状态:** beta。请先以 `detect` 模式运行 —— 参见[模式](#modes)。
## 功能
- **签名检测** — SQL 注入、XSS、路径遍历、命令注入、扫描器。
- **抗规避检查** — 在匹配前解码请求体:gzip、deflate、brotli、UTF-16、UTF-7 和基于注释的 SQL 混淆 (`union/**/select`)。检查 `Content-Type` 声称为二进制但实际并非如此的请求体。
- **速率限制** — 基于路径前缀,以 IP、token、header 或 cookie 为键。超过限制将阻止请求或提供工作量证明挑战。
- **Bot 处理** — 通过正向确认反向 DNS 验证爬虫,因此伪造的 `Googlebot` user-agent 会被捕获。
- **撞库保护** — 监控每个 IP 和用户名的登录尝试速度。
- **异常检测** — 为每个站点建立正常流量画像并对偏差进行评分。
- **访问控制** — IP 允许/拒绝列表、地理策略、HTTP 方法允许列表、TLS 指纹识别。
- **威胁评分** — 将加权信号组合成一个数值,具有可配置的阻断阈值。
- **响应检查 (DLP)** — 扫描后端响应中泄露的密钥和堆栈跟踪。
- **API 保护** — 带有算法允许列表的 JWT 验证、JSON 请求体限制以及 OpenAPI 正向模型验证。参见 [`docs/api-protection.md`](docs/api-protection.md)。
每个请求都在进程内进行检查。不会向任何第三方发送数据。
## 要求
- Linux, x86-64
- 可用的 80 和 443 端口
- 一个用于代理的后端
无运行时依赖 —— release 二进制文件与 musl 静态链接。
## 安装
### Docker
```
git clone https://github.com/threatailwaf/threatail-node
cd threatail-node
docker build -t threatail-node .
docker run -d --name threatail \
-p 80:80 -p 443:443 \
-v /etc/threatail:/etc/threatail:ro \
-v threatail-data:/var/lib/threatail \
threatail-node
```
还有一个 `docker-compose.yml` 可以在演示后端前运行该节点。完整说明:[`docs/deployment-docker.md`](docs/deployment-docker.md)。
### Kubernetes
普通清单,无模板引擎:
```
$EDITOR deploy/k8s/02-configmap.yaml # your domain and backends
$EDITOR deploy/k8s/03-deployment.yaml # your image
kubectl apply -f deploy/k8s/
```
创建一个 namespace、ConfigMap、2 副本 Deployment(非 root 用户,只读根文件系统)以及用于流量和指标的 Service。在生产环境之前请阅读 [`docs/deployment-kubernetes.md`](docs/deployment-kubernetes.md) —— 关于客户端 IP 和每个 pod 状态的部分非常重要。
### 从源码构建
```
cargo build --release
sudo install -m755 target/release/threatail-node /usr/local/bin/
```
需要 Rust 1.87 或更高版本。该 crate 本身是 2021 edition;需要更新的工具链是因为某些依赖项使用了 2024 edition。
## 快速开始
```
sudo mkdir -p /etc/threatail /var/lib/threatail
sudo cp config.example.json /etc/threatail/config.json
sudo nano /etc/threatail/config.json # set your domain and backend
sudo threatail-node # reads /etc/threatail/config.json
```
使用 `threatail-node /path/to/config.json` 指定不同的配置。
验证它是否正在检查:
```
curl -i "http://localhost/?id=1'+UNION+SELECT+password+FROM+users--"
```
在 `detect` 模式下,它会返回您的后端响应并写入一条日志。在 `protect` 模式下,它会返回 403。
## 配置
最小配置:
```
{
"listen_http": "0.0.0.0:80",
"listen_https": "0.0.0.0:443",
"sites": [
{
"domain": "example.com",
"backends": ["http://127.0.0.1:8080"],
"mode": "detect"
}
]
}
```
有关带有注释的真实场景设置,请参见 [`config.example.json`](config.example.json),有关各个子系统的参考,请参见 [`docs/`](docs/)。
多个后端通过轮询进行负载均衡。多个站点通过 `Host` 匹配。
### 模式
| 模式 | 阻止 | 记录日志 | 学习 |
|-----------|--------|------|--------|
| `learn` | 否 | 否 | 是 |
| `detect` | 否 | 是 | 是 |
| `protect` | 是 | 是 | 是 |
先以 `learn` 模式运行几天,以便异常画像反映您的真实流量,然后切换到 `detect` 查看哪些内容*会*被阻止,最后切换到 `protect`。
当站点的其余部分处于 `protect` 模式时,个别硬性拦截门可以保持非阻止状态 —— 参见 `traversal_logonly`、`method_logonly`、`ipv6_logonly`。
### TLS
为每个站点提供证书,或者在上游终止 TLS,并在其后面以 HTTP 方式运行节点。参见 [`docs/certificates.md`](docs/certificates.md)。
### 指标
设置 `metrics_listen` 以在 `/metrics` 暴露 Prometheus 指标。**将其绑定到内部接口** (`127.0.0.1:9100`),或者如果必须可访问,请设置 `metrics_token`。查询和警报请参见 [`docs/prometheus-grafana.md`](docs/prometheus-grafana.md)。
## 机器学习
节点具有两个 ML 层,它们开箱即用的表现各不相同:
**异常检测(无监督)—— 独立运行。** 节点为每个站点学习流量画像,并对偏差进行评分。无需安装任何东西。给它几天的 `learn` 模式时间,并可选择设置 `ml_trusted_ips`,使其仅在您信任的流量上进行训练。
**监督模型 —— 本仓库不附带任何模型。** 推理引擎位于此处,但内置的模型文件只是一个空的占位符。训练需要带标签的攻击数据和本仓库未包含的 pipeline。如果没有模型,监督评分仅处于非活动状态;签名、规则、速率限制和异常检测均正常工作。
您可以通过 `ml_model_path` 提供自己的模型 —— 其格式记录在 [`docs/supervised-model.md`](docs/supervised-model.md) 中 —— 或者从 Threatail Cloud(见下文)获取维护的模型。
## 独立或托管
该节点可独立运行且功能完整。以上所有功能均可通过配置文件实现,无需账户,也不需要向我们发起任何网络调用。
或者,它可以通过设置两个环境变量连接到 **Threatail Cloud**(一个托管控制平面):
```
THREATAIL_CLOUD_URL=https://lk.threatail.com
THREATAIL_ENROLLMENT_TOKEN=
```
连接后,节点将从云端而不是本地文件中拉取其策略,并报告事件和每分钟汇总数据。完整的请求流量仍然永远不会离开您的服务器。
| | 独立 | 搭配 Cloud |
|---|---|---|
| 检测、规则、速率限制、Bot、异常 | ✅ | ✅ |
| 配置 | 每个节点的 JSON 文件 | Web 面板,所有节点 |
| 针对新 CVE 的托管规则 / 虚拟补丁 | — | ✅ |
| 经过训练的监督 ML 模型 + 重训练 | 自带 | ✅ |
| 多节点、多租户、团队访问 | — | ✅ |
| 面板、警报、日志保留 | 自带 Prometheus/Grafana | ✅ |
| 证书自动化 (ACME) | 手动 | ✅ |
如果您从未设置 `THREATAIL_CLOUD_URL`,节点将在启动时记录 `cloud mode disabled`,并且永远不会联系我们。
## 安全
这是位于您生产流量路径上的软件。为此我们采取了以下几项措施:
- Rust,在请求路径中没有 `unsafe`。
- 依赖项在每次发布时都经过审计 (`cargo audit`)。
- 请求体解压具有边界限制,以防止解压炸弹。
- 始终阻止代理到链路本地元数据地址 (`169.254.*`)。
发现漏洞?请私下报告 —— 参见 [SECURITY.md](SECURITY.md)。请勿公开发布 issue。
## 测试您的部署
该节点已通过 [GoTestWAF](https://github.com/wallarm/gotestwaf) 测试。您可以自己运行:
```
docker run --rm --network host wallarm/gotestwaf \
--url http://localhost --noEmailReport
```
## 贡献
欢迎提交 issue 和 pull request。请:
- 在提交 PR 之前运行 `cargo test` 和 `cargo clippy`。
- 为任何检测更改添加测试 —— 参见 `src/verdict.rs` 中的测试模块。
- 检测规则应附带绕过测试,而不仅仅是正向测试。
## 许可证
[Apache-2.0](LICENSE)。
标签:API安全, AppImage, Bot防护, CISA项目, JSON输出, Rust, StruQ, WAF, Web应用防火墙, 反向代理, 可视化界面, 子域名突变, 网络流量审计, 自定义请求头, 请求拦截, 通知系统