AWS:AWS HTTPS API 网关的资源策略以限制对特定 IP 的访问

AWS: Resource policy for an AWS HTTPS API Gateway to restirct access to specific IP's

最近 AWS 发布了基于 HTTPS 的 API 网关(不是 REST 网关)。我们使用 Terraform 来管理 AWS 资源,并且我们有一个服务,我们可以在其中创建 AWS HTTPS API 网关资源,存在安全问题,我们允许任何 IP/system 调用 API ,因此我们计划添加一个策略(资源策略)来限制对特定 IP 的访问。对于 REST API 网关很容易实现这一点,因为我们有 aws_api_gateway_rest_api_policy 资源来通过 Terraform 创建策略并将其附加到网关,但同样不能为 HTTPS API 网关实现。我们使用 aws_apigatewayv2_api 创建 HTTPS 网关资源,但找不到资源来附加策略,或者它在创建网关本身时没有指定策略的选项。如果您知道如何将策略附加到基于 HTTPS 的 API,将不胜感激。谢谢

HTTP API 中不支持 资源策略。来自 docs:

因此,如果您想使用 API 资源策略将 API 限制到某些特定 IP 地址,您必须使用 REST API.

虽然不支持资源策略,但这可以通过自定义授权方 Lambda 函数来完成。我相信以后会有更好的方法,但现在你可以这样做:

module.exports.authorizer = async(event, context) => {
     
  let response = {
      "isAuthorized": false,
  };

  const allowedIps = ["x.x.x.x"];
  
  if (allowedIps.includes(event.headers["x-forwarded-for"])) {
      response.isAuthorized = true;
  }
  
  console.log(response);
  
  return response;
}

我意识到这不是最优雅的解决方案,但它会起作用。这是假设一个简单的授权方响应和有效负载格式版本 2.0。您的身份源将是 $request.header.x-forwarded-for。我提到这一点是因为如果 header 不存在,所有请求都会被拒绝。如果您在本地进行测试,则需要将 header 添加到 curl/insomnia/postman 调用中。如果你愿意,你可以很容易地增加代码来处理 CIDR

AWS Lambda Authorizer Documentation