用 Amazon Bedrock AgentCore Gateway 给 MCP 服务器加一道生产级安全网

2026-06-02 20 预计阅读时间:1 分钟
来源:aws.amazon.com AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:13 分钟

Model Context Protocol(MCP)正在快速成为 AI Agent 调用外部工具的标准协议,但把 MCP 服务器从开发环境推向生产,问题立刻浮现:谁有权调用哪个工具?调用日志怎么追踪?敏感数据会不会被 Agent 不小心外泄?散落在各处的 API Key 又该怎么统一管理?

Amazon Bedrock AgentCore Gateway 正是为了解决这些痛点而生——它部署在 MCP 客户端与 MCP 服务器之间,像一个带审计、鉴权和凭证保险箱的智能反向代理,把原本需要每个 MCP 服务器各自实现的安全与运维能力,收拢到一个中心化网关。

MCP 生产化的四大难题

先看没有网关时,企业部署 MCP 服务器会遇到什么:

  1. 访问控制粗放——MCP 协议本身没有细粒度权限模型,客户端连上服务器就能调用所有工具。不同团队、不同 Agent 应该只能访问各自被授权的工具集合,但原生 MCP 做不到。
  2. 可观测性缺失——哪个 Agent 在什么时间调了哪个工具、返回了什么结果?没有统一日志,排查问题只能靠各服务器自己打印的 stdout。
  3. 数据外泄风险——Agent 可能把内部数据库查询结果直接喂给外部 LLM,敏感字段在不知不觉中流出。MCP 服务器本身没有内置防泄漏机制。
  4. 凭证管理碎片化——每个 MCP 服务器各自存储自己调下游 API 用的 Key,轮换、审计、权限回收全靠人工,规模大了根本管不住。

AgentCore Gateway 把这四件事一次性收进网关层处理,MCP 服务器本身只需要专注实现工具逻辑。

网关的工作原理

AgentCore Gateway 的定位很清晰:MCP 客户端不直连 MCP 服务器,而是连网关;网关再代理到后端 MCP 服务器集群。 在这个代理过程中,网关完成四件事:

  • 鉴权与授权——客户端请求先过网关的 OAuth 2.0 / IAM 鉴权,再按策略决定能访问哪些工具。
  • 凭证注入——后端 MCP 服务器需要的 API Key、数据库密码等,由网关从 AWS Secrets Manager 或 IAM Role 动态获取并注入请求,服务器本身不再存储任何凭证。
  • 调用审计——每次工具调用的入参、出参、耗时、调用者身份,网关统一记录到 CloudWatch Logs / CloudTrail,团队维度可观测。
  • 数据防护——网关可对返回内容做字段级过滤或脱敏,阻断敏感数据流向未经授权的客户端。

这意味着 MCP 服务器开发者只需要实现 tools/listtools/call 的业务逻辑,安全与运维全部上移到网关。

实操:把一个 MCP 服务器接入 AgentCore Gateway

下面用一个最小示例演示完整流程。假设你有一个查询内部知识库的 MCP 服务器,想通过网关对外暴露,且只允许特定团队访问。

第一步:创建 AgentCore Gateway

aws bedrock-agentcore create-gateway \
  --gateway-name knowledge-base-gateway \
  --role-arn arn:aws:iam::123456789012:role/AgentCoreGatewayRole \
  --auth-type IAM \
  --region us-east-1

AgentCoreGatewayRole 需要具备以下权限:

  • 读取 Secrets Manager 中存储的后端 API Key
  • 写 CloudWatch Logs
  • 调用你注册的 MCP 服务器对应的下游资源

第二步:注册 MCP 服务器到网关

aws bedrock-agentcore create-gateway-mcp-server \
  --gateway-id myGatewayId \
  --mcp-server-name internal-kb-server \
  --server-url https://kb-mcp.internal.example.com:8080/sse \
  --description "查询内部知识库的 MCP 服务器" \
  --credential-provider-type SECRETS_MANAGER \
  --secrets-manager-secret-id kb-api-key-secret \
  --region us-east-1

关键参数说明:

  • --server-url:你的 MCP 服务器 SSE 端点地址。网关通过 SSE 协议与后端 MCP 服务器通信。
  • --credential-provider-type SECRETS_MANAGER:告诉网关从 Secrets Manager 取凭证,而不是让 MCP 服务器自己持有 Key。
  • --secrets-manager-secret-id:存储后端 API Key 的 Secret ID。

第三步:配置工具级访问策略

网关支持按工具名做白名单授权。以下策略只允许 search-team 调用 search_knowledge_base 工具,禁止访问 delete_document

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::123456789012:role/search-team-role" },
      "Action": "bedrock-agentcore:InvokeMcpTool",
      "Resource": "arn:aws:bedrock-agentcore:us-east-1:123456789012:gateway/myGatewayId/mcp-server/internal-kb-server/tool/search_knowledge_base"
    },
    {
      "Effect": "Deny",
      "Principal": { "AWS": "arn:aws:iam::123456789012:role/search-team-role" },
      "Action": "bedrock-agentcore:InvokeMcpTool",
      "Resource": "arn:aws:bedrock-agentcore:us-east-1:123456789012:gateway/myGatewayId/mcp-server/internal-kb-server/tool/delete_document"
    }
  ]
}

第四步:客户端通过网关调用

MCP 客户端不再直连 kb-mcp.internal.example.com,而是连网关提供的统一端点:

from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

# 通过网关端点连接,而非直连 MCP 服务器
# 网关地址在 create-gateway 返回结果中获取
gateway_url = "https://agentcore-gateway.us-east-1.amazonaws.com/gateway/myGatewayId/sse"

# 使用 boto3 签名请求(IAM 鉴权模式)
import boto3
session = boto3.Session()
credentials = session.get_credentials()

# 实际项目中可使用 AWS 提供的 MCP Gateway SDK,
# 它会自动处理 SigV4 签名和 SSE 连接
# 这里展示核心调用逻辑
async with ClientSession(gateway_url, auth_headers={
    "X-Amz-Security-Token": credentials.token,
    "Authorization": f"AWS4-HMAC-SHA256 Credential=...",
}) as client:
    # 只能看到被授权的工具
    tools = await client.list_tools()
    print(f"可用工具: {[t.name for t in tools.tools]}")

    # 调用搜索工具——凭证由网关自动注入到后端服务器
    result = await client.call_tool("search_knowledge_base", {
        "query": "Q3 营收数据",
        "limit": 5
    })
    print(result)

运行前需要:

  1. 确保本机 AWS CLI 已配置好 search-team-role 的凭证(或通过环境变量/实例角色获取)。
  2. 安装 mcp Python SDK:pip install mcp
  3. 网关的 IAM 鉴权需要 SigV4 签名,生产环境建议直接用 AWS 提供的 MCP Gateway 客户端 SDK,避免手写签名逻辑。

凭证管理的实际收益

把凭证从 MCP 服务器剥离出来,收益不只是"少存一个 Key":

场景 无网关 有网关
Key 轮换 逐个服务器改配置、重启 Secrets Manager 自动轮换,网关实时取新值,服务器无感知
权限回收 删除服务器上的 Key,但可能还有缓存 IAM Policy 一条 Deny 即刻生效
跨团队共享 各团队各自存 Key,副本散落 网关按角色注入,团队永远不接触原始凭证
审计谁用了什么 Key 只能看服务器日志,无法关联到调用者身份 CloudTrail 记录调用者 IAM 身份 + 所用凭证

数据防护:网关层的脱敏过滤

AgentCore Gateway 还支持对 MCP 工具返回内容做字段级脱敏。例如知识库返回的文档中包含员工社保号,网关可以在代理层自动将这类字段替换为 ***REDACTED***,Agent 永远看不到原始值。

配置方式是在网关策略中附加数据过滤规则(具体语法以 AWS 官方文档为准):

{
  "dataProtection": {
    "redactionRules": [
      {
        "fieldPattern": "ssn|social_security_number",
        "action": "REDACT",
        "replacement": "***REDACTED***"
      },
      {
        "fieldPattern": "internal_ip_address",
        "action": "MASK",
        "maskChar": "x",
        "keepPrefix": 2
      }
    ]
  }
}

这样即便后端 MCP 服务器返回了完整数据,网关在转发给客户端前会自动清洗,从架构层面堵住数据外泄通道。

上线前的检查清单

把 MCP 服务器接入 AgentCore Gateway 之前,建议逐项确认:

  • MCP 服务器已剥离所有硬编码凭证——改用环境变量引用或完全依赖网关注入,确保服务器代码中不再出现任何 API Key。
  • 网关 IAM Role 权限最小化——只赋予读取所需 Secret、写日志、调用特定下游资源的权限,不做宽泛授权。
  • 工具级策略已覆盖所有敏感操作——写操作、删除操作、批量导出操作必须显式 Deny 不需要的团队。
  • 数据脱敏规则已覆盖已知敏感字段——至少包含 PII(姓名、身份证、手机号)和内部网络信息(IP、主机名)。
  • CloudWatch Logs 日志保留期已设置——根据合规要求配置保留天数,避免审计日志过早过期。
  • 客户端 SDK 版本兼容——确认使用的 MCP Gateway 客户端 SDK 支持你网关配置的鉴权类型(IAM 或 OAuth 2.0)。

权衡与边界

AgentCore Gateway 不是万能的,有几个现实边界需要正视:

  • 额外延迟——请求多经过一层代理,典型增加 10-30ms。对实时交互场景影响不大,但对高频细粒度工具调用(比如每秒数十次的向量检索)需要做延迟测试。
  • 网关可用性——所有 MCP 调用都依赖网关存活,网关成为单点。AWS 托管服务本身有多区域冗余,但你仍需在客户端侧设计重试与降级逻辑。
  • 脱敏规则的维护成本——敏感字段模式需要持续更新,新业务引入新字段类型时,脱敏规则容易滞后。建议把规则纳入代码审查流程,而非只靠运维手动配置。
  • 只覆盖 MCP 协议——如果你的 Agent 还通过非 MCP 方式调用外部服务(比如直调 REST API),那些路径不在网关保护范围内,需要另行治理。

总的来说,AgentCore Gateway 把 MCP 生产化中最棘手的安全与运维问题收拢到了一个可控的平面。对于已经在内部部署了多个 MCP 服务器、且需要跨团队共享的团队,它是一个值得优先评估的方案——先把凭证和权限收进来,再逐步补上脱敏和审计规则,比在每个 MCP 服务器里各自造轮子要高效得多。


相关推荐