细粒度控制 Agent 权限

更新时间:
复制为 MD 格式

AI Agent 调用外部工具时默认拥有全部访问权限,存在越权操作风险。通过 Agent Identity 策略集,可对 Agent 的 MCP 工具调用行为实施基于主体、资源和操作条件的细粒度权限管控。本教程以订单管理场景为例,演示如何创建函数计算后端服务、通过 AI 网关暴露为 MCP 工具,并配置 Agent Identity 策略集控制工具调用权限。

架构

image

完整流程概览:

  1. 在本地搭建并验证 Agent 应用。

  2. 将后端业务接口部署到函数计算,并通过 AI 网关暴露为 MCP 工具。

  3. 配置 Agent 使用 AI 网关 MCP 服务,验证工具调用正常。

  4. 创建 Agent Identity 策略集,并配置策略。

  5. 验证策略生效:允许的操作正常执行,受限的操作被拦截。

准备工作

环境要求

本地测试环境需要安装Python(版本≥ 3.10)以及pip包管理器

RAM用户及权限要求

您需要准备一个RAM用户用于执行准备脚本、本地应用测试。脚本执行用户需要具备以下权限:

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "agentidentity:*",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "agentidentitydata:*",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "ram:CreateServiceLinkedRole",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "ram:ServiceName": ["agentidentity.aliyuncs.com"]
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": [
        "ram:CreateApplication",
        "ram:CreateRole", 
        "ram:CreatePolicy",
        "ram:AttachPolicyToRole", 
        "ram:CreateAppSecret",
        "ram:DeleteApplication",
        "ram:ListUserBasicInfos",
        "ram:ListRoles"
      ],
      "Resource": "*"
    }
  ]
}

百炼API密钥

获取具有百炼模型调用权限的 DashScope API 密钥。如未创建,参考获取API Key 进行创建和配置。

步骤一:本地安装与测试应用

参考在百炼高代码中使用Agent Identity教程的步骤一,确保应用在本地测试成功。

步骤二:创建并配置函数计算

创建函数实例

  1. 登录函数计算FC控制台

  2. 在左侧导航栏选择函数管理 > 函数列表,单击创建函数

  3. 选择最适合你的函数类型窗口中,保持默认的Web函数页签,单击创建Web函数

  4. 创建Web函数页面,配置以下参数:

    • 函数名称:输入该函数名称,例如order-service-fc

    • 运行环境:选择自定义运行时/Linux/Debian 10

    • 启动命令python3 app.py

    • 监听端口:9000

    其余参数保持默认。

    20260327094236

  5. 单击创建。创建完成后自动跳转至函数详情页。

配置函数实例

  1. 在函数详情页,切换到代码页签下。将示例代码替换为以下代码:

    import json
    from flask import Flask
    from flask import request
    
    app = Flask(__name__)
    
    @app.route('/', defaults={'path': ''})
    @app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
    def hello_world(path):
            data = request.stream.read()
            print("Path: " + path)
            print("Data: " + str(data))
            response = {}
            if path == 'create-order':
                    param = json.loads(data)
                    response = {
                            'status': 'Done',
                            'orderId': param['orderId'],
                            'amount': param['amount']
                    }
            elif path == 'get-order':
                    param = json.loads(data)
                    response = {
                            'status': 'Done',
                            'orderId': param['orderId'],
                            'amount': 500
                    }
            elif path == 'add-budget':
                    param = json.loads(data)
                    response = {
                            'status': 'Done',
                            'year': param['year'],
                            'amount': param['amount'],
                            'reason': param['reason']
                    }
    
            return json.dumps(response)
    
    if __name__ == '__main__':
            app.run(host='0.0.0.0',port=9000)
    
  2. 单击部署代码按钮,等待控制台提示部署成功。

  3. 切换到触发器页签,单击操作列的编辑

  4. 编辑触发器defaultTrigger面板中,将认证方式切换为无需认证。单击确定

  5. 拷贝触发器页签下的内网访问地址公网访问地址,后续步骤需要使用。

测试函数实例

复制触发器页签下的公网访问地址,在本地终端执行以下命令(将<your-fc-public-facing-url>替换为实际的公网访问地址)。

curl -X GET "<your-fc-public-facing-url>/get-order" \
  -H "Content-Type: application/json" \
  -d '{"orderId":"ord-001"}'

预期输出:

{"status": "Done", "orderId": "ord-001", "amount": 500}

(可选)禁用公网访问

通过公网地址测试函数正常后,建议禁用公网访问,仅保留内网访问。

  1. 在函数详情页触发器页签下,单击操作列的编辑

  2. 编辑触发器defaultTrigger面板中,开启禁用公网访问URL。单击确定

    image

步骤二:创建并配置AI网关

创建AI网关实例

  1. 登录AI网关控制台。在实例列表页单击创建实例

  2. 在购买页面配置以下参数:

    • 商品类型:选择专享实例(按量付费)

    • 地域:选择华北2(北京)(当前Agent Identity仅在北京地域提供服务)。

    • 网关名称:输入网关名称,例如test-ai-gateway

    • 网络访问类型:选择公网

    • 专有网络:选择网关实例运行所在的专有网络。

    • 交换机:选择网关实例运行的交换机。

    • 日志服务:勾选使用日志服务(SLS)

    其余参数保持默认。

    Snipaste_2026-03-30_14-01-36

  3. 单击立即购买,等待实例创建完成。

更多配置说明,请参见创建网关实例

创建服务

  1. AI网关实例概览页,单击左侧导航栏的服务,单击创建服务

  2. 创建服务面板中,配置以下参数:

    Snipaste_2026-03-30_14-22-36

  3. 单击确定。稍等片刻,服务的健康检查状态应显示为健康

    image

创建MCP服务

  1. AI网关实例概览页,选择左侧导航栏的MCP管理

  2. 单击创建MCP服务,配置以下参数:

    • 名称:输入MCP服务名称,例如order-service-mcp

    • 协议:选择HTTPMCP

    • 后端服务:选择在创建服务步骤中创建的服务。

    • 描述:输入 MCP 服务的功能描述。

    • MCP接入点:单击添加域名,输入自定义域名(如order-service.<your-domain>.com),单击创建。在域名下拉框中选择创建的域名。

      说明

      如仅用于测试,该域名不需要真实存在。如需通过自定义域名访问 MCP 服务,还需在域名 DNS 服务中添加 CNAME 记录,指向网关访问入口地址(AI网关的公网域名)。

    其余参数保持默认。

    image

  3. 单击保存并发布

添加并调试MCP工具

  1. 单击创建的MCP服务,在MCP服务详情页的基本信息页签,单击添加工具

  2. 创建工具面板中,选择编辑方式为自定义YAML

  3. 将以下 YAML 内容粘贴至配置框中。将 requestTemplateurl 中的 <your-fc-app-internal-facing-url>(共 3 处)替换为函数实例的内网访问地址。https://http:// 的内网地址均可使用;如使用 http:// 地址,需将端口号改为 80

    server:
      name: order-service-mcp
      allowTools:
        - create-order
        - get-order
    tools:
      - name: create-order
        description: Create a new order with specific amount
        args:
          - name: orderId
            description: The unique ID of the order
            type: string
            required: true
            position: body
          - name: amount
            description: The amount of money for the order
            type: number
            required: true
            position: body
        requestTemplate:
          url: <your-fc-app-internal-facing-url>:443/create-order
          method: POST
          argsToJsonBody: true
        responseTemplate:
          body: |
            # Order Created
            - **Status**: {{.status}}
            - **Order ID**: {{.orderId}}
            - **Confirmed Amount**: {{.amount}}
      - name: get-order
        description: Retrieve order details by ID
        args:
          - name: orderId
            description: The ID of the order to search
            type: string
            required: true
        requestTemplate:
          url: <your-fc-app-internal-facing-url>:443/get-order
          method: POST
          argsToJsonBody: true
        responseTemplate:
          body: |
            # Order Details
            - **Status**: {{.status}}
            - **Order ID**: {{.orderId}}
            - **Amount**: {{.amount}}
      - name: add-budget
        description: Allocates additional budget to an existing project or budget entity.
        args:
          - name: year
            description: The year of budget
            type: string
            required: true
          - name: amount
            description: The amount of money for the budget
            type: number
            required: true
            position: body
          - name: reason
            description: The reason of budget
            type: string
            required: true
        requestTemplate:
          url: <your-fc-app-internal-facing-url>:443/add-budget
          method: POST
          argsToJsonBody: true
        responseTemplate:
          body: |-
            # Budget Details
            - **Status**: {{.status}}
            - **Year**: {{.year}}
            - **Amount**: {{.amount}}
            - **Reason**: {{.reason}}
    
  4. 单击确定

  5. 单击MCP服务详情页右上角的调试。工具列表中应显示 3 个工具:create-orderget-orderadd-budget。单击任一工具并输入参数值进行测试,应返回成功结果。

    Snipaste_2026-03-30_15-08-25

  6. 回到MCP服务详情页,在右侧连接MCP服务区域,单击域名下拉菜单选择默认域名,复制Streamable HTTP页签下的完整 URL,后续步骤需要使用。

    image

步骤三:配置并测试Agent应用

完成 AI 网关和 MCP 服务配置后,可以将 Agent 代理指向 AI 网关 MCP 服务地址,验证 Agent 能否正常调用 MCP 工具。

配置Agent代理使用AI网关MCP服务

  1. 执行以下命令,将在添加并调试MCP工具步骤中获取的 MCP 服务 URL 配置为本地环境变量:

    export AI_GATEWAY_MCP_SERVER="<your-ai-gateway-mcp-server-url>"
  2. 在本地端到端示例目录(agent-identity-dev-kit/agent_identity_python_samples/end-to-end_sample)下的.config.json文件中,找到workload_identity_name的值并复制。执行以下命令将工作负载名称配置为环境变量:

    export AGENT_IDENTITY_WORKLOAD_IDENTITY_NAME="<your-workload-identity-name>"

测试应用

  1. 打开终端,在项目根目录agent-identity-dev-kit下执行以下命令切换到fetch-workload-access-token_sample目录:

    cd agent_identity_python_samples/fetch-workload-access-token_sample
  2. 安装依赖。建议创建并激活一个 Python 虚拟环境,然后安装项目所需的依赖。

    pip install -r requirements.txt
  3. fetch-workload-access-token_sample目录下,执行以下命令启动Agent:

    python -m deploy_starter.main
  4. 启动另一个终端,在项目根目录agent-identity-dev-kit执行以下命令切换到 end-to-end_sample 目录,并启动前后端应用:

    cd agent_identity_python_samples/end-to-end_sample
    python -m application.backend.app
  5. 等待服务启动完成后,在浏览器中访问 http://localhost:8090

  6. 完成阿里云登录及用户授权后,在对话窗口中与模型交互,例如输入:"查询订单:ord-001",如应用工作正常将返回订单详情,订单数据来自通过AI网关发布的MCP服务。

    image

步骤四:创建并配置Agent Identity策略集

创建策略集

登录Agent Identity控制台,参考创建策略集中的步骤创建策略集,

创建并配置策略

  1. 在策略集列表中,找到目标策略集,单击其名称。

  2. 在策略集详情页,单击策略内容页签下的编辑策略内容

  3. 编辑器将自动新增一个策略并预填充名称。在策略编辑页面完成以下配置:

    • 策略名称:保持默认或修改为更具语义的名称,如allow-get-order-action

    • 策略语句

      • 效果:选择允许

      • 主体:选择指定主体。在主体类型下拉菜单中选择OAuth用户

      • 资源:选择之前创建的 AI 网关。

      • 操作:选择指定操作。单击编辑操作,勾选get-orderMCP工具。单击确定

        image

  4. 单击编辑策略内容页面下的新增策略,重复上述步骤创建第二条策略。在 操作 中勾选 create-order MCP 工具,并在条件下添加以下条件:

    • 条件键:选择操作入参amount

    • 条件运算符:选择<

    • 条件值:输入1000

      image

  5. 单击提交。策略集下现有两条策略:

    • allow-get-order-action:允许所有已认证用户调用get-order工具。

    • allow-create-order-with-condition:允许已认证用户调用 create-order 工具,但 amount 参数值必须小于 1000

      image

为策略集绑定AI网关

参考为策略集绑定AI网关中的步骤,将创建的AI网关与策略集绑定。执行模式设置为拦截模式

说明

在生产环境中,建议先设置为观察模式,通过 AI 网关的 SLS 日志监控一段时间,确认策略按预期生效后,再切换为拦截模式。

为工作负载身份配置策略相关权限

工作负载身份关联的 RAM 角色需要额外的策略评估权限,才能在运行时获取 Agent Identity 策略检查结果。

  1. 登录Agent Identity控制台。在左侧导航栏选择工作负载身份

  2. 工作负载身份列表页,找到配置Agent代理使用AI网关MCP服务步骤中配置的工作负载身份名称并单击。

  3. 在工作负载身份详情页,单击认证流程页签下的运行时RAM角色名称。

    image

  4. RAM角色详情页的权限管理页签下,单击已创建的自定义权限策略。

  5. 在权限策略详情页的策略内容页签下,单击编辑权限策略。在Statement数组新增以下策略块。

    {
      "Effect": "Allow",
      "Action": [
        "agentidentitydata:EvaluatePolicy",
        "agentidentitydata:SearchAuthorizedActions"
      ],
      "Resource": "*"
    }

    image

步骤五:验证策略效果

重新启动 Agent 代理服务和前后端应用并重新登录后,通过以下场景验证策略是否按预期生效。

测试查询订单(get-order)

在对话窗口中输入:"查询订单:ord-001"。Agent 调用 get-order 工具,策略允许该操作,预期正常返回订单详情。

测试创建订单 — 金额超出限制(create-order,amount ≥ 1000)

在对话窗口中输入:"创建订单,订单号 ord-002,金额 1500"。Agent 调用 create-order 工具时,因 amount 参数值不满足小于 1000 的条件限制,策略拒绝该操作。窗口中返回具体报错信息(403 Forbidden)。

image

测试创建订单 — 金额在限制范围内(create-order,amount < 1000)

在对话窗口中输入:"创建订单,订单号 ord-002,金额 900"。Agent 调用 create-order 工具,amount 参数值满足条件限制,策略允许该操作,预期正常返回创建成功的订单信息。

image

步骤六(可选):部署Agent至百炼高代码

参照在百炼高代码中使用Agent Identity中的步骤二和步骤三,将Agent部署至百炼高代码平台。