site logo

Marico's space

构建安全的本地 AI Agent:基于 SGLang、Olares 与真实安全审计的经验

AI技术与应用 2026-07-29 17:34:57 5

最近在给客户搭建本地大语言模型(LLM)推理服务时,被问到一个经典问题:"模型跑在自己服务器上,数据不就不会泄露了吗?"这话听起来没毛病,但实际上,本地部署只是把风险边界从网络层挪到了提示词(Prompt)接口层。配置不当的本地 LLM 栈,可能同时面临提示词注入、工具滥用、对抗性推理攻击等威胁。

这篇聊点干货,拆解一下用 SGLang(高性能 LLM 推理引擎)和 Olares(本地 AI 编排与安全框架)构建安全 AI Agent 的架构思路,结合我们做过的一些渗透测试和代码审计经验,给出一套可落地的生产部署模式。

本地 LLM 的安全威胁图谱

先说个反直觉的事实:模型跑在本地,不代表就安全。大多数企业的 Threat Model(威胁模型)还停留在传统的网络边界防御,但对 LLM 应用来说,信任边界已经转移到了 Prompt 接口层面。

  1. 提示词注入(Prompt Injection): 恶意构造的输入可以覆盖系统指令,让模型执行非预期操作。
  2. 工具滥用(Tool Use Exploitation): 如果 LLM 有权限调用外部 API、数据库或文件系统,攻击者可以通过构造特定 Prompt 诱使模型执行任意命令。
  3. 上下文数据泄露(Data Leakage via Context): 上下文窗口(Context Window)中暂存的敏感信息,可能通过对抗性查询被提取出来。
  4. 模型投毒(Model Poisoning): 如果你在本地做模型微调(Fine-tuning),训练数据的完整性直接决定了模型的安全性。

组件解析:SGLang

SGLang 是什么

SGLang(Structured Generation Language)是个开源的 LLM 推理引擎,由普林斯顿大学数据系统实验室开发,擅长高吞吐量服务和复杂结构化输出(JSON、正则、程序化输出)。

安全影响

SGLang 的架构在安全上有几个值得关注的点:

  • 结构化输出强制(Structured Output Enforcement): SGLang 支持定义严格的输出 Schema,强制 LLM 输出有效 JSON 或符合特定正则表达式。这是一个关键的安全控制手段——输出不符合 Schema 就直接拒绝,不会流入下游系统。
  • RadixAttention 缓存: 这个优化机制会缓存相似 Prompt 的前缀以提升性能。但问题在于,敏感上下文也可能被意外缓存。如果上下文窗口管理不严格,可能导致历史敏感交互泄露。
  • 自定义后端支持: SGLang 支持接入私有 VPC 中的自定义后端,灵活性是有了,但配置复杂度上升,攻击面也随之扩大。

代码示例:SGLang 安全结构化输出

import sglang as sgl
import json # Define a structured output schema for a financial analyst agent
@sgl.function
def financial_analysis(s, query): s += sgl.user("Analyze the following financial data: " + query) s += sgl.assistant( sgl.gen("analysis", stop=["</analysis>"], max_new_tokens=500, # Enforce JSON structure to prevent arbitrary text injection
 regex=r"\{\s*\"summary\":\s*\"[^\"]*\"\s*\}\" ) ) # Initialize the engine
engine = sgl.Engine(model_path="meta-llama/Meta-Llama-3-8B-Instruct") # Run the function
state = engine.run(financial_analysis, query="Revenue increased by 20%.") # Validate and parse output
try: result = json.loads(state.text()) print("Secure Output:", result)
except json.JSONDecodeError: print("Rejected: Output did not match schema")

组件解析:Olares

Olares 是什么

Olares 是个专注于本地 AI 编排的框架,在安全性和隐私保护上下了不少功夫。它提供了 AI Agent 管理、工具执行处理、本地环境安全策略强制执行等能力。

安全影响

Olares 针对几个关键安全挑战给出了解决方案:

  • 沙箱工具执行(Sandboxed Tool Execution): Olares 支持定义在隔离环境中运行的工具,防止 LLM 在宿主机上执行任意代码。
  • 策略强制(Policy Enforcement): 可以根据用户角色或数据敏感度,限制 Agent 只能访问特定工具。
  • 审计日志(Audit Logging): 详细记录 Agent 的所有操作,这在安全事件事后溯源时非常关键。

架构:Olares 安全层

Olares 作为中间件,位于 LLM 推理引擎(如 SGLang)和外部工具之间。它拦截 LLM 的工具调用请求,在执行前与安全策略进行校验。

# Pseudocode for Olares security policy enforcement
from olares import Agent, PolicyEngine policy = PolicyEngine(rules=[ "DENY file_system_write", "ALLOW database_read", "ALLOW internet_request if domain in whitelisted_domains"
]) agent = Agent( model_path="local-llama-3-8b", tools=["db_query", "web_search"], policy_engine=policy
) # This call would be blocked by the policy engine
agent.run("Write 'malicious' to /etc/passwd")

真实安全审计:踩过的坑

过去一年多,我们对多个本地 AI Agent 部署项目做了内部和外部安全审计,几个高频踩坑点分享出来:

1. 上下文窗口信息泄露

问题: 很多开发者习惯把用户敏感个人信息( PII,Personally Identifiable Information)直接塞进上下文窗口,以为这样能让模型"更懂"用户。实际上这些数据会一直留在内存里,通过精心构造的对抗性 Prompt 就能提取出来。

解法: 用 RAG(检索增强生成)配合严格的访问控制。如果必须把 PII 放上下文,要做差分隐私或用合成数据。

2. 工具调用幻觉

问题: LLM 会产生工具输入幻觉——看似合理的参数组合实际上是非法的或危险的。攻击者可以构造特定 Prompt,诱使模型用错误参数调用工具。

解法: 所有工具输入必须用严格 Schema 校验。借助 SGLang 的结构化输出特性,强制工具调用必须符合有效 JSON 格式。对于高风险操作,加上"人工确认"环节。

3. 模型逆向攻击

问题: 即使用本地模型,攻击者仍可能通过大量查询进行推理攻击(Inference Attack),在特定条件下提取训练数据或模型记忆。

解法: 接入限流和异常检测,定期审计模型输出是否出现数据泄露迹象。考虑给模型加数字水印(Watermarking)。

生产级部署架构

综合以上分析,安全的本地 AI Agent 推荐架构如下:

  1. 隔离: LLM 推理引擎(SGLang)和编排层(Olares)分容器部署,避免单点沦陷。
  2. 网络分段: LLM 服务不直接暴露到互联网,用 Nginx 或 Traefik 做反向代理,内部通信强制 mTLS。
  3. 策略强制: 工具调用必须经过 Olares 策略引擎校验。
  4. 审计日志: 所有 Prompt、响应、工具调用写入不可篡改的日志存储。
  5. 监控告警: 监控 Token 使用量和 Prompt 内容的异常模式。

Docker Compose 配置

version: '3.8'
services: sglang-engine: image: lmsysorg/sglang:latest ports: - "30000:30000" environment: - MODEL_PATH=/models/meta-llama-3-8b volumes: - ./models:/models networks: - ai-network olares-agent: image: olares/agent:latest ports: - "8000:8000" environment: - SGLANG_ENDPOINT=http://sglang-engine:30000 - POLICY_FILE=/etc/olares/policy.json volumes: - ./policy.json:/etc/olares/policy.json networks: - ai-network networks: ai-network: driver: bridge

安全实践清单

  • 定期更新: SGLang 和 Olares 保持最新版本,及时修补已知漏洞。
  • 输入净化: 所有用户输入在传入 LLM 前必须做净化处理。
  • 输出校验: LLM 输出在进入下游系统前,必须用严格 Schema 校验。
  • 访问控制: 严格控制谁能与 AI Agent 交互,基于角色和数据进行权限细分。
  • 数据最小化: 只给 LLM 提供完成当前任务所必需的最少数据。

总结

构建安全的本地 AI Agent,核心不在于选哪个模型,而在于围绕模型构建一套完整的安全架构。SGLang 提供高性能的结构化推理能力,Olares 提供安全优先的编排层,两者配合能搭建出相当健壮的本地 AI 系统。

但工具只是起点。持续的安全审计、严格的策略执行、对 LLM 特有漏洞的深度理解,才是保障生产环境安全的关键。

常见问题

Q:SGLang 和 vLLM 比,本地部署哪个更快?
A:对于结构化生成和复杂路由任务,SGLang 通常更快,RadixAttention 和结构化输出是它的优势。对于简单文本生成,vLLM 也有竞争力。建议针对自己的实际场景跑个 Benchmark。

Q:本地 LLM 如何防止提示词注入?
A:用结构化输出强制(如 JSON Schema)限制 LLM 的输出格式;做好输入净化;用 Olares 这类策略引擎校验工具调用。

Q:Olares 只能配合 Llama 模型用吗?
A:不是。Olares 是模型无关的,只要 LLM 能通过兼容接口暴露(如 SGLang、vLLM、Ollama),都可以接入。