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

Man*_*ath 0 amazon-web-services terraform aws-api-gateway terraform-provider-aws

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

dev*_*_al 6

虽然不支持资源策略,但这可以通过自定义授权者 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;
}
Run Code Online (Sandbox Code Playgroud)

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

AWS Lambda 授权方文档


Mar*_*cin 5

HTTP API不支持资源策略。来自文档

在此输入图像描述

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