eneamanzi/apiguard-assurance
GitHub: eneamanzi/apiguard-assurance
一款针对受API网关保护的REST API进行自动化DAST安全审计的CLI工具,基于OpenAPI规范执行多层级测试并生成交互式报告与取证存档。
Stars: 0 | Forks: 0
[English version](README.en.md) | **意大利语版本**
# APIGuard Assurance
**针对云环境中 REST API 的自动化安全评估工具**
APIGuard Assurance 是一款用于对受 API Gateway 保护的 REST API 进行安全审计的 CLI 工具。它针对任何使用 OpenAPI 3.x 或 Swagger 2.0 规范记录的目标,执行 APIGuard 方法论(涵盖 8 个领域,多达 29 项可验证的安全保证),并生成交互式 HTML 报告和正式、可复现的证据存档。
## 目录
1. [附加价值与用例](#1-valore-aggiunto-e-casi-duso)
2. [要求与安装](#2-requisiti-e-installazione)
3. [配置](#3-configurazione)
4. [实际用法](#4-utilizzo-pratico)
5. [评估输出](#5-output-dellassessment)
6. [工作原理 — 高层流水线](#6-come-funziona--pipeline-ad-alto-livello)
7. [领域与测试优先级](#7-domini-e-priorità-dei-test)
8. [退出代码](#8-codici-di-uscita)
9. [仓库结构](#9-struttura-della-repository)
## 1. 附加价值与用例
对 API Gateway 进行手动审计速度慢、难以复现,且容易出现系统性遗漏。APIGuard Assurance 通过正式、确定性和有记录的方法解决了这些问题。
**对于安全审计人员:**
- 在任何兼容的目标上可复现地执行相同的保证集:相同的测试、相同的顺序、相同的输出。
- 三个特权级别 — Black Box(无凭证)、Grey Box(适用于多种角色的有效 JWT)、White Box(Admin API 访问权限) — 可独立配置以适应约定的范围。
- 自动收集正式证据:每次违规都附带完整的请求、完整的响应以及一个 `record_id`,使分析师能够无需任何额外上下文即可复现攻击。
- 交互式 HTML 报告,包含每次执行 HTTP 事务的完整审计追踪,包括那些 PASS 的事务,作为覆盖率的证明。
**对于开发与 DevSecOps 团队:**
- 通过结构化的 JSON 输出(`apiguard_report.json`)和语义化退出代码,原生集成到 CI/CD 流水线中。
- 采用 JSON 格式的结构化日志记录(`--log-format json`),兼容 Elasticsearch、Splunk、Datadog 及类似聚合器。
- 零秘密架构:凭证从不会以明文形式出现在受版本控制的配置文件中。
## 2. 要求与安装
**系统要求:**
- Python 3.11 或更高版本
- 目标 API 的网络访问权限(Gateway 代理及可选的 Admin API)
**开发模式安装(推荐):**
```
git clone
cd apiguard-assurance
# 创建并激活 virtual environment
python -m venv .venv
source .venv/bin/activate # Linux/macOS
# .venv\Scripts\activate # Windows
# 安装包及所有 runtime 依赖
pip install -e .
# 验证安装
apiguard version
```
**包含开发依赖的安装(面向贡献者):**
```
pip install hatch
hatch env create dev
hatch run dev:pytest tests_e2e/ -v
```
**静态分析工具:**
```
# Linting 和 formatting(ruff — 替代 flake8 + isort + black)
hatch run dev:ruff check src/
hatch run dev:ruff format src/
# strict 模式下的 Type checking(mypy)
hatch run dev:mypy src/
```
## 3. 配置
配置被分为两层截然不同且有意解耦的部分:可受版本控制的结构化参数和来自环境的秘密信息。
### 3.1 `config.yaml` — 结构化参数(可受版本控制)
```
target:
base_url: "http://localhost:8000" # URL del proxy Gateway
openapi_spec_url: "http://localhost:3000/swagger.v1.json"
admin_api_url: "http://localhost:8001" # Ometti per disabilitare test WHITE_BOX
credentials:
# Le credenziali NON compaiono mai in chiaro qui.
# I placeholder ${VAR} vengono risolti da variabili d'ambiente a runtime.
admin_username: "${ADMIN_USERNAME}"
admin_password: "${ADMIN_PASSWORD}"
user_a_username: "${USER_A_USERNAME}"
user_a_password: "${USER_A_PASSWORD}"
user_b_username: "${USER_B_USERNAME}"
user_b_password: "${USER_B_PASSWORD}"
execution:
min_priority: 3 # 0 = solo P0 | 1 = P0+P1 | 2 = P0-P2 | 3 = tutti (default)
strategies:
- BLACK_BOX
- GREY_BOX
- WHITE_BOX
fail_fast: false # Se true, interrompe l'esecuzione al primo FAIL su test P0
connect_timeout: 5.0
read_timeout: 30.0
max_retry_attempts: 3
openapi_fetch_timeout_seconds: 60.0
output:
directory: "outputs" # Accetta percorsi relativi o assoluti; creata se non esiste
rate_limit_probe:
max_requests: 150 # Massimo richieste per il probe empirico di rate limiting
request_interval_ms: 50
tests:
domain_1:
max_endpoints_cap: 0 # 0 = testa tutti gli endpoint protetti (raccomandato)
```
### 3.2 `.env` 文件 — 秘密信息(请勿进行版本控制)
```
# 复制 template 并填充字段
cp .env.example .env
```
```
# .env — 本地 variabili d'ambiente
ADMIN_USERNAME=thesis-admin
ADMIN_PASSWORD=
USER_A_USERNAME=user-a
USER_A_PASSWORD=
USER_B_USERNAME=user-b
USER_B_PASSWORD=
```
加载器(`src/config/loader.py`)会在解析 YAML **之前** 执行环境变量插值。未解析的占位符(`${MISSING_VAR}`)会产生一个 `ConfigurationError`,明确指出缺失的变量名,使诊断变得立即且直接。进程环境中已存在的变量优先于 `.env` 文件中的变量(即 `load_dotenv` 的 `override=False` 行为),这使得该工具适用于通过编排器注入秘密信息的 CI/CD 环境。
### 3.3 配置验证(不启动评估)
```
apiguard validate-config --config config.yaml
```
仅执行阶段 1(加载和验证),如果配置有效则返回退出代码 0,否则返回 10。
## 4. 实际用法
### 启动评估
```
# 标准执行(当前 working directory 中的 config.yaml)
apiguard run
# 显式路径中的 Config
apiguard run --config /etc/apiguard/config.yaml
# 面向 CI/CD 的 JSON Output — machine-readable log,无 banner
apiguard run --log-format json --no-banner
# 详细 Debug:每条 HTTP 事务均被单独 log
apiguard run --log-level debug
# 抑制 banner 同时保留 human-readable log(在脚本中很有用)
apiguard run --no-banner
```
### 选择测试子集
选择是通过 `config.yaml` 进行的,而不是通过 CLI 参数。修改 `execution` 参数以缩小范围:
```
# 仅 Black Box 测试 — 无需 credenziale
execution:
min_priority: 0
strategies:
- BLACK_BOX
# 所有 strategie 中仅 P0 关键测试
execution:
min_priority: 0
strategies:
- BLACK_BOX
- GREY_BOX
- WHITE_BOX
```
### 集成到 CI/CD 流水线
```
#!/bin/bash
set -e
apiguard run \
--config config.yaml \
--log-format json \
--no-banner
EXIT_CODE=$?
case $EXIT_CODE in
0) echo "CLEAN: nessuna violazione rilevata"; exit 0 ;;
1) echo "FAIL: almeno una garanzia di sicurezza e violata"; exit 1 ;;
2) echo "ERROR: almeno una verifica non e stata completata"; exit 2 ;;
10) echo "INFRA: errore di infrastruttura, assessment non completato"; exit 10 ;;
esac
```
## 5. 评估输出
每次运行结束后,会在配置的目录(`output.directory`)中生成三个文件:
| 文件 | 格式 | 用途 |
|---|---|---|
| `assessment_report.html` | 交互式 HTML | 供分析师阅读的报告,包含每项事务的完整审计追踪 |
| `evidence.json` | JSON | FAIL(失败)证据的取证存档(完整、可复现的 payload) |
| `apiguard_report.json` | JSON | 用于 CI/CD、SIEM 及机器间集成的结构化报告 |
### `evidence.json` — 取证存档
包含按时间排序的 `EvidenceRecord` 数组,每条记录对应一个产生 FAIL 或被测试明确“固定”为关键上下文的 HTTP 事务。每条记录包括:
- 完整的请求(方法、URL、带有 `Authorization: [REDACTED]` 的标头、主体)
- 完整的响应(状态码、标头、截断为 10,000 个字符的主体)
- 格式为 `{test_id}_{sequence}` 的 `record_id`(例如 `1.1_005`)— 与 HTML 报告进行交叉引用的键
单条 `EvidenceRecord` 足以复现触发漏洞的确切请求,而无需任何额外的上下文。这就是其设计目的:**每条记录都是自给自足的**。
### `assessment_report.html` — 交互式报告
HTML 报告包括:
- 带有汇总统计信息的执行摘要(PASS/FAIL/SKIP/ERROR、发送的 HTTP 请求总数、评估持续时间)
- 按测试划分的结果表,包含领域、优先级、策略、CWE 及结果消息
- 对于每个 FAIL 测试:包含特定技术描述和标准参考(CWE、OWASP)的 `Finding`
- 每个测试均可展开的审计追踪:包含预言机状态(`ENFORCED`、`BYPASS`、`RATE_LIMIT_HIT` 等)和主体预览的所有 HTTP 事务表
- 双向交叉引用:带有 `is_fail_evidence=true` 的条目会在 `evidence.json` 中报告相应的 `record_id`
## 6. 工作原理 — 高层流水线
该工具每次评估执行七个顺序阶段。阶段 1、2 和 4 是**阻塞的**:错误会产生退出代码 10,且不执行任何测试。阶段 5、6 和 7 是非阻塞的。
```
config.yaml + .env
|
v
Fase 1: Initialization — Legge e valida config.yaml, interpola segreti da env
|
v
Fase 2: OpenAPI Discovery — Scarica la spec, derefenzia $ref, costruisce la mappa endpoint
|
v
Fase 3: Context Construction — Crea i quattro oggetti di runtime
|
v
Fase 4: Test Discovery — Scopre i test dinamicamente, ordina per dipendenze (DAG),
| applica i filtri di priorita e strategia
v
Fase 5: Execution — Esegue ogni test in ordine topologico, raccoglie i TestResult
|
v
Fase 6: Teardown — Rimuove (best-effort) le risorse create durante i test
|
v
Fase 7: Report Generation — Serializza evidence.json, genera HTML e JSON di report
|
v
Outputs: assessment_report.html evidence.json apiguard_report.json
```
## 7. 领域与测试优先级
APIGuard 方法论将安全覆盖范围构建为 8 个主题领域和 4 个优先级:
| 领域 | 名称 | 当前已实现的测试 |
|---|---|---|
| 0 | API Discovery and Inventory Management | 0.1 Shadow API, 0.2 Deny by Default, 0.3 Deprecated API Enforcement |
| 1 | Identity and Authentication | 1.1 Authentication Required |
| 2 | Authorization and Access Control | — |
| 3 | Data Integrity | — |
| 4 | Availability and Resilience | — |
| 5 | Visibility and Auditing | — |
| 6 | Configuration and Hardening | — |
| 7 | Business Logic and Sensitive Flows | — |
| 优先级 | 标签 | 典型策略 | 描述 |
|---|---|---|---|
| P0 | Critical | BLACK_BOX | 基本的边界控制。当 `fail_fast: true` 时,P0 上的 FAIL 会中断整个评估 |
| P1 | High | GREY_BOX | 使用有效凭证的身份验证和授权保证 |
| P2 | Medium | GREY_BOX | 应用逻辑、数据完整性、可见性 |
| P3 | Low | WHITE_BOX | 通过 Gateway 的 Admin API 进行的配置审计 |
**`min_priority` 映射 -> 包含的测试:**
| `min_priority` | 包含的测试 |
|---|---|
| `0` | 仅 P0(纯 Black Box) |
| `1` | P0 + P1 |
| `2` | P0 + P1 + P2 |
| `3` | 所有 — P0 + P1 + P2 + P3(推荐默认值) |
**用于 E2E 测试中选择性过滤的 pytest 标记:**
```
pytest tests_e2e/ -m "p0 and domain_0" -v
pytest tests_e2e/ -m "black_box" -v
```
## 8. 退出代码
| 代码 | 含义 | 条件 |
|---|---|---|
| `0` | CLEAN — 未检测到违规 | 所有测试均产生 PASS 或 SKIP |
| `1` | FAIL — 至少违反了一项安全保证 | `ResultSet` 中至少包含一个 `TestResult(status=FAIL)` |
| `2` | ERROR — 至少有一项检查未完成 | 没有 FAIL,但至少包含一个 `TestResult(status=ERROR)` |
| `10` | INFRA — 基础设施错误 | `ConfigurationError`、`OpenAPILoadError`、`DAGCycleError` |
优先级为:**FAIL (1) > ERROR (2) > CLEAN (0)**。单个 FAIL 会覆盖任何数量的 ERROR。退出代码 10 表示评估未开始,且 `ResultSet` 不能作为任何安全判断的可靠依据。
## 9. 仓库结构
```
apiguard-assurance/
|-- config.yaml # Template di configurazione (versionabile)
|-- .env.example # Template variabili d'ambiente (non versionare .env)
|-- pyproject.toml # Metadati progetto, dipendenze, configurazione tool
|
|-- src/
| |-- cli.py # Entry point CLI (Typer)
| |-- engine.py # Orchestratore pipeline — 7 fasi sequenziali
| |
| |-- config/ # Fase 1: caricamento e validazione configurazione
| |-- core/ # Layer fondamentale — vocabolario e infrastruttura condivisa
| |-- discovery/ # Fase 2: parsing OpenAPI e costruzione AttackSurface
| |-- tests/ # Fase 5: implementazioni dei test per dominio
| `-- report/ # Fase 7: generazione HTML, JSON e aggregazione statistiche
|
|-- test-environments/
| `-- forgejo-kong/ # Docker Compose per l'ambiente di test locale
|
|-- tests_e2e/ # Suite E2E contro il target reale (richiede Docker stack)
`-- tests_integration/ # Suite di integrazione per i layer interni
```
*APIGuard Assurance v1.0.0 — MIT License*
标签:APIGuard, API安全网关, API网关, API网关绕过, CISA项目, DAST, JWT安全, OpenAPI, Python安全工具, REST API安全, Swagger, Web安全, 交互式HTML报告, 动态应用安全测试, 安全合规, 恶意软件分析, 毕业设计, 灰盒测试, 白盒测试, 网络代理, 自动化安全评估, 蓝队分析, 证据归档, 请求拦截, 软件开发, 逆向工具, 黑盒测试