mamun39/SecureRAGPipeline
GitHub: mamun39/SecureRAGPipeline
这是一个具备安全意识的检索增强生成(RAG)原型,通过分层控制实现了从数据摄取、检索策略到输出筛选的全流程安全防护与审计。
Stars: 0 | Forks: 0
# SecureRAGPipeline






一个具有安全意识的检索增强生成(RAG)原型,使用 FastAPI、Inngest、Qdrant、OpenAI 和 Streamlit 构建。
它展示了在摄取、检索、prompt 上下文组装、输出处理和审计日志记录中的分层控制,现在还包括基于 Promptfoo 的对抗性评估,并根据观察到的失败进行有针对性的加固。它仍然是一个交互式原型,而非加固的生产安全边界。
更多文档:
- [安全架构](docs/security-architecture.md)
- [运行时图](docs/runtime-diagrams.md)
- [路线图](docs/roadmap.md)
## 本项目演示内容
- 使用 `allow`(允许)、`review`(审查)和 `quarantine`(隔离)决策的摄取扫描
- 在 embedding 和索引之前的隔离执行
- 基于演示角色和分类策略的元数据驱动检索控制
- 将检索到的文本视为不受信任证据的安全上下文构建
- 针对明显的类机密和敏感模式的输出筛选
- 跨管道的结构化审计日志记录
- 基于观察到的失败进行有针对性加固的 Promptfoo 对抗性评估
## 安全评估
本项目包括针对本地 `POST /api/query` 端点的基于 Promptfoo 的对抗性评估。
当前套件涵盖:
- 间接 prompt 注入
- 检索授权
- 敏感数据泄露和输出筛选
这些套件用于暴露具体弱点,并推动共享查询和输出筛选路径中的有针对性加固。
| Suite | Initial Result | Current Result |
|---|---:|---:|
| Prompt injection | 6/6 | 6/6 |
| Retrieval authz | 5/7 | 7/7 |
| Data leakage | 5/7 | 7/7 |
- 拒绝响应正在回显敏感的请求措辞,而不是使用中立的拒绝
- 内部类 token 字符串和机密标记短语正在最终答案中被镜像回显
- 最终答案中需要更强地抑制隐藏指令和披露措辞
- 当请求的分类在允许的证据中不可用时,查询路径需要弃权检查
### 如何运行评估
Promptfoo 文件位于 [evals/promptfoo/](evals/promptfoo/) 下。
```
npx promptfoo@latest eval -c evals/promptfoo/promptfooconfig.yaml
npx promptfoo@latest eval --no-cache -c evals/promptfoo/scenarios/prompt_injection.yaml
npx promptfoo@latest eval --no-cache -c evals/promptfoo/scenarios/retrieval_authz.yaml
npx promptfoo@latest eval --no-cache -c evals/promptfoo/scenarios/data_leakage.yaml
```
验证最近的代码更改时使用 `--no-cache`,以免过时的 Promptfoo 结果掩盖当前行为。
## 安全管道
| Stage | Current Control | Current Behavior | Current Limitation |
|---|---|---|---|
| Upload | 本地文件保存 + 审计日志 | 上传的 PDF 保存在 `uploads/` 下并记录日志 | 无恶意软件扫描或解析器隔离 |
| Ingestion scan | 基于短语的可疑内容扫描 | 返回 `score`、`flags` 和 `allow` / `review` / `quarantine` | 可能遗漏恶意内容或过度标记良性文本 |
| Quarantine | Pre-embedding 执行 | `quarantine` 文档不会被 embedding 或存储在 Qdrant 中 | 无单独的审查 UI 或持久的隔离存储 |
| Metadata | 安全感知的 chunk 载荷 | Chunks 携带文档/chunk ID、租户、所有者、分类、信任度、决策、哈希、时间戳 | 大多数值仍使用演示默认值 |
| Retrieval policy | 应用层元数据过滤器 | 按租户、分类允许列表、非隔离状态和可选源进行过滤 | 无真实身份验证或服务器信任的身份 |
| Safe context | 上下文过滤 + 不受信任文本指令 | 在 prompt 组装之前排除隔离和标记/审查的 chunks | 启发式且保守,而非细致入微 |
| Output filter | 简单的答案筛选 | 阻止明显的类机密输出和受限外观的转储;编辑一些简单的敏感模式 | 仅启发式;非稳健的 DLP |
| Audit logging | 结构化本地日志 | 记录上传、扫描、隔离、检索策略、检索摘要和输出筛选决策 | 仅本地日志;非持久或防篡改 |
有关控制放置和当前行为的更多详细信息,请参阅 [安全架构](docs/security-architecture.md)。
## 快速开始
### 要求
- Python 3.14+
- Qdrant 在本地运行于 `http://localhost:6333`
- OpenAI API key
- 用于本地开发的 Inngest dev server
### 安装
```
py -m venv .venv
.venv\Scripts\activate
.venv\Scripts\python.exe -m pip install -e .
```
使用 `uv`:
```
uv sync
```
### 环境变量
在项目根目录中创建 `.env` 文件:
```
OPENAI_API_KEY=your_openai_api_key
INNGEST_API_BASE=http://127.0.0.1:8288/v1
```
### 运行服务
启动 FastAPI/Inngest 应用:
```
.venv\Scripts\uvicorn secureragpipeline.app.inngest_app:app --reload
```
或使用 `uv`:
```
uv run python -m uvicorn secureragpipeline.app.inngest_app:app --reload
```
启动 Inngest dev server:
```
npx --ignore-scripts=false inngest-cli@latest dev -u http://127.0.0.1:8000/api/inngest --no-discovery
```
启动 Streamlit:
```
.venv\Scripts\streamlit run src/secureragpipeline/app/streamlit_app.py
```
或使用 `uv`:
```
uv run streamlit run src/secureragpipeline/app/streamlit_app.py
```
### 查询 API
```
curl -X POST http://127.0.0.1:8000/api/query `
-H "Content-Type: application/json" `
-d "{\"question\":\"Who owns the document?\",\"role\":\"employee\",\"tenant_id\":\"demo\",\"source_id\":null}"
```
## 测试
首选:
```
.venv\Scripts\python.exe -m unittest discover -s tests -t . -p "test_*.py"
```
使用 `uv`:
```
uv run python -m unittest discover -s tests -t . -p "test_*.py"
```
## 项目结构
- [src/secureragpipeline/app/](src/secureragpipeline/app): 入口点和 UI
- [src/secureragpipeline/workflows/](src/secureragpipeline/workflows): 摄取和查询编排
- [src/secureragpipeline/ingestion/](src/secureragpipeline/ingestion): PDF 加载和 embeddings
- [src/secureragpipeline/security/](src/secureragpipeline/security): 扫描、策略、筛选和审计
- [src/secureragpipeline/storage/](src/secureragpipeline/storage): Qdrant 访问
- [src/secureragpipeline/models/](src/secureragpipeline/models): 载荷和结果模型
- [tests/](tests): 单元和集成覆盖
## 演示默认值
| Field | Default |
|---|---|
| `tenant_id` | `demo` |
| `owner_id` | `local_user` |
| `classification` | `internal` |
| `trust_level` | `user_uploaded` |
| `review` handling | 仍然被摄取 |
| `quarantine` handling | 在 embedding/upsert 之前被阻止 |
## 角色访问映射
| Role | Allowed classifications |
|---|---|
| `public` | `public` |
| `employee` | `public`, `internal` |
| `manager` | `public`, `internal`, `confidential` |
| `admin` | `public`, `internal`, `confidential`, `restricted` |
## 试用
1. 上传 PDF 并分配 `classification` 和 `trust_level`。
2. 通过 UI 或 `POST /api/query` 以不同角色提出相同问题。
3. 检查答案、检索跟踪、文档元数据和审计事件。
详细的运行时图位于 [运行时图](docs/runtime-diagrams.md)。较低级别的控制放置和安全行为在 [安全架构](docs/security-architecture.md) 中描述。
## 故障排除
- `ImportError: attempted relative import with no known parent package`
确保在使用包原生命令之前已通过 `pip install -e .` 安装项目。
- Streamlit 启动但未返回答案
确保 FastAPI 应用、Inngest dev server 和 Qdrant 都在运行。
- `public` 角色未返回上下文
新上传默认为 `classification="internal"`,因此 `public` 无法检索它们。
- 摄取似乎成功但文档不可搜索
检查文档是否在日志中被标记为 `quarantine`。
## 局限性
当前系统应被视为具有安全意识的演示,而非加固的安全 RAG 平台。
- UI 中的角色选择仅用于演示,不支持真实身份验证
- 租户和所有者元数据仍使用演示默认值,分类/信任值由用户选择而非受信任
- 摄取扫描基于短语,可能遗漏恶意内容或过度标记良性内容
- 安全上下文处理当前会丢弃审查标记的 chunks,而不是应用细致的风险评分
- 输出筛选是启发式的,可能遗漏机密或过度阻止良性内容
- 当前的对抗性覆盖仍然仅限于几个重点套件,而非广泛的安全基准
- 系统不隔离文档解析、沙箱模型执行或验证文档来源
- 审计日志是本地进程日志,并非防篡改
- 现有的安全层降低了明显风险,但它们中的任何一个或组合在一起都不应被视为安全的保证
## 未来工作
未来工作包括真实身份验证、受信任的服务器端元数据、更强的摄取控制、更细致的上下文和输出处理、持久的审计存储以及更广泛的对抗性评估覆盖。完整的分阶段计划位于 [路线图](docs/roadmap.md) 中。
## 致谢
本项目灵感来源于并致谢 [ProductionGradeRAGPythonApp](https://github.com/techwithtim/ProductionGradeRAGPythonApp)。
## 许可证
本项目根据 [MIT License](LICENSE) 获得许可。
## 注意事项
- `.env`、`.venv`、本地缓存和 `qdrant_storage/` 通过 [.gitignore](.gitignore) 被 Git 忽略
- 如果在添加 `.gitignore` 之前提交了机密信息,则必须单独从 Git 历史记录中将其删除
标签:AI安全, API开发, AV绕过, Chat Copilot, DLL 劫持, FastAPI, Inngest, Kubernetes, OpenAI, Promptfoo, Prompt注入, Python, Qdrant, RAG, Streamlit, Streamlit, 元数据过滤, 内存规避, 原型演示, 向量数据库, 大语言模型, 安全架构, 审计日志, 对抗性评估, 对抗攻击, 摄入过滤, 敏感信息检测, 数据泄露防护, 无后门, 检索增强生成, 网络探测, 访问控制, 访问控制, 输入扫描, 输出审查, 逆向工具, 隔离机制