文章提出让智能体继承当前用户的最小化权限,并为单次任务设置明确范围、撤销机制和审计记录。该模式用于替代共享高权限API密钥,适合连接MCP、内部API及工作流系统的生产级Agent。
当 AI Agent 需要真正执行工作时,最危险的捷径很简单:给它一个服务 API key,然后祈祷 prompt 能让它循规蹈矩。
这种捷径无法规模化。一个实用的 Agent 现在可以读取工单、创建 issue、更新 CRM 记录、运行查询、触发工作流,以及调用内部工具。如果所有操作都通过一个权限宽泛的 key 执行,你拥有的就不是用户权限,而是一个借用了万能门禁卡的机器人。
一种更安全的模式是 AI Agent 权限继承:Agent 使用当前用户受限的权限执行特定任务,并具备明确的限制、撤销机制和审计记录。
本指南将介绍如何为生产级 AI 工具设计这种模式。
最近围绕 AI 平台的讨论始终聚焦于同一个问题:Agent 之所以越来越有用,是因为它们不只能回答问题,还能采取行动。但采取行动需要访问权限。
这种压力来自多个方面:
内部团队希望 Agent 能够跨客服、销售、工程、文档和数据系统开展工作。
开发者正在通过 MCP server、工作流平台、浏览器工具和私有 API 连接 Agent。
安全团队开始在实验中发现权限宽泛的 key、复制的 token,以及暴露在 prompt 中的凭据。
AI gateway 和 Agent 平台正在增加可观测性、访问控制、故障回退和支出控制,因为模型调用正在成为基础设施。
Agent 环境配置不当引发的安全事件,也在提醒开发者:“测试”和“生产”之间必须存在真正的边界。
实际得到的教训并不是“绝对不要让 Agent 采取行动”。这种结论过于武断。真正的教训是:Agent 应当继承来自用户和任务的有限权限,而不是依赖一个永久共享的 secret。
小型团队通常会从下面这种架构起步:
User request
-> AI agent
-> tool router
-> service API key
-> internal systems
这种方式看起来很快,也很容易演示,还能避开 OAuth 的复杂性。但它同样会带来一大堆问题:
这不仅是安全问题,也是产品质量问题。如果用户无法理解 Agent 被允许做什么、它实际上做了什么,以及如何撤销操作或权限,那么到了关键时刻,他们就不会信任这项功能。
AI Agent 权限继承,是指 Agent 获得一份由用户身份、角色、tenant、授权同意和当前工作流派生而来的临时、任务级授权。
Agent 不会获得用户的原始密码,也不会获得权限宽泛的 service key。它得到的是一个 delegation token(委托 token)或 permission envelope(权限信封),其中会说明:
谁发起了任务
任务属于哪个 tenant 或 workspace
可以调用哪些工具
哪些记录或资源位于授权范围内
哪些操作只能读取、只能创建草稿,或者可以真正执行
允许消耗多少费用、时间或工具调用次数
权限何时过期
必须记录哪些证据
哪些操作需要人工审批
一个简单的模型如下:
User session
-> permission service
-> task-scoped delegation token
-> agent runtime
-> policy-checked tool calls
-> audit log + revocation path
核心思想是:Agent 的权限不是由 prompt 决定的。prompt 可以说明任务内容,但真正允许执行哪些操作,必须由后端强制约束。
先从一个简单对象开始。不要把权限设计藏在 prompt 里。
{
"delegation_id": "dlg_01J8...",
"actor_user_id": "user_123",
"tenant_id": "tenant_456",
"agent_id": "support_refund_agent",
"task_id": "task_789",
"purpose": "draft_refund_response",
"allowed_tools": ["tickets.read", "orders.read", "refunds.draft"],
"resource_scope": {
"ticket_ids": ["ticket_234"],
"customer_ids": ["cust_987"],
"max_order_age_days": 90
},
"action_mode": "draft_only",
"budget": {
"max_model_calls": 12,
"max_tool_calls": 20,
"max_runtime_seconds": 180
},
"approval_required_for": ["refunds.execute", "emails.send"],
"expires_at": "2026-08-06T10:30:00Z",
"policy_version": "agent-policy-v4"
}
这个对象会成为产品、安全、工程和支持团队之间的契约。与“只能访问用户能够访问的内容”这类模糊指令相比,它也更容易测试。
Agent 可能会声称自己需要某个工具,但仅凭这种说法远远不够。
每次工具调用都应经过策略检查,并综合考虑以下因素:
用户权限: 如果没有 AI,这名用户是否有权执行该操作?
任务范围: 该资源是否属于当前任务?
Agent 模式: Agent 当前处于只读、草稿、Copilot,还是 Autopilot 模式?
风险等级: 该操作是否可能汇款、删除数据、向客户发送邮件、修改权限或泄露 secret?
证据: Agent 用于生成参数的信息是否来自可信来源?
预算: 此次运行是否已经超过工具调用量、token 用量或时间限制?
下面是一个简化的 TypeScript 风格策略检查:
type ToolCall = {
tool: string;
args: Record<string, unknown>;
};
type Delegation = {
actorUserId: string;
tenantId: string;
allowedTools: string[];
actionMode: "read_only" | "draft_only" | "supervised" | "bounded_autopilot";
resourceScope: {
ticketIds?: string[];
customerIds?: string[];
};
approvalRequiredFor: string[];
expiresAt: string;
};
function authorizeToolCall(call: ToolCall, delegation: Delegation) {
if (new Date(delegation.expiresAt) < new Date()) {
return deny("delegation_expired");
}
if (!delegation.allowedTools.includes(call.tool)) {
return deny("tool_not_delegated");
}
if (!userCanUseTool(delegation.actorUserId, delegation.tenantId, call.tool)) {
return deny("user_lacks_permission");
}
if (!resourceInScope(call.args, delegation.resourceScope)) {
return deny("resource_out_of_scope");
}
if (delegation.approvalRequiredFor.includes(call.tool)) {
return requireApproval("human_approval_required");
}
if (delegation.actionMode === "draft_only" && isStateChanging(call.tool)) {
return deny("draft_mode_blocks_state_change");
}
return allow();
}
请注意这里缺少什么:代码中没有“LLM 说这样做是安全的”这一分支。
模型可以提出操作建议,是否允许执行则由 runtime 决定。
delegation token 应该朴实无华——这是一种称赞。
优秀的 delegation token 应当:
仅限一个任务或一次工作流运行
与特定用户和 Agent 身份绑定
无法在 Agent runtime 之外使用
在每次授权工具调用时留下日志
还应当:
使用短暂的有效期,通常以分钟而不是天为单位
能够立即撤销
绑定明确的 tenant 和资源范围
防止重放,或仅允许进行有条件的重放
避免使用长期有效的“Agent token”,否则它们会变成影子账号。如果后台 Agent 需要稍后继续执行任务,应持久化工作流状态,并在重新检查策略后签发一份新的委托授权。
对于长时间运行的工作,使用 lease(租约):
run starts -> delegation valid for 10 minutes
run pauses -> lease released
run resumes -> policy re-check -> new delegation issued
这种机制能够应对以下情况:用户角色发生变化、客户记录被锁定、tenant 禁用了某个集成,或者支持团队经理撤回了审批。
大多数实用的 Agent 工作流并不需要从第一天起就具备完全自主权。
权限信封应包含当前模式,并由工具处理程序强制执行。
不要只依赖 UI 标签。如果产品显示“草稿模式”,后端就必须拒绝会改变状态的调用。
很多 Agent 系统一谈到撤销机制,定义就开始变得模糊。
至少需要提供以下四条撤销路径:
用户撤销: 用户取消 Agent 的运行。
管理员撤销: 管理员禁用用户、角色、tenant 或集成。
策略撤销: 由于限制或证据规则发生变化,风险引擎阻止此次运行。
事件撤销: 安全团队禁用某个工具、provider、connector 或 Agent 类别。
Agent runtime 应该在每次工具调用之前检查撤销状态,而不是只在开始运行时检查一次。
async function beforeToolCall(call, delegation) {
const status = await delegationStore.getStatus(delegation.delegation_id);
if (status.revoked) {
throw new Error(`Delegation revoked: ${status.reason}`);
}
return authorizeToolCall(call, delegation);
}
这种做法可能显得严格,但它能避免最糟糕的 Agent 故障:在人类以为工作流已经停止后,它仍在继续执行操作。
Agent 执行的每一项重要操作,都应该留下凭证。
一份优秀的凭证应当能够回答:
是哪个权限信封允许了该操作?
涉及了哪些资源?
该操作属于读取、草稿还是执行?
是否需要审批?
能否重放、审查或回滚?
{
"receipt_id": "rcpt_01J9...",
"delegation_id": "dlg_01J8...",
"actor_user_id": "user_123",
"tenant_id": "tenant_456",
"agent_id": "support_refund_agent",
"tool": "refunds.draft",
"resource_ids": ["order_555"],
"decision": "allowed",
"approval_id": null,
"policy_version": "agent-policy-v4",
"created_at": "2026-08-06T10:18:14Z"
}
凭证不只是为了审计。它还可以帮助开发者调试错误输出、帮助支持团队解释 Agent 的行为,并帮助产品团队判断哪些工作流已经获得足够信任,可以进一步自动化。
关于 AI Agent、OAuth、MCP 和 API 安全的热门内容,往往只能讲好其中某一个层面:
如何构建 OAuth 流程
如何添加 prompt guardrail
如何记录模型调用
如何使用 AI gateway
缺失的实用价值,在于如何连接这些层面。权限继承正是这条连接纽带。
问题不只是“我应该把 key 存在哪里?”,而是:
对于这名用户的这项任务,这个 Agent 究竟应该继承哪些明确权限?系统又该如何证明这些权限得到了严格执行?
这是小型团队应该尽早弥补的架构缺口。
在允许 Agent 访问真实工具之前,请使用下面这份检查清单。
写入生产状态
发送外部消息
如果无法对某个工具进行分类,就不应将它提供给自主运行的 Agent。
不要让 Agent 从 prompt 中自行推断权限。检查用户的 session、tenant、角色、套餐、授权同意和集成状态后,再由后端生成权限信封。
如果 Agent 想为某笔订单退款,order_id 应来自可信查询结果或 UI 中选定的记录,而不能只来自自由文本。
审批界面应显示变更 diff、来源证据和确切操作。“批准 Agent”过于模糊;“批准为 order_555 创建 $42.00 的退款草稿”才是可审查的。
模型 trace 展示 Agent 思考了什么,凭证则展示系统允许了什么。两者缺一不可。
添加回归测试,让 Agent 尝试对错误的 tenant、客户或记录使用有效工具,或者使用已经过期的委托授权。这些测试必须以拒绝告终。
清晰可见的停止按钮应该撤销委托授权、取消排队中的步骤,并阻止同一次运行继续发起工具调用。
支持 Agent 可以读取当前工单、查看最近的订单、起草退款方案并准备回复。在人工批准确切操作之前,它不能真正执行退款,也不能向客户发送邮件。
分析 Agent 可以查询用户已有权访问的指标。委托授权中包含行级 tenant 过滤器、指标定义、查询预算和禁用字段。Agent 不能通过使用权限更宽泛的 warehouse role 执行原始 SQL,绕过分析系统的权限控制。
编码 Agent 可以读取 issue、检查仓库文件、创建分支并起草 pull request。未经批准,它不能轮换 secret、修改部署设置或执行 merge。
销售 Agent 可以丰富潜在客户信息、起草 CRM 备注并建议下一步操作。未经用户同意,也没有速率限制时,它不能导出完整客户名单或发送外部消息。
[User Session]
|
v
[Permission Service] ---- checks roles, tenant, consent, integration status
|
v
[Delegation Token / Envelope]
|
v
[Agent Runtime]
|
v
[Tool Policy Gateway] ---- checks tool, resource, mode, budget, approval
|
v
[Internal Tools / MCP Servers / APIs]
|
v
[Delegation Receipts + Audit Logs]
无论工具是 REST API、MCP server、队列、浏览器操作、SQL 查询,还是内部 SDK 调用,这套架构都适用。关键在于:每一条通往实际操作的路径,都必须经过策略网关。
还应跟踪能够揭示权限继承是否有效的指标:
按原因统计被拒绝的工具调用
按操作类型统计审批率
已过期委托授权的复用情况
跨 tenant 拒绝测试的通过情况
每个成功委托任务的成本
与权限范围过宽有关的事件
用户信任信号,例如审批内容的修改和取消率
如果每项操作都需要审批,你的 Agent 可能受到了过多限制。如果没有任何操作被拒绝,你的策略可能根本没有发挥实际作用。
AI Agent 需要访问权限才能真正产生价值。但提供访问权限,并不意味着把权限宽泛的 key、不可见的权限或永久授权交给模型。
权限继承为开发者提供了一条更好的中间道路:Agent 可以在特定任务中使用用户的有限权限采取行动,同时为每次工具调用提供凭证、撤销机制和策略检查。
这才是从令人惊艳的演示,走向真正值得用户信任的 Agent 工作流的方式。
AI Agent 权限继承是一种模式:Agent 获得由当前用户的权限、tenant、授权同意和工作流模式派生而来的临时、任务级权限。Agent 不会获得权限宽泛的 API key 或原始凭据。
不同。OAuth 可以是实现方案的一部分,但权限继承是一种范围更广的产品与 runtime 模式。它还包括任务范围、资源限制、工具策略、审批门槛、撤销机制、预算和审计凭证。
有时可以,但 service account 仍应受到 tenant、工具、任务和策略的约束。一个无所不能的宽权限 service account 风险很高。对于由用户发起的工作,应优先采用用户级委托授权。
prompt 可以描述规则,但不应该成为强制执行层。执行工具调用之前,必须由后端服务检查权限。
有效期应尽量短。许多交互式任务只需要几分钟。长时间运行的工作流应使用 lease,并在签发新的委托授权前重新检查策略。
最大的错误是为了让演示更简单,给 Agent 一个权限强大的 key。这种捷径通常会导致审计日志薄弱、撤销能力不足、故障影响范围过大,以及跨 tenant 风险。
如需采取进一步行动,你可以考虑屏蔽此人和/或举报滥用行为。