如何只允许特定的 IP 地址访问我的 API Gateway REST API?

上次更新日期:2021 年 9 月 20 日

我只想允许特定的 IP 地址访问我的 Amazon API Gateway REST API。如何限制对我的 API Gateway REST API 的访问?

简短描述

为您的 REST API 创建资源策略,使用该策略来拒绝对任何未被明确允许的 IP 地址的访问。

将资源策略附加到 REST API 之后,从指定 IP 地址调用 API 的用户(允许的用户)可以访问此 API。来自任何其他 IP 地址的调用都会被拒绝,并收到 HTTP 403 禁止访问错误。

注意:要阻止特定 IP 地址并允许所有其他 IP 地址访问,请参阅示例:根据源 IP 地址或范围拒绝 API 流量

解决方法

注意:对于以下过程,您可以使用现有的 API Gateway REST API 或创建示例 REST API 以进行测试。如果使用示例 API(PetStore),请跳至第二部分:创建并附加仅允许特定 IP 地址访问 API Gateway REST API 的资源策略

设置 API 方法

1.    打开 API Gateway 控制台

2.    选择 REST API。

3.    在 Resources (资源) 窗格中,选择 Actions (操作)。然后,选择 Create Method (创建方法)

4.    在 / resource 节点下的下拉列表中,选择 ANY。然后,选择复选标记图标。

5.    在 / - ANY - Setup (/– 任何 – 设置) 窗格中,为 Integration type (集成类型) 选择 Mock (模拟)

6.    选择 Save (保存)

注意:模拟集成会响应任何到达它的请求,这有助于以后进行测试。

创建并附加仅允许特定 IP 地址访问您的 API Gateway REST API 的资源策略

1.    打开 API Gateway 控制台

2.    在左侧导航窗格中,选择 Resource Policy (资源策略)

3.    在 Resource Policy (资源策略) 文本框中,粘贴以下示例资源策略:

资源策略示例

{
  "Version": "2012-10-17",
  "Statement": [{
      "Effect": "Allow",
      "Principal": "*",
      "Action": "execute-api:Invoke",
      "Resource": "execute-api:/*/*/*"
    },
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "execute-api:Invoke",
      "Resource": "execute-api:/*/*/*",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": ["sourceIpOrCIDRBlock", "sourceIpOrCIDRBlock"]
        }
      }
    }
  ]
}

3.    对于 aws:SourceIp,请将 sourceIpOrCIDRBlock 值替换为您希望授予访问权限的特定 IP 地址。您也可以使用 CIDR 表示法指定 IP 地址的范围。

以 CIDR 表示法列出的示例公有 IP 地址字符串

["52.95.36.0/22", "15.230.39.196/31", "52.93.178.219/32"]

重要信息:aws:SourceIp 条件值仅适用于公有 IP 地址范围。要允许访问私有 IP 地址范围,请改用条件值 aws:VpcSourceIp。然后,对于 aws:VpcSourceIp 值,输入通过接口 VPC 终端节点调用私有 API 终端节点的 HTTP 客户端的私有 IP 地址。请记住,您只能通过接口 VPC 终端节点在 API Gateway 中调用私有 API 终端节点。有关更多信息,请参阅 aws:VpcSourceIp

4.    选择 Save (保存)

注意:Amazon CloudWatch Logs 中的 $context.identity.sourceIp 变量列出了调用您的 REST API 的所有私有 IP 地址。有关更多信息,请参阅数据模型、授权方、映射模板和 CloudWatch 访问日志记录的 $context 变量

部署您的 API

1.    在 REST API 的 Resources (资源) 窗格中,选择 Actions (操作)

2.    选择 Deploy API (部署 API)

3.    对于 Deployment stage (部署阶段),选择 [New Stage] ([新建阶段])

4.    在 Stage name (阶段名称) 部分输入名称。例如:v1 或 demo。

5.    选择 Deploy (部署)

重要信息:每次更改 REST API 的资源策略时,都必须重新部署 REST API。

测试资源策略

通过使用 curlPostman 应用程序测试 API 的调用 URL,确认您的 REST API 是否返回了对允许的 IP 地址的 HTTP 200 OK 响应。然后,在没有允许的 IP 地址的环境中运行另一个测试,以确认您的 REST API 返回 HTTP 403 禁止访问错误。

注意:如果您没有使用多个环境进行测试的权限,则可以设置 Amazon Elastic Compute Cloud(Amazon EC2)实例。如果您使用 Amazon EC2 实例进行测试,请确保首先将该实例的 IP 地址添加到 API 的资源策略中。然后,重新部署您的 API。

使用 curl 测试您的 REST API 是否有 HTTP 200 OK 响应或 HTTP 403 错误

根据您的操作系统,运行以下命令之一。

重要信息:https://yourInvokeUrl/ 替换为 REST API 的调用 URL

对于 Linux、Unix 和 macOS 环境,请运行以下命令:

curl -IX GET https://yourInvokeUrl/

对于 Windows PowerShell,请运行以下命令:

curl https://yourInvokeUrl/

如果资源策略配置正确,允许的环境将收到 HTTP 200 OK 响应。被拒绝的环境会收到 HTTP 403 禁止访问错误。