11. 安全与权限¶
Agent 安全不是一句“不要做坏事”的 prompt。你需要在 Tool、Memory、MCP、Workflow 和部署层都设置边界。
风险从哪里来¶
常见风险:
- Prompt injection:用户要求模型忽略系统规则。
- Tool 越权:模型调用了本不该调用的工具。
- 数据泄露:工具返回敏感字段,被模型写进回答。
- Memory 污染:错误或恶意信息被长期记住。
- MCP 供应链风险:外部 MCP server 暴露了高风险工具。
- 不可逆操作:模型直接执行发信、支付、删除、提交等动作。
Tool 权限分级¶
| 等级 | 示例 | 建议 |
|---|---|---|
| 只读 | 查询天气、搜索公开文档 | 可直接执行,但要限流 |
| 内部读 | 查询用户订单、CRM | 需要鉴权和字段脱敏 |
| 可逆写 | 创建草稿、保存偏好 | 记录审计日志 |
| 不可逆写 | 发邮件、付款、删除 | 必须人工审批 |
Tool 的 schema 不是权限系统。权限必须在服务端执行逻辑里检查。
不要信任模型传参¶
即使 Tool 有 schema,也不能假设参数业务合法。
execute: async ({ orderId }, context) => {
const userId = context?.requestContext?.get('userId')
if (!userId) {
throw new Error('Missing user context')
}
// 服务端检查这个 orderId 是否属于 userId
// 不要只因为模型传了 orderId 就执行操作
}
Memory 安全¶
Memory 的风险很隐蔽。错误记忆会在后续请求里持续影响模型。
建议:
- 不把敏感凭据写入 Memory。
- 用户可查看和删除自己的长期记忆。
- 高风险事实不要只靠模型写入,先经过规则或人工确认。
- 多租户系统严格隔离
resource。 - thread id 不要被客户端任意猜测或复用。
MCP 安全¶
连接外部 MCP server 时:
- 只连接可信来源。
- 明确 allowed tools。
- 对写操作启用 approval。
- 不在代码里硬编码 token。
- 多租户场景用 per-user credential,不共享全局高权限 token。
暴露自己的 MCP Server 时:
- 对外部访问加认证。
- 给工具添加 MCP annotations,说明是否只读、是否破坏性、是否幂等。
- 不暴露内部调试工具。
- 给每个 tool 做审计。
Prompt 只是最后一道软约束¶
你仍然应该写清楚 instructions:
但真正的安全边界应在代码里:
- Tool 权限检查。
- Human-in-the-loop。
- 请求上下文校验。
- 输出过滤。
- 日志脱敏。
- 数据库行级权限。
上线前安全清单¶
- 所有 Tool 标注只读或写操作。
- 写操作有服务端权限检查。
- 不可逆操作有人审。
- Memory 不保存密钥和敏感隐私。
- MCP 外部服务来源可信。
- 日志和 traces 不泄露 token。
- prompt injection 有测试用例。
- 每次工具调用都有审计记录。