策略说明

更新时间:
复制为 MD 格式

智能体身份(Agent Identity)服务的权限策略基于Cedar 策略语言,为您提供对 AI Agent 出站调用(如访问 MCP Servers)的细粒度权限管理。通过定义策略,您可以精确控制"谁(主体)在什么条件下,可以(或不可以)对什么资源执行什么操作"。

核心概念

理解以下概念有助于您更好地配置和管理权限策略:

  • 策略:权限控制的基本单元。每条策略定义了一组具体的授权规则。

  • 策略集:策略的逻辑集合。策略集必须绑定到 AI 网关才能生效。一个网关只能绑定一个策略集,该策略集内的所有策略共同决定最终的授权结果。

  • AI 网关:策略执行点。所有 Agent 的出站调用请求都会经过网关进行权限评估。

策略评估逻辑

智能体身份服务的权限评估引擎基于策略语言 Cedar,遵循两大核心安全原则:

  1. 默认拒绝:在评估引擎没有找到任何适用策略来明确允许一个请求时,该请求将被默认拒绝。这确保了所有访问行为都必须被显式授权。

  2. 拒绝优先: 评估过程中,拒绝(forbid)策略的优先级最高。评估流程如下:

    flowchart-policyevaluation

    • 引擎首先检查是否存在任何匹配请求的 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)

请求上下文对象包含可供策略动态判断的各类信息。当前支持的上下文属性及条件运算符如下表所示:

上下文属性

说明

运算符

示例

context.sourceIp

请求来源 IP 地址

isInRange (属于网段)
== (等于)
!= (不等于)

ip(context.sourceIp).isInRange(ip("192.168.1.0/24"))

context.agent

Agent Identity 中已创建的工作负载身份

== (等于)
!= (不等于)
like (模式匹配)

principal.actor like "*workload-identity-name*"

context.input

MCP 工具调用的输入参数

由输入参数的类型决定

context.input.amount < 1000

context.isHttps

是否通过 HTTPS 访问

==, !=

context.isHttps == true

逻辑操作符

支持使用逻辑操作符组合多个条件:

  • && (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-orderget-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")
};