安全、合规与治理:Agent 上线前必做的系统性防护清单
开篇:为什么 Agent 比普通聊天更危险
普通聊天模型的问题通常是"答得不准"。
而 Agent 系统多了两件会放大风险的能力:
- Tool Calling(能执行):一旦越权,影响可能是资金/数据/权限层面的事故
- RAG(能检索):一旦检索越界或提示注入,可能导致敏感信息泄露
所以 Agent 的安全治理必须同时覆盖:
- 输入层:用户和外部内容是如何注入指令的
- 检索层:检索到的内容是否越权、是否被污染
- 执行层:工具调用是否遵守权限与参数约束
- 输出层:模型是否可能泄露、是否会输出可被利用的敏感内容
- 运营层:审计、回放、红队与合规保留
一、Agent 安全威胁模型(你需要先分清威胁类型)
为了便于治理,建议把风险按"攻击面"分类,而不是按感觉分类。
Attack Surface
Prompt/输入注入
RAG/检索污染与越权
Tool Calling/工具滥用
Output/泄露与可利用信息
Ops/审计缺失与无法回放
下面逐一展开。
二、Prompt Injection:最常见也最容易被低估的风险
2.1 直观定义
Prompt Injection 是攻击者通过"用户输入或外部文本内容"诱导模型改变原有指令目标,从而绕过安全策略。
2.2 两类典型注入
- 直接注入:用户直接要求模型忽略系统指令,输出敏感数据或调用高权限工具
- 间接注入:攻击者把恶意指令埋在文档片段、网页内容、FAQ 中,然后通过 RAG 被检索到
2.3 工程治理要点
Prompt Injection 的关键结论是:
不能依赖"Prompt 不会被注入",必须依赖"执行层有确定性策略"。
你可以从四层加固:
- 输入层:对高风险意图做规则识别与拦截
- 检索层:对可疑文档片段做内容过滤或隔离
- 执行层:工具调用必须以权限为准(非模型文本)
- 输出层:敏感信息脱敏与拒答策略
三、Tool Abuse(工具滥用/越权调用)
Agent 最危险的点不是模型"会瞎说",而是模型"可能会做不该做的事"。
3.1 常见越权路径
- 模型根据"看起来合理的指令"选择工具
- 工具参数未校验导致 IDOR(越权读取/修改)
- 重试导致重复执行(写操作未幂等)
- 工具执行缺少审计与风控,事故不可追责
3.2 治理策略:Tool Gateway 必须是权限的唯一真相
建议你把权限判断放到工具网关(Tool Gateway)执行层,永远不要"相信模型会不会误调用"。
权限判断应当由规则/策略引擎完成,工具执行只接受"已校验通过"的请求。
四、数据泄露:从 RAG 到日志的全链路审计
数据泄露并不只发生在最终回答里,还可能发生在:
- 检索结果进入 Prompt 前后
- 中间日志记录(prompt dump、检索片段日志)
- 回放系统(Replay)保存明文
- 报错堆栈(stack trace 含敏感字段)
所以治理要覆盖:
- 检索越权:只能取用户有权限的文档片段
- 输出脱敏:输出前按策略掩码
- 日志脱敏:至少对 PII/密钥进行清洗
- 存储策略:保留周期、加密、可删除
五、系统安全架构建议(可直接照着落)
是
否
用户输入
Input Guard: 注入检测/意图识别/敏感拦截
RAG: 权限过滤 + 内容净化
Context Builder: 只拼可信证据
LLM Gateway: 策略约束 + 输出结构化
Output Guard: 脱敏/拒答/敏感检测
需要工具?
Tool Gateway: 权限/参数校验/幂等/审计
审计日志 + 回放数据(脱敏)
你会发现安全模块并不是"再加一个过滤器",而是把不确定性收敛到确定性控制点:
- Tool Gateway 的权限是真相
- RAG 的权限是真相
- 输出 Guard 的脱敏是真相
六、工程代码示例:工具执行的最小安全实现
下面是一个偏工程化的工具执行器示例(Python 伪实战)。
python
from dataclasses import dataclass
from typing import Dict, Any, Optional
TOOL_WHITELIST = {"create_ticket", "query_order"}
@dataclass
class UserContext:
user_id: str
tenant_id: str
role: str
class PolicyEngine:
def allow(self, ctx: UserContext, tool_name: str, args: Dict[str, Any]) -> bool:
# 示例:按角色控制工具
if tool_name not in TOOL_WHITELIST:
return False
if tool_name == "create_ticket" and ctx.role not in {"customer", "support"}:
return False
# 示例:按参数校验租户隔离
if "tenant_id" in args and args["tenant_id"] != ctx.tenant_id:
return False
return True
def execute_tool_safely(ctx: UserContext, tool_name: str, args: Dict[str, Any], trace_id: str):
# 1) 工具存在性
if tool_name not in TOOL_WHITELIST:
return {"ok": False, "error": {"code": "TOOL_FORBIDDEN"}}
# 2) 权限校验(以策略为准,不信模型)
policy = PolicyEngine()
if not policy.allow(ctx, tool_name, args):
return {"ok": False, "error": {"code": "TOOL_FORBIDDEN"}}
# 3) 参数校验(Schema + 业务规则)
# validate_args(tool_name, args) # 这里省略具体实现
# 4) 幂等(写操作必须有 idempotency_key)
# result = invoke_with_idempotency(...)
# 5) 执行与审计
result = invoke_tool(tool_name, args, trace_id=trace_id)
write_audit_log(ctx, tool_name, args, result, trace_id=trace_id)
return {"ok": True, "data": result}
这段代码体现三条底线:
- 工具白名单:决定"能不能调用"
- PolicyEngine:决定"调用是否符合权限与租户隔离"
- 审计日志:决定"事故发生后能不能回放与追责"
七、输出治理:拒答、脱敏与结构化强约束
7.1 输出拒答策略
对于以下情况建议触发拒答,而不是让模型"猜一个保守答案":
- 明确请求敏感数据(密钥、证件号、内部口令)
- 用户要求执行高风险动作但未授权
- RAG 越权或检索证据不足
拒答的好处是:你把不可控问题变成可预期策略。
7.2 脱敏策略
脱敏应在输出 Guard 内完成,并尽量做到:
- 规则脱敏优先(正则/字典/字段级)
- LLM 生成之前尽量避免把敏感原文拼进上下文
- 记录日志时输出脱敏版本
八、RAG 安全:越权过滤和检索净化
RAG 安全的两大问题:
- 检索越权:把不该给用户看的文档拿出来
- 检索污染:文档片段里藏了注入指令
8.1 权限过滤(必须做)
- 每个 chunk 都带
access_scope - 检索阶段只返回允许范围内的 chunk
8.2 内容净化(建议做)
- 对疑似注入片段做标记或降权
- 可选:对检索片段启用"安全净化 prompt"(注意:净化不能代替权限校验)
九、合规与数据治理(企业场景不可跳)
你需要把 Agent 当成数据系统来做治理:
9.1 数据最小化
- 存储最少必要字段
- 回放数据脱敏后保存
9.2 保留周期与可删除
- 明确日志/记忆/回放保存周期
- 提供删除接口(尤其是个人信息)
9.3 加密与访问控制
- 传输加密(TLS)
- 存储加密(KMS/密钥管理)
- 内部访问需审计
十、红队与安全评估:用样本逼出漏洞
只写规则不做验证,安全只是"希望"。建议建立红队评估集:
- Prompt Injection 样本(直接/间接)
- 工具参数越权样本(IDOR)
- 敏感信息请求样本(证件号/密钥/内部制度)
- RAG 注入样本(把恶意指令伪装成"文档内容")
评估指标:
- 越权调用成功率(应接近 0)
- 注入成功率(应接近 0)
- 敏感信息泄露率(应接近 0)
- 拒答率与可用性折中(宁可拒答也不能越权)
十一、上线 Checklist(安全合规专项)
输入与检索
- 识别高风险请求(注入/越权/敏感信息)
- RAG 具备权限过滤(chunk 级 scope)
- 具备检索污染应对策略(降权/隔离/标记)
工具执行
- 工具白名单已启用
- 权限与租户隔离在 Tool Gateway 校验(不依赖模型)
- 参数校验 Schema + 业务规则
- 写操作幂等已实现
- 审计日志全链路可回放(脱敏后)
输出与日志
- 输出 Guard 脱敏与拒答策略上线
- prompt/检索片段/中间结果日志脱敏
- 回放系统保存脱敏版本并设置保留周期
合规
- 用户删除请求可执行(删除/失效记忆与回放数据)
- 数据访问有审计与权限控制
- 敏感字段加密与密钥管理到位
结语
Agent 的安全不是"加几个过滤词",而是系统工程:
- 权限必须在执行层落地
- 检索必须做权限过滤
- 脱敏必须在输出与日志层闭环
- 回放与审计必须可用可追责
只要你把不确定性收敛到确定性策略点,Agent 才能真正上线而不是"赌运气"。
下一篇预告
下一篇进入运营维度:
《性能与成本优化:Token 治理、多模型路由与高并发策略》
我们会重点讲:
- Token 成本怎么拆解与治理
- 小模型/大模型怎么路由
- 缓存、批处理与并发控制怎么做