访问控制策略

📎 引用文件

本文引用的文件 - agent/src/api/security.py - agent/src/api/auth_routes.py - agent/src/tools/__init__.py - agent/src/channels/utils.py - agent/src/security/scanner.py - agent/src/security/network.py - agent/src/security/workspace_access.py - agent/src/security/workspace_policy.py - agent/src/live/audit.py - agent/src/live/halt.py - agent/src/config/limits.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与可扩展性
  8. 故障排查指南
  9. 结论
  10. 附录:配置示例与安全实施清单

简介

本文件为 Vibe-Trading 的访问控制策略提供系统化文档,覆盖工作区策略管理、网络访问控制、资源隔离机制、基于角色的访问控制(RBAC)、API 端点权限管理、工具调用限制、沙箱执行环境、文件系统访问控制、网络请求白名单、动态权限检查、审计日志记录与违规检测机制。同时给出可操作的配置示例、权限模型设计思路与安全策略落地指南,并总结常见场景的最佳实践。

项目结构

Vibe-Trading 的安全与访问控制能力分布在以下模块: - API 鉴权与安全头:负责跨域、DNS 重绑定防护、安全响应头、SSE 票据、API Key 认证、本地回环信任等。 - 工具注册与调用限制:通过工具注册表实现工具级白名单、Shell 工具开关、MCP 远程工具集成与过滤。 - 网络访问控制:统一校验 URL 目标、禁止私有/内网/多播地址、可选允许严格受限的回环目标。 - 工作区路径隔离:确保文件路径位于允许的工作区根目录下。 - 提示注入扫描与内容净化:对外部内容进行提示注入模式扫描与控制令牌中和。 - 实时交易审计与熔断:对真实资金操作进行不可变审计记录,支持全局/分券商熔断。 - 运行时限制:统一截断工具结果大小,避免过大输出影响下游处理。

graph TB A["客户端/浏览器"] --> B["FastAPI 应用<br/>安全中间件"] B --> C["API 鉴权<br/>CORS/DNS 重绑定/安全头"] B --> D["工具注册表<br/>工具白名单/Shell 开关/MCP"] B --> E["网络访问控制<br/>URL 校验/私有地址拦截"] B --> F["工作区路径隔离<br/>路径在允许根内"] B --> G["提示注入扫描<br/>控制令牌中和"] B --> H["实时审计与熔断<br/>不可变审计/全局熔断"] B --> I["运行时限制<br/>结果截断"]

图表来源 - agent/src/api/security.py:166-253 - agent/src/tools/__init__.py:66-245 - agent/src/channels/utils.py:97-180 - agent/src/security/scanner.py:145-220 - agent/src/live/audit.py:248-352 - agent/src/config/limits.py:22-49

章节来源 - agent/src/api/security.py:1-670 - agent/src/tools/__init__.py:1-365 - agent/src/channels/utils.py:1-180 - agent/src/security/scanner.py:1-264 - agent/src/live/audit.py:1-352 - agent/src/config/limits.py:1-49

核心组件

章节来源 - agent/src/api/security.py:69-158 - agent/src/api/security.py:166-253 - agent/src/api/security.py:347-504 - agent/src/tools/__init__.py:66-245 - agent/src/channels/utils.py:97-180 - agent/src/security/workspace_access.py:1-15 - agent/src/security/workspace_policy.py:1-12 - agent/src/security/scanner.py:145-220 - agent/src/live/audit.py:248-352 - agent/src/live/halt.py:1-34 - agent/src/config/limits.py:22-49

架构总览

下图展示从客户端到后端各安全组件的交互流程,包括鉴权、工具调用、网络访问控制、工作区隔离、提示注入扫描、审计与熔断。

sequenceDiagram participant Client as "客户端" participant API as "FastAPI 应用" participant Auth as "鉴权与安全头" participant Tools as "工具注册表" participant Net as "网络访问控制" participant FS as "工作区路径隔离" participant Scan as "提示注入扫描" participant Audit as "实时审计" participant Halt as "熔断检查" Client->>API : "HTTP 请求" API->>Auth : "CORS/DNS 重绑定/安全头" Auth-->>API : "通过或拒绝" API->>Tools : "构建/过滤工具集" Tools-->>API : "可用工具列表" API->>Net : "校验 URL 目标" Net-->>API : "允许/拒绝" API->>FS : "校验路径在工作区内" FS-->>API : "允许/拒绝" API->>Scan : "扫描外部内容" Scan-->>API : "返回警告/净化后内容" API->>Halt : "检查熔断标志" Halt-->>API : "允许/阻止" API->>Audit : "记录实时动作" Audit-->>Client : "事件/响应"

图表来源 - agent/src/api/security.py:166-253 - agent/src/tools/__init__.py:66-245 - agent/src/channels/utils.py:97-180 - agent/src/security/workspace_access.py:1-15 - agent/src/security/scanner.py:145-220 - agent/src/live/audit.py:248-352 - agent/src/live/halt.py:1-34

详细组件分析

API 鉴权与安全头

flowchart TD Start(["请求进入"]) --> CheckCORS["解析并校验 CORS 来源"] CheckCORS --> DNSGuard{"是否本地回环且 Host 可信?"} DNSGuard --> |否| Deny403["返回 403 拒绝"] DNSGuard --> |是| SecHeaders["附加安全响应头"] SecHeaders --> SSETicket{"是否 SSE 连接?"} SSETicket --> |是| ValidateTicket["校验一次性票据"] SSETicket --> |否| APIKey["校验 API Key"] ValidateTicket --> Allow["放行"] APIKey --> Allow Deny403 --> End(["结束"]) Allow --> End

图表来源 - agent/src/api/security.py:69-158 - agent/src/api/security.py:166-253 - agent/src/api/security.py:300-341 - agent/src/api/security.py:347-504

章节来源 - agent/src/api/security.py:69-158 - agent/src/api/security.py:166-253 - agent/src/api/security.py:300-341 - agent/src/api/security.py:347-504 - agent/src/api/auth_routes.py:21-56

工具注册与调用限制

classDiagram class ToolRegistry { +register(tool) +get(name) +tool_names } class BuildRegistry { +build_registry(...) +build_filtered_registry(...) +build_swarm_registry(...) } class LiveBrokerGate { +is_live_broker(server_name, url) +should_register_live_channel(interactive, url, cache_dir) +wrap_live_broker_tools(server_name, wrappers, url) } BuildRegistry --> ToolRegistry : "创建/过滤" BuildRegistry --> LiveBrokerGate : "授权/包装"

图表来源 - agent/src/tools/__init__.py:66-245

章节来源 - agent/src/tools/__init__.py:66-245

网络访问控制

flowchart TD In(["输入 URL"]) --> Parse["解析 scheme/netloc"] Parse --> SchemeOK{"scheme 为 http/https?"} SchemeOK --> |否| Reject["拒绝"] SchemeOK --> |是| Resolve["解析主机名到 IP"] Resolve --> Loopback{"allow_loopback 且全为回环?"} Loopback --> |是| AllowLB["允许回环"] Loopback --> |否| PrivateCheck{"是否存在私有/内网/多播地址?"} PrivateCheck --> |是| Reject PrivateCheck --> |否| Allow["允许"]

图表来源 - agent/src/channels/utils.py:97-180

章节来源 - agent/src/channels/utils.py:97-180 - agent/src/security/network.py:1-11

工作区路径隔离

flowchart TD PathIn(["传入路径"]) --> RootIn(["工作区根目录"]) PathIn --> Resolve["规范化路径"] RootIn --> ResolveRoot["规范化根目录"] Resolve --> Relative["计算相对路径"] ResolveRoot --> Relative Relative --> Within{"是否在根内?"} Within --> |是| AllowPath["允许访问"] Within --> |否| DenyPath["拒绝访问"]

图表来源 - agent/src/channels/utils.py:44-50 - agent/src/security/workspace_policy.py:1-12 - agent/src/security/workspace_access.py:1-15

章节来源 - agent/src/channels/utils.py:44-50 - agent/src/security/workspace_policy.py:1-12 - agent/src/security/workspace_access.py:1-15

提示注入扫描与内容净化

flowchart TD Input(["外部文本"]) --> Scan["扫描提示注入模式"] Scan --> Findings{"发现风险?"} Findings --> |是| Neutralize["中和控制令牌"] Findings --> |否| Return["返回原内容"] Neutralize --> Annotate["附加安全警告"] Annotate --> Output["返回净化后内容+警告"] Return --> Output

图表来源 - agent/src/security/scanner.py:145-220

章节来源 - agent/src/security/scanner.py:145-220

实时审计与熔断

sequenceDiagram participant Agent as "代理" participant Gate as "执行门控" participant Audit as "审计记录" participant Halt as "熔断检查" Agent->>Gate : "准备下单" Gate->>Halt : "检查全局/分券商 HALT" Halt-->>Gate : "允许/阻止" Gate->>Audit : "记录动作(脱敏)" Audit-->>Agent : "返回审计ID/状态"

图表来源 - agent/src/live/audit.py:248-352 - agent/src/live/halt.py:1-34

章节来源 - agent/src/live/audit.py:248-352 - agent/src/live/halt.py:1-34

运行时限制

章节来源 - agent/src/config/limits.py:22-49

依赖关系分析

graph TB Security["API 鉴权"] --> Config["配置读取"] Security --> Session["会话主体"] Tools["工具注册"] --> Discovery["子类发现"] Tools --> MCP["MCP 集成"] Tools --> LiveBroker["Live Broker 授权"] Network["网络访问控制"] --> Socket["Socket/IP 解析"] Scanner["提示注入扫描"] --> Text["文本处理"] Audit["审计记录"] --> Redact["脱敏工具"] Halt["熔断检查"] --> FS["文件系统"]

图表来源 - agent/src/api/security.py:1-670 - agent/src/tools/__init__.py:1-365 - agent/src/channels/utils.py:1-180 - agent/src/security/scanner.py:1-264 - agent/src/live/audit.py:1-352 - agent/src/live/halt.py:1-34

章节来源 - agent/src/api/security.py:1-670 - agent/src/tools/__init__.py:1-365 - agent/src/channels/utils.py:1-180 - agent/src/security/scanner.py:1-264 - agent/src/live/audit.py:1-352 - agent/src/live/halt.py:1-34

性能与可扩展性

[本节提供通用指导,无需特定文件分析]

故障排查指南

章节来源 - agent/src/api/security.py:166-253 - agent/src/api/security.py:347-504 - agent/src/channels/utils.py:97-180 - agent/src/security/workspace_access.py:1-15 - agent/src/security/scanner.py:145-220 - agent/src/live/audit.py:248-352 - agent/src/live/halt.py:1-34

结论

Vibe-Trading 的访问控制体系以 API 鉴权为核心,结合工具白名单、网络访问控制、工作区路径隔离、提示注入扫描、实时审计与熔断机制,形成多层次安全防护。通过可配置的 CORS、CSP、SSE 票据与 API Key,既保障开发便利又满足生产安全需求。建议在生产环境中始终启用 API Key、严格限制 CORS、启用安全头、开启审计与熔断,并定期审查工具白名单与 MCP 配置。

[本节为总结,无需特定文件分析]

附录:配置示例与安全实施清单

[本节为通用指导,无需特定文件分析]