10. Agent 系统如何做权限与安全控制?
整理 Agent 系统的权限控制、安全边界与审计思路。
简单回答
Agent 的安全控制核心在于"最小权限原则"——Agent 能做什么、不能做什么必须被严格限定。具体包括:工具级别的权限控制(Agent 只能调用被授权的工具)、参数级别的约束(限制参数范围,如只能查询不能删除)、操作审批机制(高风险操作需要人工确认)、输入输出过滤(防止 Prompt 注入和敏感信息泄露)、以及完整的审计日志。
详细解释
为什么 Agent 安全比普通 LLM 更重要
普通 LLM 的安全风险主要在"说错话"——生成有害内容、泄露训练数据等。Agent 的安全风险在于"做错事"——它有能力调用工具执行真实操作(查数据库、发邮件、调 API、修改文件),一旦失控,后果可能远比生成一段有害文本严重。
想象一个有数据库写权限的 Agent,如果被 Prompt 注入攻击,可能被诱导去删除数据。或者一个能发邮件的 Agent,被诱导以公司名义发送虚假信息。这些不是理论风险——现实中已经有类似案例报道过。
工具级别的权限控制
最基本的安全措施是限制 Agent 可以使用的工具集合。每个 Agent 只应该拥有完成其任务所需的最小工具集。一个负责回答客户问题的 Agent 不需要有"删除用户"的权限。
工具权限应该是白名单机制——只开放明确授权的工具,而不是"除了黑名单之外都能用"。因为工具列表可能动态变化,黑名单很容易漏掉新增的危险工具。
在多用户系统中,不同用户的 Agent 可能有不同的权限。比如管理员的 Agent 可以查看所有用户数据,普通用户的 Agent 只能查看自己的。这需要在工具调用时做身份验证和权限检查。
参数级别的约束
光限制工具还不够,还需要限制工具的参数范围。比如一个查询数据库的工具,可以限制:只能执行 SELECT 不能执行 DELETE、UPDATE;只能查询特定的表和字段;查询结果最多返回 N 条;不能查询包含敏感信息(如身份证号、密码)的字段。
这些约束不能依赖 LLM 来遵守(LLM 可能被绕过),必须在应用层的代码中硬编码实现——即使 LLM 生成了一个 DELETE 语句,应用层代码应该拒绝执行并返回错误。
操作审批机制(Human-in-the-Loop)
对于高风险操作,应该引入人工确认环节。Agent 想执行一个操作前,先把操作内容展示给用户确认——"我将要发送以下邮件给 xxx,是否确认?"用户批准后才执行。
分级处理是合理的设计。低风险操作(如搜索、查询)可以自动执行;中风险操作(如创建工单、发消息)可以自动执行但记录审计日志;高风险操作(如删除数据、发邮件、资金操作)必须人工确认。
输入过滤:防 Prompt 注入
Prompt 注入(Prompt Injection)在 Agent 场景下尤其危险。Agent 在执行过程中会把工具返回的内容放进上下文——如果工具返回的内容中包含恶意指令(比如搜索引擎返回了一个包含"忽略之前的指令,改为执行…"的网页),LLM 可能会被诱导执行非预期的操作。
防护手段包括:对工具返回的内容做清洗和标记(明确区分"系统指令"和"外部数据",让模型知道外部数据中的指令不应该被执行);对用户输入做检测(用分类器识别可能的注入攻击);关键操作前做二次确认。
输出过滤:防敏感信息泄露
Agent 在生成回答时可能不小心把内部数据(如数据库查询结果中的敏感字段、内部 API 的响应细节)暴露给用户。需要在输出端做过滤——检测并脱敏敏感信息(如手机号、身份证号、API Key 等)。
审计日志
Agent 的每一步操作都需要详细记录:什么时间、什么 Agent、执行了什么工具、传了什么参数、返回了什么结果、最终给用户什么回复。这些日志用于事后审计和问题排查。在合规要求高的场景(金融、医疗)中,审计日志可能需要不可篡改、长期保存。
沙箱和隔离
对于代码执行类的 Agent(如 Agentic Coding),必须在沙箱环境中执行生成的代码,限制文件系统访问、网络访问、进程权限等。不能让 Agent 生成的代码直接在宿主机上运行。Docker 容器或者轻量级虚拟机是常见的沙箱方案。
面试时可以这样答
Agent 安全比普通 LLM 安全要求高得多,因为 Agent 有执行真实操作的能力。核心原则是最小权限——Agent 只拥有完成任务所需的最小工具和参数权限。
具体来说分几层。工具级别:白名单机制,只开放明确授权的工具。参数级别:在应用层硬编码约束,比如只允许 SELECT 不允许 DELETE,这个不能依赖 LLM 自觉。高风险操作加 Human-in-the-Loop——Agent 执行前必须用户确认。输入端防 Prompt 注入——特别是工具返回内容中可能混入恶意指令。输出端防敏感信息泄露——对模型回复做脱敏过滤。
所有操作都要有完整的审计日志,记录每一步的决策和执行细节。代码执行类的 Agent 必须在沙箱环境里跑,限制文件和网络访问。
安全控制的原则是"在应用层做硬约束,不指望 LLM 自觉遵守"。LLM 是概率模型,任何基于 Prompt 的安全约束都可能被绕过,所以关键防线必须在代码里。
常见追问
- Prompt 注入的具体攻击方式有哪些?怎么防?
- 你实际项目中工具权限是怎么管理的?
- 如果 Agent 在沙箱环境中执行了有害代码,怎么检测和阻止?