让 Amazon Bedrock AgentCore 网关可访问(仅通过 CloudFront)

发布: (2026年2月17日 GMT+8 03:21)
8 分钟阅读
原文: Dev.to

Source: Dev.to

Tags: aws, architecture, genai, cloud, security

aws architecture genai cloud security

Amazon Bedrock AgentCore Gateway 使得公开基于 GenAI 的 API 变得非常简单。
AWS 提供了一个官方模式,用于通过 CloudFront 附加自定义域名:

Client → CloudFront → AgentCore Gateway

官方文档:

对于许多使用场景,这种方式已经足够。
但如果需求更严格呢?

此端点只能通过特定的 CloudFront 分配访问。

这正是架构边界发挥作用的地方。

隐蔽的暴露问题

即使在:

  • CloudFront 位于前端
  • 附加了 AWS WAF
  • 配置了自定义域名

的情况下,底层的 AgentCore Gateway 服务端点仍然 公开可访问。CloudFront 充当的是反向代理,而不是严格的隔离边界。

AgentCore 支持 基于资源的策略,主要控制 可以调用网关(IAM 主体、AWS 账户以及受支持的条件键)。这种模型非常适合内部服务间的通信,但对于面向公众的 API:

  • 外部消费者 使用 IAM 进行身份验证。
  • 身份验证通常依赖 OAuth、JWT、API 密钥或自定义 Header。
  • 为了合法用户的使用,端点必须保持可被互联网访问。

因此,即使合法流量通过 CloudFront,底层的 Gateway 端点仍可能直接从互联网访问,除非引入额外的控制措施。基于 IAM 的限制并不能消除这种暴露,因为服务端点本身仍然是公开的。对于需要严格入口隔离的环境,这就是一个关键缺口。

将其与 S3 + CloudFront(OAI / OAC)进行比较

Amazon S3 提供了一种原生的强制访问机制:只有 CloudFront 可以访问该存储桶。通过 源访问身份(OAI)源访问控制(OAC),可以将 S3 存储桶设为私有,并仅限特定的 CloudFront 分配访问。

示例 S3 存储桶策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowCloudFrontAccessOnly",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E123ABC456XYZ"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-private-bucket/*"
    }
  ]
}

在此模型中:

  • 存储桶 不是 公共的。
  • 直接的互联网访问会失败。
  • 仅允许 CloudFront 身份访问。

AgentCore 目前 提供等价的隔离构造,因此需要引入额外的边界。

Source:

强制仅通过 CloudFront 访问的架构

强制仅通过 CloudFront 访问的架构

示例:

  • 公共入口点: ext-clients-api-57x9abc.mycompany.com
  • 下游所需的 Host 头部: gw-abc123.gateway.bedrock-agentcore.us-east-1.amazonaws.com

在网络层强制仅使用 CloudFront

Application Load Balancer (ALB) 可以被公开访问,但它并不需要直接对开放的互联网可达。可以使用 AWS Managed Prefix Lists for CloudFront 来限制入站流量:

AWS 维护一个包含 CloudFront origin‑facing IP 范围的托管前缀列表。将此托管前缀列表附加到 ALB 的安全组,并仅允许来自以下来源的入站 HTTPS:

com.amazonaws.global.cloudfront.origin-facing

实现效果

  • 只有 CloudFront 边缘位置能够与 ALB 建立 TCP 连接。
  • 直接的互联网流量在安全组层面被阻断。
  • IP 欺骗无法绕过此限制。

如果没有 CloudFront,ALB 将不可达,从而在网络层形成真正的强制边界。

AWS WAF 与 DDoS 防护的定位

CloudFront(边缘层)

CloudFront 自动受到 AWS Shield Standard 保护,在边缘提供 DDoS 缓解。附加到 CloudFront 的 AWS WAF 可以提供:

  • 基于速率的规则(防滥用和抓取保护)
  • IP 信誉过滤
  • 地理位置限制
  • AWS 托管规则组
  • AWS Bot Control
  • 账户接管防护(ATP)
  • 身份验证字段检查
  • 请求头验证
  • 负载大小限制

恶意流量在到达基础设施之前被过滤。

ALB(入口层)

AWS WAF 也可以附加到 ALB,以实施:

  • 验证必需的自定义请求头(例如由 CloudFront 注入的秘密请求头)
  • 更靠近服务的额外速率限制或 Bot 控制
  • 防御绕过 CloudFront 规则的应用层攻击

这些层共同提供深度防御姿态,满足“仅 CloudFront” 的要求,同时仍向合法用户公开面向公众的 API。

由 CloudFront 注入的秘密请求头

  • 严格的 Host 请求头验证
  • 额外的托管规则组
  • 身份验证流程检查

即使 ALB DNS 名称被发现:

  • 直接连接尝试因托管前缀列表限制而失败。
  • 伪造请求因请求头验证和 WAF 规则而失败。

强制执行层

  1. 边缘 – Shield + WAF
  2. 网络 – 托管前缀列表限制
  3. 应用 – ALB WAF + 监听器规则

技术挑战:TLS 与 Host Header

AgentCore 前放置 ALB 时:

  • ALB 必须使用 自定义域名 的证书终止 TLS,例如:

    ext-clients-api-57x9abc.mycompany.com
  • 下游路由可能需要不同的 HTTP Host 头,例如:

    gw-abc123.gateway.bedrock-agentcore.us-east-1.amazonaws.com

它们属于不同的协议层:

目的
TLS (SNI)控制证书验证
HTTPHost 头控制路由逻辑

AgentCore 支持接受任意自定义域名的入站请求,因此必须在流量到达 AgentCore 之前解决此不匹配。

解决方案:CloudFront 源修改

CloudFront Functions 可以修改:

  • domainName – 用于 TLS/SNI 的源连接主机名
  • hostHeader – 发送到源的 HTTP Host 头

示例函数

import cf from 'cloudfront';

const ORIGIN_DOMAIN_NAME = 'ext-clients-api-57x9abc.mycompany.com';
const OVERRIDE_HOST_HEADER = 'gw-abc123.gateway.bedrock-agentcore.us-east-1.amazonaws.com';

function handler(event) {
  const request = event.request;

  cf.updateRequestOrigin({
    domainName: ORIGIN_DOMAIN_NAME,
    hostHeader: OVERRIDE_HOST_HEADER
  });

  return request;
}

这使得:

  • 对 ALB 证书进行 TLS 验证。
  • 根据所需的 Host 头对 ALB 进行路由。
  • 外部客户端仅与自定义域交互。
  • AgentCore 只能通过受控的 CloudFront → ALB → PrivateLink 路径访问。

最终结果

架构提供:

  • 自定义域名支持
  • 边缘级 DDoS 防护(Shield Standard)
  • 高级 WAF 防护(速率限制、ATP、机器人控制、托管规则)
  • 网络级仅 CloudFront 强制执行
  • ALB 的入口验证
  • 通过 VPC 端点(PrivateLink)的私有连接
  • 对 GenAI 工作负载的强入口隔离

默认的 AWS 模式非常适合标准部署。
当需要严格的仅 CloudFront 可达性时,需要设置架构边界。

CloudFront + 托管前缀列表 + ALB + PrivateLink + 分层 WAF 提供了该边界。

0 浏览
Back to Blog

相关文章

阅读更多 »

n8n 是纯粹的精彩

!Miguel Valdeshttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2...