构建安全 AI 代理是代理框架和应用程序开发人员之间的共同责任。 代理框架提供构建基块(抽象、提供程序和业务流程),但开发人员负责验证输入、保护数据流,以及为方案适当配置工具。
本文概述了使用 Agent Framework 构建安全代理的最佳做法。
了解信任边界
代理运行时,数据流经多个组件:用户输入、聊天历史记录提供程序、上下文提供程序、LLM 服务和函数工具。 数据进入或退出应用程序的每个边界都表示潜在的攻击面。
要考虑的关键信任边界:
- AI 服务 - 接收聊天消息(可能包括 PII 和系统说明),并返回 LLM 生成的输出。
- 聊天历史记录存储 — 提供程序可以通过外部存储加载和保留聊天消息。
- 上下文服务 - 上下文服务 提供程序可以从外部服务(记忆、用户配置文件、RAG 结果)中检索或存储数据。
- 工具访问的服务 - 函数工具执行开发人员提供的代码,这些代码可以调用外部 API 或数据库。
所有外部服务通信由开发人员选择的客户端 SDK 处理。 代理框架不管理这些服务的身份验证、加密或连接详细信息。
最佳做法
验证函数输入
AI 可以调用你作为工具提供的任何函数,并选择参数。 将 LLM 提供的参数视为不受信任的输入,类似于 Web API 中的用户输入。
-
使用允许列表 - 根据已知良好值验证输入,而不是尝试筛选已知错误的模式。 例如,检查文件路径是否在允许的目录中,而不是检查
..遍历序列。 - 强制实施类型和范围约束 — 验证参数是否属于预期类型和可接受的范围(数值边界、字符串长度限制、日期范围)。
- 限制字符串长度 - 对字符串参数强制实施最大长度,以防止资源耗尽或注入攻击。
- 防止路径遍历 — 当函数接受文件路径时,将其解析为绝对路径,并验证它们是否位于允许的目录中。
- 使用参数化查询 — 如果在 SQL 查询、shell 命令或其他解释器上下文中使用参数,则应使用参数化查询或转义,而绝不使用字符串串联。
要求批准高风险工具
默认情况下,在未经用户批准的情况下调用提供给代理的所有工具。 使用 工具审批 机制来控制人工确认背后的高风险操作。
确定哪些工具需要审批时,请考虑:
- 副作用 — 修改数据、发送通信、进行购买或具有其他副作用的工具通常需要批准。
- 数据敏感度 - 访问或返回敏感数据的工具(PII、财务数据、凭据)需要批准。
- 可逆性 — 不可逆的操作(删除、发送电子邮件)的风险高于只读查询。
- 影响范围 — 具有广泛影响(批量操作)的工具需要比范围较窄的工具更加仔细地审查。
确保系统消息由开发人员控制
聊天消息携带一个角色(system、user、assistant、tool),该角色决定 AI 服务如何解释这些消息。 了解这些角色至关重要:
| 角色 | 信任级别 |
|---|---|
system |
最高信任 - 直接塑造 LLM 行为。 不得包含不受信任的输入。 |
user |
不受信任 — 可能包含提示注入尝试或恶意内容。 |
assistant |
不受信任 — 由 LLM 生成,这是一个外部系统。 |
tool |
不受信任的 — 可能包含来自外部系统或用户影响的内容的数据。 |
不要将最终用户的输入信息放入 system-role 消息中。 代理框架将非类型化文本默认为 user 角色,但在以编程方式构造消息时要小心。
Vet 扩展提供程序
上下文提供程序 和 历史记录提供程序 可以注入任何角色的消息,包括 system。 只连接你信任的提供商。
请注意 间接提示注入:如果基础数据存储遭到入侵,对抗内容可能会影响 LLM 行为。 例如,通过 RAG 检索的文档可能包含隐藏指令,导致 LLM 偏离预期行为,或通过工具调用外泄数据。
验证并清理 LLM 输出
LLM 响应应被视为不受信任的输出。 AI 服务是代理框架无法控制的外部终结点。 请注意:
- 幻觉 — LLM 可能会生成合理的但事实不正确的信息。 请勿在未经验证的情况下将 LLM 输出视为权威输出。
- 间接提示注入 - 工具、上下文数据提供者或聊天历史记录提供者检索的数据可能包含旨在对抗或影响 LLM 的内容。
- 恶意有效负载 - 如果未经清理呈现或执行,LLM 输出可能包含有害内容(用于 XSS 的 HTML/JavaScript、用于注入的 SQL、shell 命令)。
在 HTML 中呈现 LLM 输出、将其作为代码执行、在数据库查询中使用它或将其传递给任何安全敏感上下文之前,请始终验证和清理 LLM 输出。
保护日志中的敏感数据
Agent Framework 支持通过 OpenTelemetry 进行日志记录和遥测。 仅当显式启用时才会记录敏感数据:
-
日志记录——在日志级别为
Trace时,会记录整个ChatMessages集合。 这可以包括个人身份信息(PII)。Trace该级别不应在生产环境中启用。 -
遥测 - 当设置
EnableSensitiveData时,遥测包括聊天消息的完整文本,包括函数调用和结果。 请勿在生产环境中启用此功能。
保护会话数据
会话(AgentSession)表示会话上下文,可以序列化以实现数据持久存储。 将序列化会话视为敏感数据:
- 会话可以引用会话内容或会话标识符。
- 从不受信任的来源恢复会话相当于接受不受信任的输入。 受损的存储后端可能会更改角色以提升信任。
- 使用适当的访问控制和加密,在安全存储中保存会话。
实现资源限制
代理框架不会对输入/输出长度或请求速率施加约束,因为它不知道方案合理的原因。 你负责:
- 输入长度限制 - 限制输入长度以防止上下文溢出或 DoS 攻击。
-
输出长度限制 - 使用服务提供的限制(例如,
MaxOutputTokens在聊天选项中)。 - 速率限制 - 使用速率限制 设施来防止并发请求的成本溢出和滥用。