在多智能体(Multi-Agent)协同逐渐深入企业核心业务的今天,传统的基于角色访问控制(RBAC)开始暴露出明显的疲态。RBAC 能够很好地回答“财务专员小李能否调用转账工具”,但却完全无法处理动态的现实复杂场景:
“小李在工作日白天、在公司机房内网、发起一笔 2 万元的供应商付款,系统应当直接放行;但如果由一个处于后台自治状态的财务结算 Agent,在周六凌晨三点、使用海外代理 IP、尝试发出一笔 50 万元的紧急打款,系统是否还能仅仅因为该 Agent 挂载了‘财务管理员’角色就盲目执行?”
当自主智能体被赋予越来越多的决策与编排自由度,安全体系必须从静态的角色匹配,演进到能够感知环境属性、操作主体、目标客体以及时空维度的基于属性的访问控制(ABAC, Attribute-Based Access Control)。
本文将以金融级业务场景为例,深度解析如何在多 Agent 协同网关中落地一套基于 ABAC 的动态授权与提权拦截引擎。
从 RBAC 到 ABAC:四维属性矩阵的构建
在 ABAC 理论模型中,每一次 Agent 发起的工具调用或资源访问,都会被抽象为一个由四大维度的属性集所构成的判定上下文:
- 主体属性(Subject Attributes):
- 智能体类型(交互式助手 / 后台异步批处理 Worker);
- 宿主与发起人身份(真实员工 UserID / 委托租户 TenantID);
- 当前安全信用评分与历史误操作频率。
- 客体属性(Object/Resource Attributes):
- 目标操作的数据密级(内部公开 / 秘密 / 核心金融绝密);
- 目标账户的单笔额度与日累计金额;
- 目标实体的所有权归属。
- 动作属性(Action Attributes):
- 操作性质(幂等只读查询 / 状态修改 / 资金划扣 / 批处理删除);
- 是否包含高危破坏性指令。
- 环境属性(Environment/Context Attributes):
- 物理时间窗口(是否在法定工作日交易时间);
- 网络发起位置(内网专线 / 堡垒机 / 异常公网代理);
- 系统当前整体风险水线(如是否处于双 11 封网期或遭遇 DDoS 攻击期间)。
声明式策略定义(Rego / JSON Policy)
为了让安全团队能够独立于业务代码灵活调整风控规则,我们通常采用类似 Open Policy Agent(OPA)或标准 JSON Schema 的声明式策略引擎。
以下是一份防范后台 Agent 越权打款的典型生产级 ABAC 策略定义:
{ "policy_id": "POL_FIN_AGENT_TRANSFER_007", "description": "严格限制异步自主 Agent 的大额资金划扣操作", "effect": "DENY", "conditions": { "all_of": [ { "field": "action.type", "operator": "EQUALS", "value": "financial:transfer" }, { "field": "subject.agent_mode", "operator": "EQUALS", "value": "AUTONOMOUS_WORKER" } ], "any_of": [ { "field": "resource.amount", "operator": "GREATER_THAN", "value": 100000.0 }, { "field": "environment.time_hour", "operator": "NOT_IN_RANGE", "value": [9, 18] }, { "field": "environment.network_zone", "operator": "NOT_EQUALS", "value": "INTERNAL_DMZ" } ] }, "remediation": { "action": "REQUIRE_HUMAN_MFA_APPROVAL", "approver_role": "risk_management_director", "timeout_seconds": 600 } }该策略明确定义:只要是一个处于非人工实时监督下的自主 Agent,在非工作时段(早 9 点至晚 6 点以外)、非内网隔离区、或单笔转账金额超过 10 万元,系统直接拒绝执行并强制将任务挂起,转交风控总监进行双人多因素身份验证(MFA)二次审批。
Go 生产级 ABAC 决策裁决引擎实现
在网关或 Agent Runtime 侧,我们用 Go 实现了一套具备纳秒级评估性能的 ABAC 拦截器:
package abac import ( "context" "errors" "fmt" "log/slog" "time" ) type EvaluationContext struct { Subject SubjectContext `json:"subject"` Resource ResourceContext `json:"resource"` Action ActionContext `json:"action"` Environment EnvironmentContext `json:"environment"` } type SubjectContext struct { AgentID string AgentMode string // INTERACTIVE 或 AUTONOMOUS_WORKER UserID string TenantID string } type ResourceContext struct { ResourceType string Amount float64 SecurityTier int // 1:公开, 2:内部, 3:绝密 } type ActionContext struct { Type string // e.g., "financial:transfer" } type EnvironmentContext struct { RequestTime time.Time NetworkZone string IsMFAValid bool } type DecisionResult struct { Allowed bool Reason string RequireMFA bool } type PolicyEngine struct { logger *slog.Logger } func (pe *PolicyEngine) Evaluate(ctx context.Context, evalCtx *EvaluationContext) (*DecisionResult, error) { // 1. 核心高危动作拦截:资金转账 if evalCtx.Action.Type == "financial:transfer" { // 校验环境时间属性:非交易时段禁止自主 Agent 大额划账 hour := evalCtx.Environment.RequestTime.Hour() isBusinessHour := hour >= 9 && hour < 18 if evalCtx.Subject.AgentMode == "AUTONOMOUS_WORKER" && !isBusinessHour { pe.logger.Warn("ABAC 拦截:自主 Agent 尝试在非工作时段发起转账", "agent_id", evalCtx.Subject.AgentID, "amount", evalCtx.Resource.Amount, "hour", hour) return &DecisionResult{ Allowed: false, Reason: "非工作时间段(09:00-18:00),禁止后台自主 Agent 自动执行打款", RequireMFA: true, }, nil } // 校验额度与网络属性 if evalCtx.Resource.Amount > 100000.0 { if !evalCtx.Environment.IsMFAValid { pe.logger.Warn("ABAC 拦截:单笔超过 10 万元需人工二次风控认证", "agent_id", evalCtx.Subject.AgentID, "amount", evalCtx.Resource.Amount) return &DecisionResult{ Allowed: false, Reason: "转账金额超出 Agent 自主授权阈值,已触发工单挂起并请求人工 MFA 审批", RequireMFA: true, }, nil } } } // 2. 默认最小权限原则通过 return &DecisionResult{ Allowed: true, Reason: "符合全部 ABAC 安全属性策略约束", }, nil }动态提权(Privilege Elevation)与人机协同闭环
当 ABAC 引擎做出RequireMFA: true的裁决时,不能简单粗暴地宣告任务失败。一个现代的多 Agent 协同系统必须具备状态保鲜(State Hydration)与长会话挂起能力:
- 分布式事务状态落盘:Agent 将当前的推导思路、上下文切片和待调用的工具载荷序列化保存至持久化存储,并设置 10 分钟 TTL 倒计时;
- 移动端协同审批流:系统向风控负责人发送企微或飞书卡片消息,附带详细的四维属性证据链(请求发起人、转账金额、收款方名称及大模型推导依据);
- 动态临时凭证颁发:人工审核通过后,系统签发一张具备 5 分钟有效期的短期风控动态 Token,Agent 携带该 Token 重新唤醒执行上下文,ABAC 引擎核验通过后放行。
总结:给失控的智能体套上智能缰绳
如果说 RBAC 是立在门口的一张固定出入证,那么 ABAC 就是全天候伴随在 Agent 身边的智能安全保镖。
在大模型从“只读聊天”向“自主调取企业生产工具”全面演进的当下,架构师必须清醒地意识到:单靠角色无法约束多变的物理世界。通过引入由主体、客体、动作与环境构成的 ABAC 动态防线,企业才能既释放多智能体的高效协同生产力,又在任何突发异常时牢牢握住安全与合规的绝对刹车权。