首页 › AI Agent › Agent100道面试题 › 工具使用tool-use › 如何设计 Tool Gateway 和工具权限管理?

如何设计 Tool Gateway 和工具权限管理?

难度:中级 分类:Tool Use​

简短回答​

Tool Gateway 是 Agent 与工具之间的安全中间层——Agent 不直接调用工具,所有请求都经过 Gateway 做身份验证、权限检查、速率限制和审计日志。核心设计原则是最小权限(Least Privilege)和将 Agent 视为不可信请求者。权限管理采用 Policy-as-Code(如 OPA/Cedar)将授权逻辑外部化,配合 RBAC/ABAC 做细粒度控制。​

详细解析​

为什么需要 Tool Gateway?​

没有 Gateway 的架构中,Agent 直接持有 API 密钥并调用外部服务。风险包括:​

•

Agent 被 Prompt Injection 操纵,调用不该调用的工具​

•

Agent 无意中执行破坏性操作(删除数据、发送未经审核的消息)​

•

无法追踪和审计 Agent 的行为​

•

凭证暴露在 Agent 的上下文中​

Gateway 架构​

​

飞书文档 - 图片

​

Agent 不持有任何凭证:每次调用都被 Gateway 逐层拦截——鉴权、权限、校验、限流、审计、过滤。​

关键原则:Agent 永远不直接与基础设施 API 通信。 Gateway 拦截每个请求,做验证、授权、执行。Agent 不持有任何凭证。​

​

代码块​

Python

class ToolGateway:​

def __init__(self, policy_engine, rate_limiter, audit_logger):​

self.policy = policy_engine # OPA / Cedar​

self.limiter = rate_limiter​

self.logger = audit_logger​

self.tools = {} # 注册的工具​

​

async def execute(self, agent_id: str, tool_name: str, params: dict) -> dict:​

# 1. 身份验证​

agent = await self.authenticate(agent_id)​

​

# 2. 权限检查​

decision = self.policy.evaluate({​

"agent": agent,​

"tool": tool_name,​

​

权限模型​

RBAC(基于角色的访问控制)​

​

代码块​

Python

# 角色定义​

roles = {​

"reader_agent": {​

"allowed_tools": ["search_docs", "get_weather", "calculate"],​

"denied_tools": ["send_email", "delete_record", "execute_sql"],​

},​

"support_agent": {​

"allowed_tools": ["search_docs", "get_order", "create_ticket"],​

"denied_tools": ["delete_record", "modify_pricing"],​

},​

"admin_agent": {​

"allowed_tools": ["*"], # 全部权限​

"requires_approval": ["delete_*", "modify_*"], # 高危操作需审批​

​

ABAC(基于属性的访问控制)​

更细粒度——基于请求的上下文属性做决策:​

​

代码块​

C++

# OPA Policy (Rego 语言)​

# policy.rego​

"""​

package tool_access​

import rego.v1 # OPA 1.0+ 必需;老版本用 import future.keywords.in​

​

default allow = false​

​

# 工作时间内允许发送邮件​

allow {​

input.tool == "send_email"​

input.context.hour >= 9​

​

委托授权(Delegated Authorization)​

Agent 的权限不应超过委托它的用户的权限:​

​

代码块​

Python

class DelegatedAuth:​

def check(self, agent: Agent, tool: str, params: dict) -> bool:​

# Agent 的权限 = min(Agent 角色权限, 委托用户权限)​

agent_allowed = self.check_agent_role(agent.role, tool)​

user_allowed = self.check_user_permission(agent.delegated_user, tool)​

​

# 两者都允许才放行​

return agent_allowed and user_allowed​

​

关键原则:人类用户常常被过度授权,Agent 的权限应该独立审查,不能简单继承用户的全部权限。​

Human-in-the-Loop 审批​

​

代码块​

Python

class ApprovalGateway:​

HIGH_RISK_TOOLS = ["send_email", "delete_record", "transfer_funds"]​

​

​

多 Agent 场景的权限挑战​

多 Agent 工作流中,权限管理更复杂:​

•

Agent A 可能把任务委托给 Agent B​

•

Agent B 的权限不应超过 Agent A​

•

需要追踪完整的委托链​

​

代码块​

Python

# 委托链追踪​

class DelegationChain:​

def validate_delegation(self, from_agent, to_agent, tool):​

# to_agent 的权限不能超过 from_agent​

if not self.is_subset(to_agent.permissions, from_agent.permissions):​

raise PermissionError("被委托 Agent 权限不能超过委托者")​

​

运行时护栏​

除了权限控制,还需要内容级别的护栏:​

​

代码块​

Plain Text

输入护栏:扫描用户输入是否有恶意意图、越狱尝试、PII​

↓​

Agent 处理​

​

治理流水线模式​

将策略更新像软件发布一样管理:​

安全/法律团队编写策略 → 翻译为机器可读代码​

对历史日志做影响分析(模拟部署)​

确认无误后自动部署到全部 Agent​

常见误区 / 面试追问​

误区:"在 Agent 代码里做权限检查就够了" — Agent 代码可能被 Prompt Injection 绕过。权限检查必须在 Agent 外部(Gateway 层)执行,作为独立的安全边界。​

误区:"给 Agent 和用户一样的权限" — 用户常常被过度授权。Agent 应该只获得完成当前任务所需的最小权限集。​

追问:"Policy-as-Code 有什么好处?" — (1) 授权逻辑与应用代码分离,安全团队可以独立管理;(2) 策略可以版本控制和审计;(3) 策略变更不需要重新部署应用代码。​

追问:"AWS Bedrock 的 Policy 和自建 Gateway 有什么区别?" — 云服务商的方案(如 Bedrock AgentCore Policy)在 Agent 代码外部执行安全控制,开箱即用但绑定生态。自建 Gateway 更灵活但需要维护,适合多云或自托管场景。​