策略说明
智能体身份(Agent Identity)服务的权限策略基于Cedar 策略语言,为您提供对 AI Agent 出站调用(如访问 MCP Servers)的细粒度权限管理。通过定义策略,您可以精确控制"谁(主体)在什么条件下,可以(或不可以)对什么资源执行什么操作"。
核心概念
理解以下概念有助于您更好地配置和管理权限策略:
策略:权限控制的基本单元。每条策略定义了一组具体的授权规则。
策略集:策略的逻辑集合。策略集必须绑定到 AI 网关才能生效。一个网关只能绑定一个策略集,该策略集内的所有策略共同决定最终的授权结果。
AI 网关:策略执行点。所有 Agent 的出站调用请求都会经过网关进行权限评估。
策略评估逻辑
智能体身份服务的权限评估引擎基于策略语言 Cedar,遵循两大核心安全原则:
默认拒绝:在评估引擎没有找到任何适用策略来明确允许一个请求时,该请求将被默认拒绝。这确保了所有访问行为都必须被显式授权。
拒绝优先: 评估过程中,拒绝(
forbid)策略的优先级最高。评估流程如下:
引擎首先检查是否存在任何匹配请求的
forbid策略。如果存在,请求将立即被拒绝,评估终止。如果没有匹配的
forbid策略,引擎接着查找是否存在至少一条匹配的permit策略。如果存在,请求将被允许。如果既没有匹配的
forbid策略,也没有匹配的permit策略,则根据“默认拒绝”原则,请求被拒绝。
由于单个网关只能与单个策略集绑定,所有请求仅会被该策略集中的策略评估,不存在跨策略集的评估场景。
策略结构
一条完整的策略由 效果(Effect)、范围(Scope) 和 条件(Condition) 三部分组成。
// 1. 效果 (Effect) permit (允许) 或 forbid (禁止):
permit (
// 2. 范围 (Scope): 定义策略适用的主体、操作和资源
principal is AgentIdentity::OAuthUser,
action == AIGateway::Action::"mcp-servers.order-service.refund",
resource == AIGateway::Gateway::"acs:apig:cn-beijing:123...:gateway/gw-abc..."
)
// 3. 条件 (Condition): 基于请求上下文的细粒度过滤
when {
context.input.amount < 500
};效果 (Effect)
定义策略的最终意图。
permit:允许访问。forbid:禁止访问。只要有一条forbid策略匹配成功,请求就会被立即拒绝,其优先级高于所有permit策略。
范围 (Scope)
定义策略的适用边界,由主体(Principal)、操作(Action)和资源(Resource)三元组构成。只有当请求的主体、操作和资源信息与策略的范围完全匹配时,策略的条件和效果才会被评估。
主体 (Principal)
定义策略作用于“谁”,即发起授权请求的身份实体。支持指定以下三种类型的主体,分别对应获取Workload Access Token的三种方式。一条策略中仅能指定一种主体类型,或该主体类型下的单个主体对象(指定主体 ID 时)。
工作负载身份
适用场景:无用户参与,程序自动化。
示例:
principal == AgentIdentity::Workload::"acs:agentidentity:cn-beijing:{account_id}:workloadidentitydirectory/default/workloadidentity/test-workload-identity"。代表请求的身份实体为工作负载身份且名称为test-workload-identity时,匹配此策略。
OAuth用户
适用场景:有用户参与且用户可以通过IdP(兼容OIDC/OAuth2协议)完成登录。此为目前最主流的使用场景。
示例:
principal == AgentIdentity::OAuthUser::"iiCsOvhjNZX/hK0x1jl9****"。其中iiCsOvhjNZX/hK0x1jl9****为用户JWT令牌中的sub字段的值,可以唯一标识该用户。
自定义用户
适用场景:有用户参与但并非以OIDC协议进行身份认证。
示例:
principal == AgentIdentity::SimpleUser::"test-user1"。其中test-user1为在请求中申明的用户ID。
在指定主体类型时如省略填写主体ID,将应用策略于该类型的全部主体对象。例如语句principal is AgentIdentity::OAuthUser,代表策略将应用于所有主体类型为OAuthUser的请求。
操作 (Action)
定义主体试图执行的动作,如访问某个MCP服务或MCP服务下的某个工具。
格式:
mcp-servers.{服务名}.{工具名}示例:
action == AIGateway::Action::"mcp-servers.order-service.create-order"。代表请求MCP服务order-service下的create-order工具时,匹配此策略。多操作场景:如果需要匹配多个操作,可以使用
in操作符配合操作列表。例如:action in [AIGateway::Action::"mcp-servers.order-service.create-order", AIGateway::Action::"mcp-servers.order-service.get-order"]操作层级:支持指定网关、服务和工具三种层级的操作。指定网关或服务层级时,匹配当前层级下的所有操作。例如:
语句
action in AIGateway::Action::"mcp-servers",代表允许指定网关下的所有MCP服务工具。语句
action in AIGateway::Action::"mcp-servers.order-service",代表允许MCP服务order-service下的所有工具。
资源 (Resource)
被访问的对象,即请求的目标AI网关ARN。
示例:resource == AIGateway::Gateway::"acs:apig:cn-beijing:{account_id}:gateway/gw-d6rs7qem1hks769c****"。其中gw-d6rs7qem1hks769c****为AI网关的实例ID。
必须指定具体的网关资源,不支持为所有资源应用策略。
条件 (Condition)
可选元素,可以基于请求上下文为策略提供动态和精细的控制能力。条件子句紧跟在 Scope 之后条件子句紧跟在 Scope 之后,支持以下两种形式:
when:当表达式结果为true时,策略生效。unless:当表达式结果为true时,策略不生效(反向排除)。需要使用脚本编辑器设置。
请求上下文(context)
请求上下文对象包含可供策略动态判断的各类信息。当前支持的上下文属性及条件运算符如下表所示:
上下文属性 | 说明 | 运算符 | 示例 |
| 请求来源 IP 地址 |
|
|
| Agent Identity 中已创建的工作负载身份 |
|
|
| MCP 工具调用的输入参数 | 由输入参数的类型决定 |
|
| 是否通过 HTTPS 访问 |
|
|
逻辑操作符
支持使用逻辑操作符组合多个条件:
&&(AND):所有条件都必须满足。||(OR):满足任一条件即可。!(NOT):条件取反。
例如when { context.input.amount < 500 || ip(context.sourceIp).isInRange(ip("192.168.1.0/24")) }。
使用可视化策略编辑器指定多个条件时,逻辑操作符默认为&&。如需变更为其他逻辑操作符,请使用脚本编辑器。
创建策略
请参考向策略集中添加策略中的步骤。
常用策略示例
示例 1:基于MCP请求参数的访问控制
允许调用退款接口(refund),但限制单笔退款金额必须小于 500。
permit (
principal is AgentIdentity::OAuthUser,
action == AIGateway::Action::"mcp-servers.payment-service.refund",
resource == AIGateway::Gateway::"acs:apig:cn-beijing:{account_id}:gateway/{gateway_instance_id}"
)
when { context.input.amount < 500 };示例 2:基于 IP 白名单的访问控制
只允许来自特定内网网段(如 10.0.0.0/8,或企业出口公网IP网段)的请求访问敏感数据查询工具。
permit (
principal is AgentIdentity::OAuthUser,
action == AIGateway::Action::"mcp-servers.data-service.query",
resource == AIGateway::Gateway::"acs:apig:cn-beijing:{account_id}:gateway/{gateway_instance_id}"
)
when { ip(context.sourceIp).isInRange(ip("10.0.0.0/8")) };示例 3:允许特定用户调用MCP工具
允许sub值为 iiCsOvhjNZX/hK0x1jl9**** 的 OAuth 用户调用订单MCP服务下的create-order和get-order工具。
permit (
principal == AgentIdentity::OAuthUser::"iiCsOvhjNZX/hK0x1jl9****",
action in [AIGateway::Action::"mcp-servers.order-service.create-order", AIGateway::Action::"mcp-servers.order-service.get-order"],
resource == AIGateway::Gateway::"acs:apig:cn-beijing:{account_id}:gateway/{gateway_instance_id}"
);示例 4:明确禁止特定操作(黑名单)
禁止所有用户调用删除数据的接口。由于拒绝策略优先级最高,即使有其他允许策略,该操作也会被拒绝。
forbid (
principal,
action == AIGateway::Action::"mcp-servers.system-service.delete_data",
resource == AIGateway::Gateway::"acs:apig:cn-beijing:{account_id}:gateway/{gateway_instance_id}"
);示例 5:使用反向排除(Unless)
允许所有用户调用查询工具,但排除来自特定 IP(192.168.1.100)的请求。
permit (
principal,
action == AIGateway::Action::"mcp-servers.data-service.query",
resource == AIGateway::Gateway::"acs:apig:cn-beijing:{account_id}:gateway/{gateway_instance_id}"
)
unless {
ip(context.sourceIp) == ip("192.168.1.100")
};