跳转到主要内容
Chinese, Simplified

本文由AWS解决方案架构师Thiago Morais提供

当您构建web应用程序或在外部公开任何数据时,您可能会寻找一个平台,在这个平台上您可以构建高度可伸缩、安全且健壮的REST api。由于API是公开的,所以有许多最佳实践可以为使用API的用户提供安全机制。

Amazon API Gateway处理接受和处理多达数十万个并发API调用所涉及的所有任务,包括流量管理、授权和访问控制、监视和API版本管理。

在本文中,我将向您展示如何利用API网关中的区域性API端点特性,以便您可以创建自己的Amazon CloudFront发布,并使用AWS WAF保护您的API。

AWS WAF是一个web应用程序防火墙,它帮助保护您的web应用程序免受常见web攻击的影响,这些web攻击可能会影响应用程序的可用性、危害安全性或消耗过多的资源。

当您使您的api公开可用时,您就暴露在试图以几种方式利用您的服务的攻击者面前。AWS安全团队发布了一个使用AWS WAF的白皮书解决方案,即如何减轻OWASP的十大Web应用程序漏洞。

区域API端点

边缘优化API是通过由API网关创建和管理的CloudFront发布访问的端点。在启动区域API端点之前,这是使用API网关创建API时的默认选项。它主要帮助位于不同地理位置的API使用者减少延迟。

当API请求主要来自部署API时所在AWS区域内的Amazon EC2实例或其他服务时,区域API端点通常会降低连接的延迟。建议在这种情况下使用。

为了更好地控制缓存策略,客户可以为区域api使用自己的CloudFront发布。他们也有能力使用AWS WAF保护,正如我在这篇文章中所描述的。

Edge-optimized API端点

下图是一个经过边界优化的API端点的示例,您的API客户端通过由API网关创建和管理的CloudFront发布访问您的API。

区域API端点

对于区域API端点,您的客户可以从部署REST API的相同区域访问您的API。这有助于减少请求延迟,特别是允许您根据需要添加自己的内容交付网络。

预排

在本节中,您将执行以下步骤:

  1. 使用PetStore示例API创建一个区域性API。
  2. 为API创建一个CloudFront发布。
  3. 测试云前分布。
  4. 设置AWS WAF并创建web ACL。
  5. 将web ACL附加到CloudFront分发版。
  6. 测试AWS WAF保护。

创建区域API

对于本演练,请使用现有的PetStore API。所有新api都默认作为区域端点类型启动。要更改现有API的端点类型,请选择右上角的cog图标:

在您的帐户上创建了PetStore API之后,为PetStore API部署一个名为“prod”的阶段。

在API网关控制台,选择PetStore API并选择Actions, Deploy API。

对于Stage 名称,键入prod并添加舞台描述。

选择Deploy并创建新的API阶段。

使用以下AWS CLI命令将您的API从边缘优化更新到区域:

aws apigateway update-rest-api \ --rest-api-id {rest-api-id} \ --patch-operations op=replace,path=/endpointConfiguration/types/EDGE,value=REGIONAL

一个成功的响应如下:

{
    "description": "Your first API with Amazon API Gateway. This is a sample API that integrates via HTTP with your demo Pet Store endpoints", 
    "createdDate": 1511525626, 
    "endpointConfiguration": {
        "types": [
            "REGIONAL"
        ]
    }, 
    "id": "{api-id}", 
    "name": "PetStore"
}

 

将API端点更改为region之后,现在可以将自己的CloudFront分发版分配给这个API。

 

创建一个CloudFront发布

为了使事情变得更简单,我提供了一个AWS CloudFormation模板来部署指向您刚刚创建的API的CloudFront发布。单击此按钮将模板部署到us-east-1区域。

对于堆栈名称,请输入RegionalAPI。对于APIGWEndpoint,请按照以下格式输入您的API FQDN:

{api-id}.execute-api.us-east-1.amazonaws.com

填写完参数后,选择Next继续堆栈部署。完成部署需要几分钟。完成后,Output选项卡列出以下项目:

  • A CloudFront domain URL
  • An S3 bucket for CloudFront access logs

Output from CloudFormation

Output from CloudFormation

测试CloudFront 分发

要查看CloudFront发布是否配置正确,请使用web浏览器并从发行版中输入URL,并使用以下参数:

https://{your-distribution-url}.cloudfront.net/{api-stage}/pets

您应该得到以下输出:

[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]

设置AWS WAF并创建web ACL

有了新的CloudFront发布,您现在可以开始设置AWS WAF来保护您的API。

对于这个演示,您将部署AWS WAF安全自动化解决方案(https://aws.amazon.com/answers/security/aws-waf-security-automations/),该解决方案对试图访问您的API的请求提供细粒度控制。

有关部署的更多信息,请参见自动部署(https://docs.aws.amazon.com/solutions/latest/aws-waf-security-automatio…)。

对于CloudFront访问日志桶名,添加在部署CloudFormation堆栈期间为您的CloudFront分发版创建的桶名。

该解决方案允许您调整阈值,并选择启用哪些自动化来保护您的API。配置完这些设置后,选择Next。

要启动帐户中的部署过程,请遵循创建向导并选择Create。完成部署需要几分钟。您可以通过CloudFormation控制台跟踪创建过程。

部署完成后,您可以看到新的web ACL部署在AWSWAF控制台AWSWAFSecurityAutomations上。

将AWS WAF web ACL附加到CloudFront分发版

部署了解决方案后,现在可以将AWS WAF web ACL附加到前面创建的CloudFront分发版。

要分配新创建的AWS WAF web ACL,请回到您的CloudFront发布。打开要编辑的发行版后,选择General Edit。

选择前面创建的新的AWSWAF web ACL  AWSWAFSecurityAutomations

保存对CloudFront发布的更改,等待部署完成。

测试AWS WAF保护

要验证AWS WAF Web ACL设置,请使用 Artillery 加载测试API并查看AWS WAF的运行情况。

要在您的机器上安装火炮,请运行以下命令:

npm install -g artillery

安装完成后,您可以通过运行以下命令检查火炮是否安装成功:

$ artillery -V $ 1.6.0-12

在发布时, Artillery版是1.6.0-12。

您已经设置的WAF web ACL规则之一是基于速率的规则。默认情况下,它被设置为阻止任何请求者在5分钟内超过2000个请求。试试这个。

首先,使用cURL查询您的分布并查看API输出:

$ curl -s https://{distribution-name}.cloudfront.net/prod/pets
[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]

根据上面的测试,结果看起来不错。但是,如果您在5分钟内最大限度地完成2000个请求呢?

运行以下artillery 命令:

artillery quick -n 2000 --count 10 https://{distribution-name}.cloudfront.net/prod/pets

您所做的是从10个并发用户向API发出2000个请求。简而言之,我没有在这里发布炮兵(artillery )输出。

炮兵(artillery )完成它的执行后,尝试再次运行cURL请求,看看会发生什么:

$ curl -s https://{distribution-name}.cloudfront.net/prod/pets

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
Request blocked.
<BR clear="all">
<HR noshade size="1px">
<PRE>
Generated by cloudfront (CloudFront)
Request ID: [removed]
</PRE>
<ADDRESS>
</ADDRESS>
</BODY></HTML>

从上面的输出可以看到,请求被AWS WAF阻止了。当您的IP地址低于请求限制速率时,将从阻塞列表中删除。

结论

在第一部分中,您了解了如何使用新的API网关区域API端点以及Amazon CloudFront和AWS WAF来保护您的API免受一系列攻击。

在第二部分中,我将演示使用API键和Amazon CloudFront自定义头保护API的其他一些技术。

 

原文:https://aws.amazon.com/cn/blogs/compute/protecting-your-api-using-amazon-api-gateway-and-aws-waf-part-i/

本文:http://pub.intelligentx.net/node/595

讨论:请加入知识星球或者小红圈【首席架构师圈】

 

Article
知识星球
 
微信公众号
 
视频号