权限最小化
权限最小化是指 Agent、用户、工具、连接器、数据源和运行环境只获得完成当前任务所需的最小权限,并且权限应短期、可审计、可撤销、按租户和用途隔离。OWASP LLM Top 10 2025 中的 Excessive Agency 风险强调:当 LLM 应用拥有过宽能力、权限或自主性时,攻击和误操作的影响会被放大。
核对日期:2026-05-09。
1. 定义与边界
Agent 系统至少有五类权限:
| 权限层 | 示例 | 风险 |
|---|---|---|
| 用户权限 | 用户能读哪些数据、执行哪些业务动作 | 越权读取、跨租户访问 |
| Agent 权限 | Agent 可调用哪些工具、可运行多长任务 | 自主链过长、无限重试 |
| 工具权限 | 工具可访问哪些 API、文件、网络、数据库 | 大规模误操作、泄密 |
| 凭证权限 | OAuth scope、API key、service account | 凭证滥用、横向移动 |
| 环境权限 | 文件系统、Shell、网络、浏览器、进程 | 沙箱逃逸、主机入侵 |
权限最小化不是“把 Agent 做弱”,而是把风险动作拆成可授权、可审批、可回滚的最小单元。
2. 风险机制
过宽权限通常与提示注入、工具投毒、模型误判结合:
典型失败:
- 一个
admin_tool同时能读、写、删、导出。 - Agent 使用长期管理员 token 调所有系统。
- 用户只被应用层鉴权,数据层没有对象级授权。
- 工具参数允许任意 SQL、任意 URL、任意文件路径。
- 高风险动作没有审批、幂等、限额和速率控制。
3. 工程防护
3.1 权限分解
把万能工具拆成细粒度工具:
| 不推荐 | 推荐 |
|---|---|
crm_admin(action, object, payload) | read_customer_summary(customer_id)、update_customer_note(customer_id, note)、request_customer_export(customer_id) |
run_sql(query) | query_sales_metrics(date_range, region) |
file_system(path, operation) | read_project_file(relative_path)、write_artifact(file_name, content) |
3.2 权限策略
roles:
support_agent:
tools:
read_customer_summary:
scopes: ["crm:customer:read"]
update_customer_note:
scopes: ["crm:note:write"]
requires_approval: false
export_customer_data:
scopes: ["crm:customer:export"]
requires_approval: true
max_records: 100
3.3 短期凭证
- 使用短期 token,不把长期密钥放入模型上下文。
- 按工具和租户签发凭证,工具完成后失效。
- 对外部 SaaS 使用最小 OAuth scope。
- 高风险凭证需要 just-in-time 授权和审批。
3.4 参数级控制
| 参数 | 控制 |
|---|---|
| 金额 | 上限、币种、收款方 allowlist、审批。 |
| 邮件收件人 | 内外部域名区分、外部收件审批、群发上限。 |
| SQL 条件 | 禁止无条件查询和 DDL/DML,优先模板化查询。 |
| 文件路径 | 工作目录 allowlist,禁止绝对路径和上级目录逃逸。 |
| URL | egress allowlist,禁止内网探测和敏感元数据地址。 |
4. 生产流程
- 工具盘点:列出所有工具的读写能力、数据分类和副作用。
- 角色建模:定义用户角色、Agent 角色、服务账号和租户边界。
- 风险分级:把工具分成只读、低风险写、高风险写、管理操作。
- 策略落地:在工具网关和数据层实现授权,不依赖模型判断。
- 凭证治理:短期化、轮换、撤销、按 scope 签发。
- 定期复核:检查未使用权限、过宽 scope、长期凭证和异常调用。
5. 常见反模式
| 反模式 | 问题 |
|---|---|
| “先给全权限,后面再收敛” | 原型阶段的权限常被带入生产。 |
| 模型直接决定是否有权限 | 权限判断应由确定性策略和业务系统执行。 |
| 一个工具处理所有业务动作 | 无法独立授权、审计、审批和限流。 |
| 只做前端按钮权限 | Agent 可绕过 UI 直接调用工具或 API。 |
| 日志里只记成功动作 | 被拒绝的越权尝试同样是安全信号。 |
6. 评测与演练
| 用例 | 期望 |
|---|---|
| 普通用户请求读取其他租户数据 | 数据层拒绝,审计记录越权目标。 |
| Agent 尝试调用未授权工具 | 工具网关拒绝。 |
| 工具参数金额超过阈值 | 进入审批或拒绝。 |
| API key 泄露后被复用 | token 已过期或 scope 受限。 |
| 权限变更后旧会话继续执行 | 运行时重新校验权限,旧权限失效。 |
指标:
- 高风险工具审批覆盖率。
- 长期凭证数量。
- 未使用权限比例。
- 越权调用阻断率。
- 权限变更生效延迟。
7. 安全资料
- OWASP LLM06 Excessive Agency: https://genai.owasp.org/llmrisk/llm062025-excessive-agency/
- NIST AI RMF: https://www.nist.gov/itl/ai-risk-management-framework
- MCP Security Best Practices: https://modelcontextprotocol.io/docs/tutorials/security/security_best_practices
- Microsoft Azure OpenAI security baseline: https://learn.microsoft.com/en-us/security/benchmark/azure/baselines/azure-openai-security-baseline
- AWS Agentic AI Security Controls: https://docs.aws.amazon.com/prescriptive-guidance/latest/agentic-ai-security/introduction.html
8. 二次精修:权限设计决策表
8.1 身份模型选择
| 模型 | 适用场景 | 风险 | 建议 |
|---|---|---|---|
| Agent 服务身份 | 后台批处理、固定任务、无用户委托 | 容易权限过大 | 只给任务 scope,按环境隔离 |
| 用户委托身份 | 需要代表用户访问 CRM、邮箱、文档 | 需要处理用户权限变化 | 每次工具调用重新校验用户 ACL |
| 混合身份 | Agent 读取系统配置,同时代表用户操作业务数据 | 身份边界复杂 | 系统读和用户写分开 token |
| 临时审批身份 | 高风险动作审批后短时间授权 | 审批和执行参数可能漂移 | 绑定 approval_id、参数摘要和过期时间 |
8.2 最小权限策略示例
agent_identity:
name: renewal_assistant
default_mode: read_only
token_ttl_minutes: 15
scopes:
- crm:customer:read
- contract:summary:read
denied_scopes:
- crm:customer:export_all
- payment:transfer
tools:
send_email:
allowed_domains: ["company.com"]
external_domains_require_approval: true
update_contract:
max_fields: ["next_followup_at", "owner_id"]
requires_approval_when: "amount_changed == true"
8.3 权限变更传播
8.4 检测信号与告警
| 信号 | 说明 |
|---|---|
| Agent 调用未在任务声明中的工具 | 可能是 prompt injection 或工具选择漂移 |
| 单次任务读取大量对象 | 可能是批量外泄前兆 |
| 低风险任务触发写权限 | 权限配置过宽 |
| 审批后执行参数变化 | 可能是 TOCTOU 问题 |
| 旧会话在权限撤销后继续成功 | 授权缓存未失效 |
8.5 验收清单
- 每个工具都有独立 scope,不能共用超级 token。
- token 有 TTL、audience、tenant、subject 和用途约束。
- 高风险动作绑定审批记录,审批后不能替换目标对象、金额、收件人或命令。
- 权限撤销后,长任务和队列任务会在下一步执行前重新校验。
- 评测集覆盖越权读取、越权写入、跨租户、审批绕过和 token 复用。
核对日期:2026-05-09。