文章摘要
前十六篇已经把生产级 Agent 从任务规划、Tool Calling、Memory、Checkpoint、Human-in-the-Loop、多 Agent 协作、安全沙箱、质量门禁、Control Plane 一直推进到 Agent Registry 与 Capability Marketplace。到这一阶段,平台已经能回答“有哪些 Agent”“有哪些能力”“一个 Run 现在做到哪”“某个 Tool 谁在用”,但还有一个更基础的问题没有真正解决:
Agent 到底以谁的身份执行?
很多系统只有两种身份:用户和服务账号。用户连接一次 Google Drive、GitHub、CRM 或邮件后,Agent 就长期复用这个 OAuth Token;内部 MCP Server 则常常使用所有 Agent 共享的一把 API Key;多 Agent 场景里,Supervisor 把任务交给 Sub-Agent 时,权限也跟着模糊传播。于是审计时只能看到“sales-agent 调用了 crm.update”,却回答不了:这是哪个用户委托的?为了哪个业务目标?权限从哪一次授权而来?为什么可以修改这一个客户而不是整个 CRM?这次权限什么时候失效?Sub-Agent 是否有权继续把它转交给另一个 Agent?
本篇把身份和权限正式纳入 Agent Control Plane,建立 Human Identity、Agent Workload Identity、Connection Grant、Purpose Binding、Execution Grant、Capability Token、Approval、Resource Scope、Credential Broker、Delegation Chain 和 Revocation 等核心对象。目标不是重新发明 OAuth,而是在传统身份系统和 Agent Runtime 之间增加一层 Delegated Authority:用户可以长期连接系统,但 Agent 每次执行只能获得与当前 Run、Purpose、Capability、Resource 和 Deadline 绑定的短期最小权限。
完成这一层以后,每一次 Tool Call 都必须能回答四个问题:谁发起、代表谁、为什么做、基于什么授权。
一、为什么 Agent 身份不能只用 Service Account
最简单的企业 Agent 通常这样部署:
sales-agent
↓
service-account-sales-agent
↓
CRM
看起来已经有独立身份。
但当 80 个销售都使用同一个 Agent 时,CRM 日志只看到:
service-account-sales-agent
你不知道:
哪位销售触发
服务哪个客户
为了什么任务
有没有用户授权
Service Account 能表达:
哪个工作负载
不能完整表达:
这个工作负载正在代表谁
所以 Agent 调用至少需要两种主体:
Workload Identity
+
Human Subject
二、Human Identity 和 Agent Identity 是两回事
定义:
public record HumanIdentity(
String subjectId,
String tenantId,
Set<String> roles,
Set<String> groups,
EmploymentStatus status) {
}
Agent:
public record AgentIdentity(
String agentId,
String version,
String ownerTeam,
String workloadPrincipal,
AgentStatus status) {
}
工具调用时同时携带:
subject=user-82
agent=sales-renewal-agent
而不是二选一。
三、“代表用户执行”不是 Impersonation 的同义词
很多系统直接做:
Agent 使用用户完整 Token
这接近:
Impersonation
Agent 得到了用户本人的整个权限面。
更安全的目标应该是:
Delegation
也就是用户授权:
这个 Agent
在这个任务里
为了这个目的
访问这些资源
做这些动作
授权范围应该小于用户本人的总权限。
四、整个授权链应该长这样
Human Identity
↓
Connected Account
↓
Connection Grant
↓
Agent Run
↓
Purpose Binding
↓
Capability Request
↓
Policy Decision
↓
Approval(必要时)
↓
Execution Grant
↓
Ephemeral Credential
↓
Tool Invocation
这里每一层解决不同问题。
五、Connection Grant:用户长期连接,不等于 Agent 长期执行权
用户在设置里连接:
Google Drive
GitHub
CRM
Email
得到 Connection:
public record ConnectionGrant(
String connectionId,
String subjectId,
String tenantId,
String provider,
Set<String> providerScopes,
String credentialRef,
ConnectionStatus status,
Instant connectedAt,
Instant reauthAt) {
}
它可以存在 30 天、90 天甚至更久。
但它只表示:
用户允许平台连接这个 Provider
不是:
所有 Agent 永久获得 Provider Scope
六、Purpose Binding:Agent 为什么需要这次权限
这是 Agent 场景里非常重要、传统 OAuth 又往往没有直接表达的一层。
例如:
crm.customer.read
用于:
renewal-risk-review
和用于:
bulk-marketing-export
风险完全不同。
所以 Run 创建时应该固定:
public record RunPurpose(
String purposeId,
String runId,
String taskType,
String description,
Set<String> allowedCapabilityPatterns,
Instant expiresAt) {
}
Purpose 不能由 Agent 执行一半以后随意扩大。
七、Capability 是权限决策的业务语言
上一期已经建立:
Capability Registry
所以 Agent 不应该请求:
OAuth Scope:
https://www.googleapis.com/auth/...
它应该请求:
drive.document.read
crm.customer.read
email.send
cloudrun.deploy
Provider Scope 由 Registry 映射。
这样业务 Policy 不会被某一家 SaaS 的授权格式绑死。
八、Capability Request
public record CapabilityRequest(
String runId,
String stepId,
String agentId,
String subjectId,
String tenantId,
String purpose,
String capabilityId,
Set<String> resourceIds,
JsonNode proposedAction,
RiskLevel risk) {
}
例如:
{
"runId": "run-1842",
"agentId": "renewal-agent",
"subjectId": "user-82",
"purpose": "renewal-review",
"capabilityId": "crm.customer.read",
"resourceIds": [
"customer/12345"
]
}
九、Resource Scope 比 OAuth Scope 更接近 Agent 真正需要的权限
OAuth Scope:
crm.read
可能意味着读取整个 CRM。
这对于当前任务太宽。
Execution Grant 更应该变成:
crm.customer.read
+
customer/12345
甚至:
fields:
name
stage
recent_activity
这就是:
Scope
→ Resource
→ Field
三层收缩。
十、为什么“用户本来就有权限”还不够
用户可能有:
查看 10 万客户
权限。
Agent 当前只需要分析一个客户。
如果直接继承用户完整权限,Prompt Injection 一旦成功,Agent 就可能:
枚举全库
最小权限的目标是:
Agent 权限
<
User 权限
而不是等于。
十一、Execution Grant
Policy 通过后生成:
public record ExecutionGrant(
String grantId,
String parentConnectionId,
String runId,
String stepId,
String agentId,
String subjectId,
String tenantId,
String purpose,
String capabilityId,
Set<String> resourceIds,
int maximumCalls,
Instant notBefore,
Instant expiresAt,
GrantStatus status) {
}
一个典型 Grant:
有效:
10 分钟
最大调用:
3 次
Capability:
crm.customer.read
Resource:
customer/12345
十二、Grant 的生命周期应该比 Run 更短
Run 可能持续:
4 小时
2 天
甚至一周
不能因此给一个 7 天 Access Token。
每个阶段按需申请短期 Grant。
例如:
Research 阶段:
只读
Approval 后:
短期写权限
发布完成:
立即撤销
权限随着任务阶段变化。
十三、Progressive Authority
这是一种很适合 Agent 的模式:
先给低风险权限
证明需要以后
再升级权限
例如:
Step 1:
crm.read
Step 2:
生成更新 Proposal
Step 3:
用户批准
Step 4:
crm.update
不要一开始就给:
crm.admin
十四、Approval 是 Authority Upgrade
Human-in-the-Loop 不只是“点确认”。
它应该被理解为:
权限升级事件
批准前:
Agent 只能准备
批准后:
获得一次或短期写能力
这样 Approval 和 IAM 才真正连接起来。
十五、Approval 必须绑定 Proposed Action
用户批准:
给客户 A 发一封续约邮件
Agent 不能把这个批准拿去:
给 300 个客户群发
所以 Approval 保存:
public record Approval(
String approvalId,
String runId,
String capabilityId,
String actionHash,
String approvedBy,
Instant approvedAt,
Instant expiresAt) {
}
Tool 执行前重新算 Action Hash。
任何关键参数变化:
重新审批
十六、短期 Credential 才真正接 Provider
Credential Broker:
public interface CredentialBroker {
EphemeralCredential issue(
ConnectionGrant connection,
ExecutionGrant grant,
ProviderBinding provider);
}
返回:
public record EphemeralCredential(
String token,
Instant expiresAt,
Set<String> providerScopes,
String fingerprint) {
}
Agent 不保存长期 Refresh Token。
十七、为什么 Refresh Token 必须和 Runtime 分离
Access Token 泄漏:
几分钟到几小时
Refresh Token 泄漏:
可能持续很久
如果代码 Agent、Browser Agent、Sandbox 都能读取 Refresh Token,攻击面非常大。
更合理:
Refresh Token
只存在 Credential Vault
Agent Runtime
只获得短期 Access Token
十八、Capability Token 可以进一步降低中心依赖
每次 Tool 调用都访问中央 Authority Service,容易形成全局瓶颈。
可以签发:
Capability Token
例如 JWT:
{
"iss": "agent-authority",
"sub": "user-82",
"agent": "renewal-agent",
"run": "run-1842",
"purpose": "renewal-review",
"cap": "crm.customer.read",
"resource": ["customer/12345"],
"calls": 3,
"exp": 1780000000
}
Tool Gateway 本地验证签名。
低风险读取可以减少回中心请求。
十九、高风险能力不要完全离线验证
例如:
payment.refund
cloud.delete
permission.change
即使 Token 已签名,也可以要求:
Online Revocation Check
+
Approval Check
因为这类动作需要更强撤权能力。
二十、Agent-to-Agent Delegation 更麻烦
Supervisor:
拥有 customer.read
把任务交给 Sub-Agent:
research-agent
问题是:
Sub-Agent 自动继承全部权限吗?
我的答案是:
不应该
每次转交重新生成子 Grant。
二十一、Delegation Chain
public record DelegationLink(
String delegationId,
String parentGrantId,
String fromAgentId,
String toAgentId,
Set<String> delegatedCapabilities,
Set<String> delegatedResources,
Instant expiresAt) {
}
原则:
Child Authority
⊆
Parent Authority
子 Agent 不能获得父 Agent 没有的权限。
二十二、禁止 Authority Expansion
如果父 Agent 有:
customer/12345 read
子 Agent 请求:
customer/*
必须失败。
如果父 Agent 只有:
read
子 Agent 请求:
update
也失败。
这叫:
Monotonic Restriction
权限只能收缩,不能在委托链中扩大。
二十三、限制委托深度
否则:
Supervisor
→ Agent A
→ Agent B
→ Agent C
→ Agent D
最终很难审计。
可以:
delegation:
max-depth: 2
高风险 Capability:
delegation_allowed=false
只能原 Agent 使用。
二十四、Scheduled Agent 怎么授权
定时任务没有用户在线。
例如:
每天 8:00
生成销售风险报告
这时不能依赖:
用户临时确认
需要:
Standing Delegation
但必须更严格。
二十五、Standing Delegation
public record StandingDelegation(
String delegationId,
String ownerSubjectId,
String agentId,
String scheduleId,
String purpose,
Set<String> capabilities,
Set<String> resources,
RiskLevel maximumRisk,
Instant expiresAt,
ReviewPolicy reviewPolicy) {
}
例如:
每天读取 CRM
只读
只处理 owner 的区域客户
有效 30 天
二十六、Standing Delegation 必须定期重新确认
不能:
2026 年授权
2031 年还在跑
可以:
低风险:
90 天 Review
中风险:
30 天
高风险:
不允许 Standing Delegation
二十七、Condition Watch 也属于委托
未来 Agent 可能:
持续监控价格
邮件
安全事件
市场变化
它不是一次 Run。
Authority 应绑定:
Watch Definition
而不是给 Agent 永久账户权限。
二十八、Browser Session 是 Credential
Browser Agent 登录成功后:
Cookie
Storage State
Session
都代表真实权限。
所以 Browser Session 必须进入 Identity 系统。
public record BrowserSessionAuthority(
String sessionId,
String subjectId,
String agentId,
String purpose,
Set<String> allowedSites,
Set<String> allowedActions,
Instant expiresAt) {
}
二十九、用户人工通过 MFA 后,不等于后续动作全放行
Human Takeover 可能只为了:
Authentication
用户完成验证码后,Agent 不应该理解成:
之后所有操作都批准
Authentication Approval 和 Action Approval 必须分开。
三十、MCP Server 也需要主体身份
本地 MCP Demo 常见:
一把 API Key
所有 Agent 共用
生产应该至少传:
Agent Identity
Human Subject
Tenant
Purpose
Capability Token
否则 MCP Audit 只能看到:
某个 Server 被调用
看不到授权链。
三十一、Tool 端不能完全相信 Agent 自报字段
Agent 请求里写:
{
"subject": "admin"
}
不能就相信。
身份必须来自:
签名 Token
Gateway
Service Mesh Identity
而不是 Prompt 或 JSON 自报。
三十二、Signed Context
调用 Tool 时可以传:
X-Agent-Authority:
signed-token
内部包含:
run
agent
subject
tenant
purpose
capability
resource
expiry
Tool 验证签名后再执行。
三十三、不要让 LLM 决定自己有没有权限
模型可以说:
“为了完成任务,我需要 crm.update。”
它只能提出 Request。
真正决策由:
Policy Engine
完成。
LLM 不是 Authorization Engine。
三十四、Policy 要使用确定性数据
输入:
用户角色
Agent ID
Purpose
Capability Risk
Resource
Tenant
Connection Scope
Approval
时间
不是让另一个模型判断:
“你觉得这次调用合理吗?”
LLM 可以辅助风险解释,但不能单独做最终授权。
三十五、Data Classification 进入 Authority
资源不仅有 ID。
还有敏感等级:
public enum DataClass {
PUBLIC,
INTERNAL,
CONFIDENTIAL,
RESTRICTED
}
Agent Runtime Profile 可以限制:
Code Sandbox:
最高 INTERNAL
HR Agent:
允许 CONFIDENTIAL
高安全审批:
才允许 RESTRICTED
三十六、Output Authority 同样重要
读取数据以后,Agent 要把结果发到哪里?
Read 权限
≠
Export 权限
所以 Capability 还要区分:
data.read
data.summarize
data.export
很多数据泄漏并不是非法读取,而是合法读取后非法外传。
三十七、Egress Policy
例如:
CRM CONFIDENTIAL
可以:
内部总结
但不能:
发送到公开 Webhook
Tool Policy 需要组合:
Input Data Class
+
Destination
三十八、Agent Memory 不能突破原权限
Agent 在一次有权限 Run 里读到敏感信息。
然后写进长期 Memory。
以后另一个用户 Run 又读出来。
这会形成:
权限穿透
所以 Memory Item 要携带:
source_authority
data_class
tenant
subject_scope
检索时重新授权。
三十九、Memory Authorization
public record MemoryRecord(
String memoryId,
String tenantId,
String subjectScope,
DataClass dataClass,
String sourceGrantId,
Instant expiresAt) {
}
Memory 不是“模型已经知道了,所以可以继续用”。
它仍然是受控数据。
四十、Artifact 也必须继承授权
Agent 生成:
分析报告
CSV
截图
代码 Patch
这些 Artifact 可能包含原始受限数据。
Artifact Registry 保存:
derived_from
classification
access_scope
不要一生成文件就变成“谁拿链接都能下载”。
四十一、审计必须保存完整 Delegation Chain
例如:
User Zhang
↓
Standing Delegation
↓
Sales Supervisor Agent
↓
Research Sub-Agent
↓
crm.customer.read
出问题时必须能回放:
权限怎么一层层传下来的
四十二、Tool Ledger
每次调用记录:
public record AuthorizedToolInvocation(
String invocationId,
String runId,
String stepId,
String agentId,
String subjectId,
String tenantId,
String purpose,
String capabilityId,
String resourceHash,
String grantId,
String parentGrantId,
String approvalId,
String credentialFingerprint,
String result,
Instant occurredAt) {
}
这张表以后同时服务:
安全
成本
故障
合规
用户解释
四十三、用户应该能看到自己的 Agent 授权
不是只有管理员后台。
一个用户界面至少能查看:
哪些 Agent 已连接
哪些系统已授权
最近执行了什么
有哪些 Standing Delegation
什么时候过期
并支持:
Revoke
四十四、Agent 权限应该有“授权收据”
每次高风险操作以后给:
Authority Receipt
例如:
Agent:
release-agent
代表:
user-82
Capability:
cloudrun.deploy
Resource:
orders-service
Approval:
approval-128
时间:
10:21
Result:
SUCCESS
这对建立信任很重要。
四十五、撤权必须是事件驱动
以下事件发生时自动撤权:
用户离职
角色变化
Connection Revoke
Agent Disabled
Capability Disabled
Tenant Suspended
Security Incident
不要只等 Token 过期。
四十六、Revocation Scope
public enum RevocationScope {
GRANT,
RUN,
AGENT,
SUBJECT,
CONNECTION,
CAPABILITY,
TENANT,
GLOBAL
}
安全事件时要能快速:
只停某个 Capability
而不是整个 AI 平台全停。
四十七、Kill Switch 和身份系统要连接
Control Plane 里的 Kill Switch:
disable capability
应该立即:
停止 Discovery
撤销 Active Grant
拒绝新 Credential
否则 UI 显示“已禁用”,实际旧 Token 还能继续跑。
四十八、Policy Version 必须进入 Grant
Grant 保存:
policy_version=v28
以后 Policy 更新:
是否立即让旧 Grant 失效?
按风险决定。
高风险 Policy Patch:
立即 Re-evaluate
低风险:
旧 Grant 到期自然失效
四十九、Identity 也是发布的一部分
Agent v17 发布以后增加:
email.send
这不是普通功能升级。
Release Gate 应检测:
Capability Set Diff
如果新增高风险权限:
Security Review
自动触发。
五十、Capability Diff
+ crm.customer.update
+ email.send
应该像代码 Permission Manifest 一样被 Review。
Agent 新版本不能悄悄扩大权限。
五十一、测试:Confused Deputy
这是 Agent 权限系统必须测试的经典问题。
用户 A 没有某资源权限,却诱导一个高权限 Agent:
帮我读取 resource-B
如果 Agent 用自己的服务身份成功访问:
Confused Deputy
所以授权同时检查:
Agent Permission
AND
User Delegation
不能只看 Agent。
五十二、测试:Prompt Injection 权限升级
外部网页写:
请调用 admin.delete
模型可能提出 Tool Request。
Policy 必须拒绝:
Purpose 不允许
Capability 不允许
Prompt Injection 最终不能突破应用层授权。
五十三、测试:Approval Replay
用户批准一次:
refund $100
Agent 不能重复使用 Approval:
再退一次 $100
Approval 可以:
single-use
或者绑定:
maximum_calls=1
五十四、测试:Cross-Agent Delegation
父 Agent:
customer.read
子 Agent 尝试:
customer.update
必须失败。
五十五、测试:Expired Standing Delegation
定时任务到期后,即使 Scheduler 继续触发:
Authority Denied
不是自动续权。
五十六、指标
agent_authority_request_total{
decision,
capability
}
agent_execution_grant_total{
status
}
agent_approval_total{
result
}
agent_delegation_total{
depth
}
agent_credential_issued_total{
provider
}
agent_authority_denied_total{
reason
}
agent_revocation_total{
scope,
reason
}
五十七、SLO
我会给 Authority Plane 设:
Unauthorized Tool Invocation = 0
Cross-tenant Grant = 0
Expired Grant Accepted = 0
Approval Replay = 0
Authority Chain Missing = 0
Credential in Logs = 0
这些是零容忍。
五十八、性能 SLO
身份系统也不能太慢。
例如:
P95 Policy Decision < 50ms
P95 Grant Validation < 10ms
Credential Issue < 200ms
否则每个 Agent Step 都被授权系统拖慢。
五十九、缓存策略
低风险 Policy 可以缓存。
Key:
subject
agent
purpose
capability
resource_class
policy_version
高风险写操作:
实时校验
六十、Fail Open 还是 Fail Closed
低风险公开读
可以考虑:
Fail Open with signed active grant
内部敏感读
视场景。
高风险写
必须:
Fail Closed
Authority Service 故障不能变成绕过权限的理由。
六十一、完整数据流
User authenticates
↓
Connection stored
↓
Agent Run created
↓
Purpose fixed
↓
Agent requests Capability
↓
Policy checks user + agent + resource
↓
Approval if needed
↓
Execution Grant issued
↓
Credential Broker creates short token
↓
Tool Gateway validates authority
↓
Tool executes
↓
Ledger writes receipt
↓
Credential expires
六十二、和上一期 Registry 的关系
第 16 篇 Registry 回答:
系统有什么能力?
第 17 篇 Authority 回答:
这次谁可以用这个能力?
组合以后:
Registry
→ Discover
→ Authority
→ Invoke
这是 Agent Capability Plane 的完整闭环。
六十三、和 Control Plane 的关系
Control Plane 已有:
Run
Budget
Approval
Kill Switch
Feedback
Authority Plane 把:
Identity
Grant
Credential
Delegation
接进去。
于是 Run 的每个高风险 Step 都有身份依据。
六十四、为什么这比“加一个 RBAC”复杂
因为 Agent 的权限是:
动态的
短期的
任务驱动的
可以转委托的
带副作用的
传统:
User → Role → Permission
还不够。
更接近:
User
→ Connection
→ Purpose
→ Agent
→ Capability
→ Resource
→ Approval
→ Execution Grant
六十五、但不要因此造一套完全独立 IAM
仍然复用企业现有:
SSO
OAuth
OIDC
IAM
RBAC
Group
Service Account
Agent Authority 是上层编排。
不是替换底层身份系统。
六十六、本篇上线检查清单
□ Human Identity 与 Agent Workload Identity 分离
□ 每个 Tool Call 同时保留 Subject 与 Agent
□ 长期 Connection 不直接作为执行权限
□ Run 有明确 Purpose
□ Agent 请求业务 Capability,而不是直接请求 Provider Token
□ Execution Grant 绑定 Run、Purpose、Capability 和 Resource
□ Grant 短生命周期
□ 高风险能力需要 Approval
□ Approval 绑定 Action Hash
□ Refresh Token 不进入 Agent Runtime
□ Tool 使用短期 Credential
□ Agent-to-Agent 委托权限只能收缩
□ 委托深度有限制
□ Scheduled Agent 使用 Standing Delegation
□ Standing Delegation 定期复核
□ Browser Session 被视为 Credential
□ Memory 与 Artifact 保留原授权范围
□ Capability Disable 会撤销 Active Grant
□ Agent Release 检查 Permission Diff
□ Tool Ledger 能还原完整 Delegation Chain
□ 用户能查看并撤销自己的 Agent 授权
总结
Agent Identity 的核心不是给每个 Agent 建一个 Service Account。
真正的问题是:
一个自主系统
正在代表真实的人
访问真实的数据
执行真实副作用
所以每一次工具调用都应该可以回答:
Who initiated?
Which Agent executed?
On behalf of whom?
For what purpose?
Using which capability?
Against which resource?
Under which approval?
Until when?
当这些问题都有结构化答案以后,Agent 才真正从:
“拿着用户 Token 的自动脚本”
变成:
有明确委托边界的企业执行主体
这也是 Agent Control Plane 从“能管理运行”走向“能管理权力”的一步。
下一篇继续推进:
手搓生产级 AI Agent 系统(18):Agent Audit Ledger 与 Explainable Execution——让一次自动操作可以被完整回放、解释和举证。
:身份与委托权限&spm=1001.2101.3001.5002&articleId=163938695&d=1&t=3&u=18214c824d334c4aa0d15a6a9af62c87)
700

被折叠的 条评论
为什么被折叠?



