通过限制访问优化和保护AWS HTTP API Gateway - SkildOps

作者:API传播员 · 2025-11-01 · 阅读时间:4分钟

通过限制访问优化和保护 AWS HTTP API Gateway 是提升 API 安全性的重要措施。本文将详细介绍如何通过 AWS HTTP API Gateway、CloudFront 和 Lambda 授权器的结合,限制对 API 的直接访问,从而有效防止潜在的攻击。


HTTP API 网关

AWS HTTP API 网关是一种经济高效的方式,用于快速部署 RESTful API,同时保持基本的安全性、性能、可扩展性和可观察性。然而,与 REST API 网关相比,HTTP API 网关缺少一些高级功能,例如 WAF 附件、资源策略、API 密钥管理、缓存、金丝雀部署、请求主体转换和 X-Ray 跟踪等。

为了提高安全性,我们需要限制对 HTTP API 网关 URL 的直接访问。以下是实现步骤:

  1. 创建 HTTP API 网关
    • 登录 AWS 管理控制台,导航到 API Gateway。
    • 启动新的 HTTP API 网关,点击“构建”按钮。
    • 点击 添加集成 按钮,选择 HTTP 作为集成类型,GET 作为方法类型。
    • 在 URL 端点中,输入一个模拟端点(例如使用 Beeceptor 创建的端点)。
    • 为 API 网关命名后,点击“下一步”并检查所有输入,确认无误后点击 创建 按钮。

配置 CloudFront

通过 CloudFront 创建分发版,可以进一步保护 API 网关。以下是配置步骤:

第 1 节:起源设置

  • 添加自定义标题 下,点击“添加标题”按钮。
  • 添加一个自定义标头,例如 x-cf-api-gateway-token,其值为一个随机字符串,用于验证请求。
  • 该标头将由 CloudFront 转发到 API 网关,并在下一步中通过 Lambda 授权器进行验证。

第 2 节:默认缓存行为

  • 保持 功能关联WAF设置 部分的默认值。
  • 创建分发版。

配置 Lambda 授权器

Lambda 授权器用于验证来自 CloudFront 的请求标头,从而限制对 API 网关的直接访问。

创建 IAM 角色

在创建 Lambda 函数之前,需要创建一个 IAM 角色,允许函数读取 SSM 参数:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

执行以下命令创建角色:

aws iam create-role --role-name api-cf-demo-role --assume-role-policy-document file://assume-role-policy-doc.json

为角色添加 SSM 访问权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ssm:GetParameter",
      "Resource": "arn:aws:ssm:aws_REGION:aws_ACCOUNT_ID:parameter/ssm_METER_NAME"
    }
  ]
}

执行以下命令应用策略:

aws iam put-role-policy --role-name api-cf-demo-role --policy-name ssm-access --policy-document file://ssm-access-policy.json

附加 Lambda 基本执行角色:

aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole --role-name api-cf-demo-role

创建 Lambda 函数

  • 导航到 Lambda 控制台,创建新函数。
  • 选择 Python 3.11 作为运行时,x86_64 作为架构。
  • 使用之前创建的 IAM 角色作为执行角色。

配置 Lambda 授权器

  • 在 API 网关页面,点击左侧面板中的 授权,切换到 管理授权者 选项卡。
  • 点击“创建授权者”,选择 Lambda 作为类型。
  • 输入授权者名称,选择 Lambda 函数及其区域。
  • 禁用 授权缓存,并删除预填充的 身份源
  • 确保 调用权限 开关已启用,以允许 API 网关调用 Lambda 函数。

测试实现

完成上述配置后,访问 API 网关和 CloudFront 的 URL:

  • 直接访问 API 网关 URL 时,应返回 403 Forbidden 错误。
  • 通过 CloudFront URL 访问时,应返回正常响应。

通过结合使用 AWS HTTP API 网关、CloudFront 和 Lambda 授权器,我们可以有效保护 API,防止未经授权的访问。这种方法不仅提高了安全性,还确保了系统的可扩展性和性能。

原文链接: https://skildops.com/blog/optimise-and-secure-aws-http-api-gateway-by-locking-down-direct-access