lameiro0x/osint-veil

GitHub: lameiro0x/osint-veil

一个本地隐私代理网关,在 OSINT/安全审计工具与 Claude API 之间对敏感数据和标识符进行自动匿名化处理,确保只有脱敏文本被发送到云端。

Stars: 0 | Forks: 0

# osint-veil 这是一个本地的隐私网关,部署在你的 OSINT/CTI 工具与 Claude 的 API 之间。它接收 prompt 或工具的输出结果,**检测敏感信息,对标识符进行匿名化/化名替换,移除机密数据**,将映射关系在本地(加密)保存,并且**仅向 Claude 发送安全版本的数据**。 **从这里开始:** [`docs/VISION.md`](docs/VISION.md)(它是什么以及为什么有用,包含示例) · [`docs/DESIGN.md`](docs/DESIGN.md)(架构与不变式)。 ## 1. 它是什么 专为配合 Claude 进行 pentesting / OSINT 而设计(例如,从 OpenOSINT 或其他支持 OpenAI 兼容 endpoint 的工具中使用)。目标是实现**最大程度的隐私保护**:确保不向 API 或任何其他地方泄露有关客户端、主机或 pentester 的任何信息。 关于模型训练:**Anthropic 的 API 不会使用通过 API 发送的数据进行训练**(标准保留策略;可通过向 Anthropic 申请实现零保留)。尽管如此,这个 proxy 更进一步,只发送已经过匿名化处理的文本,且不包含任何用户元数据。 ## 2. 架构 ``` herramienta OSINT / script │ (formato OpenAI chat completions) ▼ ┌───────────────────────────────────────────┐ │ Privacy Proxy (FastAPI, 127.0.0.1:8000) │ │ │ │ 1. auth local (Bearer) │ │ 2. sanitizer: │ │ - elimina secretos → SECRET_REMOVED │ │ - tokeniza ids → EMAIL_001 ... │ │ 3. storage cifrado por case_id (Fernet) │ │ 4. convierte OpenAI → Anthropic Messages │ └───────────────┬────────────────────────────┘ │ solo texto anonimizado ▼ api.anthropic.com (Claude) ``` 模块 (`proxy/`): | 文件 | 职责 | | ------------------ | ------------------------------------------------------ | | `config.py` | 从 `.env` 读取 settings 及各案例的 config (YAML/JSON)。 | | `sanitizer.py` | 移除机密数据 + 确定性 token 化。 | | `storage.py` | 按 `case_id` 存储的 mappings 和 audit log,支持可选加密。| | `claude_client.py` | OpenAI → Anthropic Messages API,无元数据。 | | `app.py` | FastAPI Endpoints。 | | `keygen.py` | `python -m proxy.keygen` 生成加密密钥。 | ## 3. 安装 ``` python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt ``` ## 4. 配置 `.env` ``` cp .env.example .env # 生成加密密钥并将其粘贴到 PROXY_ENCRYPTION_KEY python -m proxy.keygen ``` | 变量 | 用途 | | --------------------- | ------------------------------------------------------------ | | `ANTHROPIC_API_KEY` | 你的 Anthropic 密钥(仅在调用 Claude 时使用)。 | | `ANTHROPIC_BASE_URL` | `https://api.anthropic.com`。 | | `ANTHROPIC_MODEL` | 默认模型(`claude-sonnet-4-6`;你也可以使用 opus)。 | | `PROXY_LOCAL_API_KEY` | Proxy 在 `Authorization: Bearer ...` 中要求的密钥。 | | `PROXY_CASE_ID` | 如果请求未发送 `case_id`,则使用的默认案例。 | | `PROXY_STORAGE_PATH` | mappings/logs 文件夹(已加入 gitignore)。 | | `PROXY_ENCRYPTION_KEY`| 用于加密本地存储的 Fernet 密钥。 | | `PROXY_MODE` | `strict`(默认)、`balanced` 或 `reporting`。 | | `PROXY_CASES_PATH` | 包含各案例 YAML/JSON 的文件夹。 | ### 各案例配置 创建 `cases/.yaml`(参见 `cases/cliente_a_2026.yaml`): ``` case_id: cliente_a_2026 provider: claude model: claude-sonnet-4-6 mode: strict rehydrate_output: false sensitive_domains: - cliente.com - cliente.local sensitive_keywords: - vpn - intranet - payroll ``` ## 5. 如何启动 ``` ./run.sh # 或: uvicorn proxy.app:app --host 127.0.0.1 --port 8000 ``` ## 6. 测试 `/health` ``` curl http://127.0.0.1:8000/health # {"status":"ok"} ``` ## 7. 测试 `/privacy/sanitize` ``` curl -X POST http://127.0.0.1:8000/privacy/sanitize \ -H "Authorization: Bearer change-me" \ -H "Content-Type: application/json" \ -d '{ "case_id": "cliente_a_2026", "text": "El email juan.perez@cliente.com aparece en vpn.cliente.com con token ghp_xxxxxxxxx" }' ``` 响应: ``` { "sanitized_text": "El email EMAIL_001 aparece en SUBDOMAIN_001 con token SECRET_REMOVED", "findings": [ {"type": "GITHUB_TOKEN", "replacement": "SECRET_REMOVED"}, {"type": "EMAIL", "token": "EMAIL_001"}, {"type": "SUBDOMAIN", "token": "SUBDOMAIN_001"} ] } ``` ## 8. 作为 OpenAI 兼容 endpoint 使用 将你的工具指向 `http://127.0.0.1:8000/v1`,并使用 `PROXY_LOCAL_API_KEY` 作为 API key。 ``` export OPENAI_BASE_URL=http://127.0.0.1:8000/v1 export OPENAI_API_KEY=change-me ``` 直接调用: ``` curl -X POST http://127.0.0.1:8000/v1/chat/completions \ -H "Authorization: Bearer change-me" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-6", "case_id": "cliente_a_2026", "messages": [ {"role": "system", "content": "Eres un analista de seguridad"}, {"role": "user", "content": "Analiza estos hallazgos: admin@cliente.com en 10.0.0.5"} ], "max_tokens": 2000 }' ``` Proxy 会对消息进行 sanitize,仅使用 tokens 调用 Claude,并返回 OpenAI 格式(`choices[].message.content`)的响应。 ### `dry-run` 模式(不调用 Claude) 添加 `"dry_run": true` 可查看哪些内容会被过滤,而无需消耗 API 调用: ``` curl -X POST http://127.0.0.1:8000/v1/chat/completions \ -H "Authorization: Bearer change-me" -H "Content-Type: application/json" \ -d '{"case_id":"cliente_a_2026","dry_run":true, "messages":[{"role":"user","content":"admin@cliente.com en 10.0.0.5"}]}' ``` ### 其他 endpoints | Endpoint | 用途 | | ------------------------------------- | ---------------------------------------------------- | | `POST /privacy/sanitize` | 对文本进行匿名化处理,并返回 findings 和标注。 | | `POST /privacy/rehydrate` | 将 tokens 还原为原值(仅在允许的情况下)。 | | `GET /privacy/mappings/{case_id}` | 案例的 Mappings(仅在本地)。 | | `GET /privacy/audit-log/{case_id}` | 记录哪些类型被过滤及其次数。 | | `GET /privacy/review-queue/{case_id}` | 高相关性的发现(非阻塞式审查)。 | | `POST /osint/run` | 启动安全且自主的 OSINT(client-side 循环)。 | | `GET /osint/report/{case_id}` | Markdown 报告(`?rehydrate=true` 仅限本地)。 | ## CLI(推荐的审计用法) ``` # 对目标进行安全且自主的 OSint;将重构报告写入 LOCAL python -m proxy.cli audit --case cliente_a_2026 --target cliente.com # 重新生成案例报告(使用 --anon 以保留 tokens) python -m proxy.cli report --case cliente_a_2026 # 查看审查队列(高相关性发现) python -m proxy.cli review --case cliente_a_2026 ``` 集成的 OSINT 工具都是被动的,且不需要外部二进制文件(`dns_resolve`, `http_headers`)。你可以通过在 `proxy/gateway.py` 中注册一个 `ToolSpec` 来添加你自己的工具(amass, nmap 等)。 ## Egress control(在生产环境中是强制性的) 软件层(`proxy/egress.py`)会阻止工具直接访问 Anthropic,但**真正的保障是在网络层**:运行 `deploy/egress_lockdown.sh` 以确保只有 proxy 进程能够与 API 通信。如果没有这一步,外部二进制文件可能会打开自己的 socket。 模式 (`PROXY_EGRESS`): | 模式 | 自主 OSINT 的行为 | | --------- | ---------------------------------------------------------------- | | `off` | 不检查任何内容。 | | `warn` | 在日志中警告 egress 未被强制执行(默认)。 | | `enforce` | **拒绝启动**,除非确认网络锁定已生效(`PROXY_EGRESS_LOCKED=1`,由部署脚本 / Docker 设置)。 | 生产环境建议:`PROXY_EGRESS=enforce` + `deploy/egress_lockdown.sh`。 ## 9. 模式 | 模式 | 行为 | | ----------- | ---------------------------------------------------------------------- | | `strict` | 对**所有**标识符进行 Token 化(包括域名和公网 IP)。默认选项。非常适合真实审计场景。 | | `balanced` | 移除机密数据,并对 emails/内部 IP 进行 token 化,但允许**未**标记为敏感的域名和公网 IP 通过。 | | `reporting` | 类似于 `balanced`,并在设置了 `rehydrate_output: true` 时允许对输出进行 rehydrate。 | ## 10. 检测内容 **机密数据(将被移除,绝不存储):** `sk-`, `ghp_`, `github_pat_`, `gho_/ghs_/ghu_`, `AKIA…`, JWT (`eyJ…`), `Authorization: Bearer …`, `Cookie:` / `Set-Cookie:`, `client_secret=`, `password=`, `passwd=`, `access_token=`, `refresh_token=`, PEM 私钥 (`BEGIN … PRIVATE KEY`)。 **标识符(将被 Token 化,并附带相关性提示):** email → `EMAIL_001`, 域名 → `DOMAIN_001`,子域名 → `SUBDOMAIN_001`,内部 IP → `INTERNAL_IP_001`,公网 IP → `PUBLIC_IP_001`,存储库 → `REPO_001`,私有 URL → `URL_001`,GUID → `APP_ID_001`/`TENANT_ID_001`(取决于上下文),服务账户 → `SERVICE_ACCOUNT_001`,人员 → `PERSON_001`,内部路径 → `PATH_001`,案例关键词 → `KEYWORD_001`。 ## 11. 测试 ``` pytest -q ``` 覆盖范围包括:emails、敏感域名和内部 IP 的 token 化;移除 GitHub tokens、JWTs 和 Bearer;确认机密数据**不会**存储在 mappings 中;确认同一个 email 在同一个案例中保持相同的 token;确认不同案例具有独立的 mappings;确认 `/privacy/sanitize` 工作正常;静态加密。 ## 12. 限制 - **人员姓名**:检测能力有限。会对其在案例 config 的 `sensitive_names` 中列出的姓名进行 token 化,如果你安装了 spaCy 及其模型(`pip install spacy && python -m spacy download es_core_news_sm`),也可以通过自动 NER 识别(**可选**依赖,如果存在则自动激活)。未安装 spaCy 时,仅识别已知姓名。不过,**服务账户**确实会被检测到(`svc_*`, `DOMINIO\\usuario`, `*$` 等) → `SERVICE_ACCOUNT_001`。 - **Tenant ID vs App ID**:两者均为 GUIDs。系统通过**上下文**进行区分(例如附近有 `app`/`client_id` 等词汇 → `APP_ID`,否则为 `TENANT_ID`)。这是一种启发式方法,并非万无一失。 - **`DOMAIN` vs `SUBDOMAIN`** 的区分取决于标签数量(≥3 = subdomain),而不是基于复合 TLDs(如 `co.uk`),因此某些类似 `ejemplo.co.uk` 可能会被标记为 subdomain。 - Sanitization 是基于 **regex** 的,而非语义识别:未涵盖格式的敏感数据可能会漏网。在审计前,请务必在 `dry-run` 模式下进行检查。 - OpenAI→Anthropic 转换支持包含文本内容的 `system`/`user`/`assistant`。暂不支持 tool-calls 和图像(**TODO**)。 ## 13. 残余风险 - **Regex 的假阴性**:格式异常的标识符可能会被发送给 Claude。请使用 `dry-run` 并扩充 `sensitive_keywords`/`sensitive_domains`。 - **Mappings = 敏感数据**:`proxy_data/` 包含真实数值(如果配置了 `PROXY_ENCRYPTION_KEY` 则为加密形式)。请妥善保护它,切勿上传至 git(已在 `.gitignore` 中排除)。如果没有加密密钥,数据将以明文形式保存。 - **Rehydrate**:将 tokens 还原为真实数值。仅在设置了 `rehydrate_output: true` 或 `force=true` 时允许,且绝不应用于发送给 Claude 的内容 —— 仅用于本地的最终报告响应。 - **Proxy 本地密钥**:任何拥有 `PROXY_LOCAL_API_KEY` 的人都可以使用该 proxy 并读取 mappings。请修改默认值,不要共享。 - **信任但要验证**:该 proxy 极大地减少了泄露面,但检查发送内容的最终责任仍在于 pentester。
标签:AI安全网关, AV绕过, ESC4, FastAPI, OSINT, 数据脱敏, 本地代理, 网络安全, 逆向工具, 隐私保护