Docker部署OWASP OFFAT实战:快速搭建可扩展的API漏洞扫描服务
OWASP OFFAT(OFFensive Api Tester)是OWASP旗下一款开源的API漏洞扫描工具,它能根据OpenAPI/Swagger规范文件自动生成测试用例,对受限HTTP方法、SQL注入、BOLA越权、数据泄露、批量赋值等OWASP API Top 10常见漏洞进行自动化检测。本文是一份完整的Docker部署OWASP OFFAT实战指南,带你用docker compose一键搭建由Redis、API服务与异步Worker组成的可扩展API漏洞扫描服务,并附上接口调用与CLI扫描的实战示例。
OWASP OFFAT是什么:为什么选择它做API漏洞扫描
OFFAT全称 OFFensive Api Tester,核心工作流程很简单:读取你的 OpenAPI/Swagger 规范文件 → 自动生成针对每个端点的安全测试用例 → 运行扫描并输出结构化结果。它内置了多项来自 OWASP API Security Top 10 的检测项:
- ✅ 受限HTTP方法检测(Restricted HTTP Methods)
- ✅ SQL注入(SQLi)
- ✅ BOLA/IDOR越权访问
- ✅ 数据泄露检测(Data Exposure)
- ✅ BOPLA / 批量赋值(Mass Assignment)
- ✅ 越权访问控制(Broken Access Control)
- ✅ 基础命令注入与XSS/HTML注入测试
- ✅ 基础SSTI模板注入测试
相比商业扫描器,它最大的优势是:开源免费(MIT协议)、支持CLI与API两种使用方式、官方提供Docker镜像,非常适合集成进CI/CD流水线。
Docker部署OFFAT的准备工作
开始之前,请确认环境满足以下条件:
- 已安装 Docker 与 Docker Compose(
docker compose version可查看版本); - 准备一份 API 的 OpenAPI/Swagger 规范文件(JSON 或 YAML 均可),可以放在本地,也可以是一个可访问的 URL;
- 如需从源码自行构建镜像,可先克隆仓库:
git clone https://gitcode.com/gh_mirrors/of/OFFAT.git
一键安装步骤:docker compose快速搭建扫描服务
项目已经在 docker-compose.yml 中定义好了一整套可扩展的扫描服务拓扑,包含三个组件:
| 服务名 | 作用 | 端口 |
|---|---|---|
| offat-redis | 任务队列存储(Redis) | 6379 |
| offat-api | FastAPI 扫描调度接口 | 8000 |
| offat-api-worker | RQ 异步扫描执行 Worker | 无 |
进入项目源码目录后,一条命令即可启动全部服务:
cd src
docker compose up -d
启动完成后用 docker compose ps 查看状态,三个容器都应处于运行状态。此时访问 http://localhost:8000/ 会返回 OFFAT API 的基础信息,而 http://localhost:8000/docs 则是 FastAPI 自动生成的接口文档页面,非常方便调试。
最快配置方法:让API扫描服务真正跑起来
OFFAT 的 API 采用"提交任务 + 异步轮询结果"的模式,扫描在 Worker 中执行,不会阻塞接口调用。整个流程涉及两个接口,定义在 app.py 中:
第一步:提交扫描任务
curl -X POST http://localhost:8000/api/v1/scan \
-H "Content-Type: application/json" \
-H "SECRET-KEY: your-secret-key" \
-d '{"openapi": "https://example.com/swagger.json"}'
返回的 job_id 就是后续查询结果的凭证。注意两个关键点:
- 请求头必须携带
SECRET-KEY,其值来自环境变量AUTH_SECRET_KEY(参见 config.py),否则会返回 401; openapi字段既可以传规范文件 URL,也可以直接传 JSON/YAML 字符串内容(字段定义见 schema.py)。
第二步:查询扫描结果
curl http://localhost:8000/api/v1/scan/{job_id}/result \
-H "SECRET-KEY: your-secret-key"
任务执行中返回 202 状态与 "Job In Progress",完成后返回 200 和完整的扫描结果明细。
用CLI镜像快速扫描单个API
如果只想临时扫描一个 API,不需要起整套服务,直接用 CLI 镜像更轻量。官方提供了独立的 CLI 镜像(见 cli-Dockerfile):
# 使用URL方式扫描
docker run --rm dmdhrumilmistry/offat -f https://example.com/swagger.json
# 使用本地文件方式扫描(需要挂载目录)
docker run --rm -v $(pwd):/data dmdhrumilmistry/offat -f /data/swagger.json
CLI 还支持丰富的实用参数,适合做针对性测试:
# 输出HTML报告
offat -f swagger.json -o report.html -of html
# 限制每秒请求数,避免压垮被测服务
offat -f swagger.json -rl 60
# 携带认证头与限速扫描
offat -f swagger.json -H 'Authorization: Bearer token' -rl 100
# 只扫描匹配路径的端点
offat -f swagger.json -pr '/user'
提示:
json是默认输出格式,也支持yaml和html。
如何扩展扫描能力:架构解读与性能优化
OFFAT 的可扩展性体现在"异步队列"设计上。从 docker-compose.yml 可以看到,API 服务把扫描任务投递到 Redis 队列,由 Worker 消费执行。这意味着你可以:
- 横向扩展 Worker:扫描任务多时,直接增加 Worker 副本数即可并行处理,例如
docker compose up -d --scale offat-api-worker=4; - 不影响接口响应:扫描是异步任务,即使大批量提交也不会阻塞 API 调用(任务超时上限为 1 小时,见 config.py);
- 控制扫描强度:通过
rate_limit参数(默认 60 次/秒)限制请求频率,避免对被测服务造成压力。
此外,官方基础镜像基于 Chainguard 的 Wolfi 加固基础镜像构建(见 wolfi-base-Dockerfile),采用多阶段构建并以 nonroot 非特权用户运行,安全性更有保障。
扫描结果怎么看
OFFAT 的输出以表格形式清晰呈现每个端点的检测结论。以 v0.5.0 版本的扫描结果为例,它主要包含三类检测:
- HTTP方法检测:如果端点执行了规范中未记录的 HTTP 方法,会标记为
False并提示 "Endpoint performs HTTP method which is not documented"; - SQL注入检测:针对查询参数注入
OR 1=1;--等恶意载荷,判断参数是否对 SQL 注入免疫; - BOLA路径检测:对
/pet/{id}这类含路径参数的端点做模糊注入,识别潜在的越权访问风险。
表中的 data_leak(数据泄露)与 result(结果)是相互独立的维度,即使端点存在数据泄露,结果列也可能显示成功,解读报告时要注意区分。
常见问题与排查建议
- 提交任务返回 401:检查
SECRET-KEY请求头是否与AUTH_SECRET_KEY环境变量一致,生产环境务必显式设置该变量,避免使用随机默认值; - 任务一直显示 In Progress:确认
offat-api-worker容器在运行,Worker 没启动时任务会一直积压在 Redis 队列中; - 连接 Redis 失败:确认
REDIS_HOST/REDIS_PORT环境变量与 config.py 中的默认值匹配; - 扫描结果异常:项目对 OAS v3 规范的支持仍在完善中,遇到解析报错时可先检查规范文件是否符合 OAS v2 格式,或查看返回结果中的
error字段定位问题。
结语
通过 Docker 部署 OWASP OFFAT,几分钟内就能拥有一套免费、可扩展的 API 漏洞扫描服务。无论是 CI/CD 流水线集成,还是日常的接口安全巡检,它都能帮你自动发现 API 中的常见高危漏洞。建议先在测试环境用 Petstore 这类示例规范跑通全流程,再逐步应用到生产接口的安全检测中。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考





