Tech-Multiverse/crapi-llm-security-lab

GitHub: Tech-Multiverse/crapi-llm-security-lab

一个基于 OWASP crAPI 与 Ollama 的本地自托管红队实验室,用于实践 API 安全、LLM 越狱及 AI Agent 攻防演示。

Stars: 0 | Forks: 0

# crAPI-LLM Security Lab 一个用于 API 安全、LLM 应用安全和 Agentic AI 演示的本地化、可共享实验室。 它将 OWASP crAPI 易受攻击的 API 应用与 Ollama LLM(本地或远程)、基于 LangGraph 的聊天机器人/MCP 服务器、自定义 Python agent 以及带有流量分析的可选 API 网关结合在一起。 ## 用途 本实验室是一个用于学习和实践 API 安全、LLM 应用安全以及 Agentic AI 安全的本地化、可共享环境。它的目标是: - **可复现**:只需一个 `docker compose up` 命令即可启动 crAPI、agent、网关和演示 UI。 - **可扩展**:旨在添加 WAAP 引擎、集中式日志记录、LLM 防护栏以及更高级的 agent 工作流。 - **教学性**:直接映射到 OWASP API Security Top 10、OWASP LLM / AI 安全风险、WAAP 和运行时安全概念,以及 agent 与 API/工具的交互。 ## crAPI(develop 分支)提供的内容 OWASP crAPI 的 `develop` 分支包含: - 经典的 OWASP API Security Top 10 挑战(BOLA、BFLA、失效的身份认证、过度数据暴露、大规模赋值、速率限制、SSRF、NoSQL/SQL 注入、JWT 伪造、未授权访问)。 - 一个内置的 LLM 聊天机器人(`crapi-chatbot`),它使用 LangGraph 通过 OpenAPI 规范调用 crAPI API。 - 端口 `5500` 上的 MCP (Model Context Protocol) 服务器,将相同的 API 接口暴露为工具。 - 特定的 LLM 挑战 16–18:提示词注入、凭据提取和代表其他用户执行操作。 - 用于 SSRF 挑战的虚假外部网关服务(`api.mypremiumdealership.com`)。 ## 我们添加的内容 - 一个顶层 `docker-compose.yml`,它 `include`(包含)了 crAPI 的 compose 配置,并暴露了用于本地测试的直接服务端口。 - 一个根目录下的 `.env` 文件,将所有配置集中在一处;从 `.env.example` 复制它,并将其指向你的 Ollama 实例。 - 一个用于 Python agent 开发的 `crapi-llm` Miniconda 环境。 - 一个小补丁(`infrastructure/crapi-chatbot-patches/retriever_utils.py`),使 crAPI 的聊天机器人使用 `OllamaEmbeddings` 而不是 `OpenAIEmbeddings` 作为向量存储的后端,因为后者会发送 Ollama 的 OpenAI 兼容 `/v1/embeddings` 端点所拒绝的 token 数组。 - 一个 `agent/` 目录,包含一个通过 Ollama 驱动 crAPI 的自定义 Python agent。 - 一个 `gateway/` 目录,包含 Kong 网关、速率限制、WAF 风格的路径拦截、Prometheus 指标和 Grafana 仪表板。 - 一个 `ui/` 目录,包含 Vite + React 演示界面,此外还有 `scripts/`,内含一键攻击/防御场景脚本。 ## 架构 ``` Host workstation ├─ Docker Desktop │ └─ crAPI stack │ ├─ crapi-identity :8080 │ ├─ crapi-community :8087 │ ├─ crapi-workshop :8000 │ ├─ crapi-chatbot :5002 (chat) / :5500 (MCP) │ ├─ crapi-web :8888 │ ├─ postgres :5432 │ ├─ mongodb :27017 │ ├─ chromadb :8000 │ ├─ mailhog :8025 │ └─ api.mypremiumdealership.com │ ├─ Conda env `crapi-llm` ├─ agent/ Python demos ├─ gateway/ Kong + Prometheus + Grafana └─ ui/ Vite + React demo interface Ollama (local install, remote GPU box, or Docker) ├─ llama3.1:8b (chat / tool calling) └─ nomic-embed-text:latest (embeddings) ``` ## 网络拓扑 `docker-compose.yml` 使用 `include` 指令引入 `crapi/deploy/docker/docker-compose.yml`,然后覆盖选定的端口。 - Docker Compose 会创建一个名为 `crapi-llm_default` 的默认 bridge 网络。 - 在该网络内部,服务之间通过容器名称进行通信(例如 `crapi-chatbot` 调用 `http://crapi-identity:8080`)。 - 主机通过 `127.0.0.1` 访问已发布的服务: - `http://127.0.0.1:8888` crAPI Web UI - `http://127.0.0.1:8080` 身份服务 - `http://127.0.0.1:8087` 社区服务 - `http://127.0.0.1:8000` 研讨会服务 - `http://127.0.0.1:5002` 聊天机器人 API (`/chatbot/genai/ask`) - `http://127.0.0.1:5500` MCP 服务器 - `http://127.0.0.1:8025` MailHog UI - `http://127.0.0.1:3001` React 演示 UI (`crapi-ui`) - `http://127.0.0.1:8088` Kong 网关代理 - `http://127.0.0.1:13000` Grafana (admin/admin) - `http://127.0.0.1:19090` Prometheus - `crapi-chatbot` 容器会离开 Docker 网络去访问 Ollama,无论 Ollama 运行在哪里(本地主机、另一个容器或远程 GPU 机器)。 ## 环境要求 - macOS、Linux 或带有 WSL2 / Docker Desktop 的 Windows(已在基于 Intel / `x86_64` 架构的 macOS 上测试) - 正在运行的 Docker - Docker Compose v2.20+(根目录的 `docker-compose.yml` 使用了 `include`) - Miniconda(可选,用于本地 Python agent 开发) - Node.js / `nvm`(可选,用于 React UI 开发) - Docker 可访问的 Ollama。选项包括: - **本地安装** 在运行 Docker 的同一台机器上(支持 CPU 或 GPU) - **远程机器** (例如带有 GPU 的 Linux 主机)在同一网络内 - **带有 GPU 支持的 Docker**(可选,需要 `nvidia-container-toolkit`) ## 快速开始 1. 克隆此仓库: git clone crAPI-LLM cd crAPI-LLM 2. 克隆 crAPI 子模块: git clone --depth 1 --branch develop https://github.com/OWASP/crAPI.git crapi 3. 复制 `.env` 并将 crAPI 指向你的 Ollama 服务器: cp .env.example .env # 编辑 .env 并将 OLLAMA_HOST_IP 设置为 crAPI 容器可访问 Ollama 的 IP 或主机名 # (示例请参见下方的“将 crAPI 指向 Ollama”)。 4. 确保 Docker Desktop 正在运行,然后启动技术栈(这也会启动网关、Grafana 和 React UI): docker compose up -d 5. 验证: docker compose ps curl -s -o /dev/null -w "HTTP %{http_code}\n" http://127.0.0.1:8888 6. 在 `http://127.0.0.1:3001` 打开演示 UI。 7. 从命令行测试聊天机器人: curl -s -X POST http://127.0.0.1:5002/chatbot/genai/ask \ -H "Content-Type: application/json" \ -d '{"message":"hello"}' ## 将 crAPI 指向 Ollama 聊天机器人和 agent 使用 Ollama 在端口 `11434` 上暴露的 OpenAI 兼容端点。更新 `.env` 以便 crAPI 容器能够访问它。 常见设置: | Ollama 运行位置 | `OLLAMA_HOST_IP` 值 | 备注 | |---------------------|-------------------------|-------| | 与 Docker Desktop 同一主机 (macOS/Windows) | `host.docker.internal` | Docker Desktop 会将其解析为主机。 | | 同一主机,Linux Docker Engine | 主机的局域网 IP(例如 `192.168.1.42`)或 `172.17.0.1` | 在 Linux Docker Engine 上 `host.docker.internal` 不是自动的。 | | 远程 GPU 机器 / 另一台机器 | 其 IP(例如 `192.168.1.50`) | 防火墙必须允许来自 Docker 主机的 TCP `11434` 端口。 | 例如,对于远程 GPU 机器: ``` OLLAMA_HOST_IP=192.168.1.50 CHATBOT_OPENAI_BASE_URL=http://${OLLAMA_HOST_IP}:11434/v1/ ``` 对于在 Docker Desktop macOS/Windows 上的本地 Ollama: ``` OLLAMA_HOST_IP=host.docker.internal CHATBOT_OPENAI_BASE_URL=http://${OLLAMA_HOST_IP}:11434/v1/ ``` 对于运行在主机上(非 Docker 中)的 agent,你也可以导出: ``` export OLLAMA_BASE_URL=http://${OLLAMA_HOST_IP}:11434/v1 ``` 编辑 `.env` 后,重建聊天机器人容器: ``` docker compose up -d ``` ## Ollama 设置 这些说明适用于 Linux、macOS 或 Windows(带有 WSL2 / Docker)。它们假设你希望将所有内容保持自托管;不需要第三方 LLM API 账户。 ### 1. 安装 Ollama 请按照适用于你的操作系统的官方指南进行操作: ``` # macOS / Linux curl -fsSL https://ollama.com/install.sh | sh # Windows:使用来自 https://ollama.com/download/windows 的安装程序 # 或在 WSL2 内部运行,使用与 Linux 相同的命令。 ``` ### 2. 拉取模型 适用于 8 GB GPU 或 CPU 主机的推荐模型: ``` ollama pull llama3.1:8b ollama pull nomic-embed-text:latest ``` ### 3. 将 Ollama 暴露给网络 默认情况下,Ollama 仅监听 `127.0.0.1:11434`。如果你在 Docker 中运行 crAPI,容器需要访问它,因此请绑定到所有网络接口: ``` OLLAMA_HOST=0.0.0.0 ollama serve ``` 在 Windows 命令提示符中: ``` set OLLAMA_HOST=0.0.0.0 ollama serve ``` 在 Windows PowerShell 中: ``` $env:OLLAMA_HOST="0.0.0.0" ollama serve ``` 如果 Ollama 在远程机器上,请确保主机防火墙允许来自 Docker 主机子网的入站 TCP `11434` 流量。 ### 4. 可选:将模型存储在不同的驱动器上 在 Windows 上: ``` set OLLAMA_MODELS=D:\OllamaModels ``` 在 Linux / WSL2 上: ``` export OLLAMA_MODELS=/mnt/d/OllamaModels ``` ## 测试过的配置 本仓库是基于以下环境开发的: - 一台运行 Docker Desktop 的 Mac 主机 - 一台独立的、带有 NVIDIA GPU 并运行 Ollama(`llama3.1:8b` 和 `nomic-embed-text:latest`)的 Linux 机器 - 该 Mac 通过局域网访问位于 `http://192.168.4.55:11434/v1` 的 Ollama 任何 Docker 可以访问到你在 `.env` 中填写的 URL 对应的 Ollama 的设置,都应该能以相同的方式工作。 ## 为什么需要 `retriever_utils.py` 补丁? crAPI 的聊天机器人被硬编码为对 `openai` 提供程序使用 `OpenAIEmbeddings`。`OpenAIEmbeddings` 使用 `tiktoken` 对文本进行分词,并将 token ID 数组发送到 `/v1/embeddings`。Ollama 的 OpenAI 兼容端点期望接收字符串,因此它会返回 `invalid input type`。 `infrastructure/crapi-chatbot-patches/retriever_utils.py` 中的补丁会在设置了非默认 `CHATBOT_OPENAI_BASE_URL` 时改用 `OllamaEmbeddings`,并且它会被挂载覆盖 `crapi-chatbot` 容器中的 `/app/chatbot/retriever_utils.py`。 ## React 演示 UI 和场景脚本 一个 Vite + React UI 被打包为 `crapi-ui` 容器,并在端口 `3001` 上提供服务: - **聊天机器人** 标签页 — 通过 Ollama 与 crAPI 聊天机器人对话。 - **API 浏览器** 标签页 — 直接向 crAPI 端点发送请求。 - **场景** 标签页 — 一键重放攻击/防御演示(速率限制 DoS、SSRF 拦截、提示词注入、NoSQL 优惠券注入)。 在 `docker compose up -d` 之后打开 `http://127.0.0.1:3001`。 命令行等效脚本位于 `scripts/` 中: ``` ./scripts/rate-limit-demo.sh ./scripts/ssrf-blocked-demo.sh ./scripts/prompt-injection-demo.sh ./scripts/agent-demo.sh ``` ## 路线图和未来计划 有关完整的阶段计划,请参阅 `ROADMAP.md`。 crAPI 为我们提供了易受攻击的 API 和内置的 LLM 聊天机器人。本仓库使用由 Ollama 提供支持的 agent、带有指标的 Kong 网关以及 React 演示 UI 对其进行了扩展。未来可能添加的内容: 1. **WAAP / ModSecurity / open-appsec** 用真正的 WAAP 引擎和 OWASP CRS 规则替换或增强简单的 Kong 路径拦截。 2. **集中式日志分析** 添加 Loki、Vector 或 ClickHouse,以收集用于取证重放的请求/响应体和 agent 日志。 3. **LLM 防护栏** 尝试输入/输出过滤、提示词注入检测和工具调用确认 UI。 4. **高级 Agentic 演示** 多步骤 agent 攻击、自主发现以及 agent 到 agent 的工作流。 5. **刷新文档** 持续将新的挑战和缓解措施映射到 OWASP API Security、OWASP LLM / AI 安全风险以及 NIST AI RMF。 ## 项目结构 ``` crAPI-LLM/ ├── .env # Docker Compose environment ├── docker-compose.yml # includes crAPI + port overrides + patch mount ├── README.md # this file ├── agent/ # custom Python agent demos ├── docs/ # write-ups and challenge mapping ├── gateway/ # Kong + Prometheus + Grafana configs ├── scripts/ # one-click attack/defense scenario scripts ├── infrastructure/ # support files for the lab │ └── crapi-chatbot-patches/ │ └── retriever_utils.py # Ollama embedding fix ├── ui/ # Vite + React demo interface └── crapi/ # cloned OWASP crAPI (develop branch) ``` ## 常用命令 ``` # 查看所有正在运行的 crAPI 服务 docker compose ps # 查看 chatbot 日志 docker compose logs -f crapi-chatbot # 停止所有操作 docker compose down # 停止并删除 data volumes(破坏性操作) docker compose down -v # 直接测试 chatbot curl -s -X POST http://127.0.0.1:5002/chatbot/genai/ask \ -H "Content-Type: application/json" \ -d '{"message":"hello"}' # 从 Docker 主机测试 Ollama curl http://${OLLAMA_HOST_IP}:11434/api/tags ``` ## 许可证 本项目结构和文档仅用于教育和演示目的。crAPI 本身基于 Apache 2.0 许可。
标签:AI风险缓解, API安全, CISA项目, JSON输出, LangGraph, LLM评估, Ollama, 安全测试靶场, 数据展示, 红队, 自定义请求头, 请求拦截, 逆向工具