【应用安全】保护您的API使用亚马逊API网关和AWS WAF -第一部分
本文由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。这有助于减少请求延迟,特别是允许您根据需要添加自己的内容交付网络。
预排
在本节中,您将执行以下步骤:
- 使用PetStore示例API创建一个区域性API。
- 为API创建一个CloudFront发布。
- 测试云前分布。
- 设置AWS WAF并创建web ACL。
- 将web ACL附加到CloudFront分发版。
- 测试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
测试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的其他一些技术。
本文:http://pub.intelligentx.net/node/595
讨论:请加入知识星球或者小红圈【首席架构师圈】
- 71 次浏览