AWS Lambda滥用

2020-07-06 04:51:56

关于无服务器方法,特别是AWS Lambda服务,以及我如何将其用于自己的个人目的,我已经写了相当多的文章。在这篇文章中,我们将再次介绍AWS Lambda是如何设置和运行的。我们将讨论减轻DDoS攻击影响的策略(DoS的时代早已一去不复返),并创建故障保护的无服务器应用程序。关于此主题的信息很少,尽管在讨论AWS安全性时它非常重要,也是最常见的。

简要介绍AWS Lambda。AWS Lambda是一项AWS计算服务,允许我们在云中像FAAS一样运行简单的功能。AWS Lambda为我们执行所有管理,包括服务器和操作系统维护、资源分配、自动扩展、监控和日志记录。您只需提供AWS Lambda支持的其中一种语言的代码。

没有行动。您不需要自己管理任何事情。AWS负责操作系统、部署、扩展等。

速度。lambda本身启动并运行得非常快(但是启动运行时会有开销)。

可扩展性。功能可以并行运行,根据区域的不同有限制,最多1000份到3000份。如果你愿意,这个限制可以增加。

AWS Lambda的工作相当简单明了。第一次调用函数时,会创建自定义函数的实例,并创建在AWS Lambda和函数代码之间传递查询和答案的运行时。启动函数处理程序以处理该事件。事件的来源(称为触发器)可以是AWS内部的各种东西,我称之为AWS CloudFront、AWS API Gateway和AWS SQS的最流行的Web触发器。当函数处理完事件后,它会返回响应并保持活动状态-它会等待传递下一个事件。随着更多事件的到来,内部AWS Lambda计划程序会将它们定向到预热(已在运行)实例(如果有),并根据需要创建新实例。当请求数量减少时,AWS Lambda会停止未使用的实例,以释放资源用于其他功能。

在给定时间为请求提供服务的函数实例数称为并发性。这本质上是AWS Lambda内部的水平可伸缩性。当请求到达的速度超过您的函数的可伸缩性时,或者当您的函数处于最大并发级别时,其他请求将失败,并返回429状态(请求太多)。

在安全性方面,AWS Lambda的每个功能都在自己的隔离环境中工作,拥有自己的资源和文件系统。它将代码存储在Amazon S3上,并在静止时对其进行加密。

当您部署一个向世界开放的终结点时,您不仅将其开放以供使用,而且还将其开放以供滥用。

想象一下,有人想要扰乱公交系统。数以千计的人在路线开始时登上公交车,漫无目的地从一端骑到另一端,而不是在车站离开。交通还在继续,但实际上,交通瘫痪了。人们站在中间站,悲哀地看着拥挤的公交车无法通过。人们无法回家,公交公司因客运量低而蒙受损失。

这很容易应用于Web应用程序-基本上,攻击者试图使系统的某个组件过载,使其达到某个临界点,之后会出现系统故障,可能是通信通道、请求队列,也可能只是系统处理程序的过载。

可能最流行的DDoS攻击是DNS(域名服务器)DDoS,因为它便宜且难以阻止。在DNS DDoS中,攻击者试图使目标DNS名称服务器的容量不堪重负,以阻止名称服务器查询解析。阻止DNS会使用户无法访问目标应用程序或网站,即使基础架构的其余部分运行正常。回到公交车系统的类比上,想象一下公交车正按计划运行,它们是空的,一切看起来都很好,但公交车的门就是打不开--人们就是进不去。

在AWS中,情况稍微复杂一些,因为正如已经说过的,管理和扩展都是在AWS端进行的,因此需要进行控制。

AWS提供服务和机制来避免常见的滥用方法,但通常,就像典型的DDoS攻击一样,它不知道什么是流量,也不会滥用。

AWS本身非常庞大,拥有许多区域、可用区和边缘位置,从而在一定程度上消除了不良流量,并吸收了其余流量。但是,仅仅使用lambda函数认为AWS会自动为您做所有事情是不够的。你当然可以,但最终,你要么会收到服务中断,要么会收到一大笔账单,或者一下子全赔上。AWS对并发处理程序的数量施加了限制,您必须考虑流量来自何处、DNS如何解析,如果您使用任何外部AWS服务,有时将它们全部迁移到AWS内部以实现更全面的控制是有意义的。AWS Route53和AWS CloudFront等服务允许您利用各种内部AWS基础设施,而这些基础设施本身的构建相当有趣。

我试图举例说明位于一个地区的lambda服务的传入流量示例。如您所见,在到达lambda本身之前有很多步骤。这一切都是从AWS Route53(这是负责名称解析等的服务)中的一个名称服务器上的记录的DNS解析开始的,该服务故意托管在边缘位置上,以便来自不同网络和位置的客户端有自己的快速服务方式,同时在发生局部停机的情况下有多条路径。此外,边缘位置上还有AWS CloudFront(您可以在lambda中使用lambda@Edge选项)-它是一个用于交付所有静态和动态内容的内容交付网络,允许用户在不需要时不直接转到该功能。因此,Route 53可以将不同的用户分配到最近的AWS CloudFront实例(可能已经位于相同的边缘位置),这些实例可能已经具有必要的内容。听起来不错,对吧?

当用户发送请求时,DNS在用户最近的边缘位置解析,即AWS Route 53所在的位置。

路53将请求转发到AWS CloudFront所在的最近边缘位置。

然后,可以有两种可能性,即请求的文件是否在高速缓存中。如果文件在缓存中,则CloudFront会返回它们。

CloudFront将您的发行版中的规格与请求进行比较。然后使用用户请求触发AWS Lambda函数。

当请求文件的第一个字节到达时,CloudFront开始向用户发送文件。

它还将文件保存到CloudFront的内部缓存(针对指定的TTL),以便将来在同一用户或其他用户请求时可以轻松访问它们。

当然,您可以在API前面以边缘优化模式使用API Gateway来实现大致相同的目的(缓存和函数触发器)。但是,这可能会更昂贵,API Gateway按每小时缓存大小收费,CloudFront按请求收费,以及数据传输收费。当然,一切都取决于具体的架构、目的和工作量。

API Gateway本质上是用户正在访问的代理服务器,该代理服务器正在调用lambda。通常,API网关还可以执行SSL证书处理、负载平衡、授权和身份验证、缓存、请求内容压缩。但在滥用的情况下,它并不像云前线那样有效。

一如既往,这需要多层次的方法,一切都在很大程度上取决于具体的体系结构、工作流程,当然还有预算。

让我们从最愚蠢、传统上最有效的方法开始吧。确保您的代码不会在意外输入时挂起。您应该仔细检查所有边缘情况,并考虑可能导致函数超时、重做攻击或长有效负载的可能输入。攻击者可能会利用这一弱点。

如果你不想在某个时候收到一大笔账单,另一个令人难以置信的绝妙主意是设置账单提醒。它的设置非常简单和快速(通过AWS预算进行设置比通过AWS SNS和AWS Cloudwatch更好),但它非常有用-如果出现问题,您会得到通知。

此外,我建议对账单进行限制。当然,一切都取决于服务的具体业务任务,也许支付过高会更好,但要有一个可用的端点。

我们已经发现,AWS Lambda提供多个并发运行的实例来扩展函数,但是如果您同时运行多个Lambda函数,并且其中一个函数被滥用,则其他函数的资源可能会因此而耗尽。AWS Lambda对每个地区每个帐户的并发执行数量有默认限制。如果您的函数超过此限制,其他用户请求将被AWS限制,状态为429,如前所述。

但是可以在每个函数的基础上设置并发级别。除了AWS Lambda,API Gateway还支持节流。默认值是合理的,但您可以随心所欲地更改它们。例如,如果对您的应用程序有意义,您可以允许每秒5次调用,之后API Gateway将阻止其他请求。在DDoS的情况下,攻击的主要严重性将在于AWS,而不是您的lambda。每个请求的计费加上每个请求的总内存分配,所以这是您想要控制的参数。

考虑使用SQS作为Lambda函数的代理。通过将队列定义为目的地而不是Lambda,您可以一次处理多个事件,也称为批处理。它将减少函数调用的总数。

正如我们以前看到的,使用Amazon CloudFront等内容交付网络(CDN)是减少网页加载时间、降低带宽成本、降低Web服务器负载和减轻DDoS攻击影响的常用策略。此外,CloudFront是用于部署AWS WAF的平台。AWS WAF是一种Web应用防火墙,通过定义自定义安全规则(也称为ACL),您可以控制允许或阻止的流量,从而帮助保护您的应用免受DDoS攻击。

可以监控发送到CloudFront的HTTP和HTTPS请求,并可以使用AWS WAF在边缘位置控制对应用资源的访问。根据您在AWS WAF中指定的条件(例如发起请求的IP地址或查询字符串的值),可以允许、阻止或允许流量并进行计数以供进一步调查。

基于速度的网站管家规则可以设置的最小阈值是每5分钟2000个请求。如果您想要应用基于IP的激进规则,不幸的是,您必须编写自己的解决方案。

此外,使用AWS CloudFront,您还可以从AWS Shield获得开箱即用的Standart Protection。AWS Shield甚至在到达您的网关或ELB之前就能识别使用率峰值。

如果API密钥适合您的应用程序,您可以使用它。用户必须在HTTP标头内传递密钥。如果没有有效的密钥,攻击者将无法访问API网关。在这种情况下,AWS将承担攻击的主要负担。

使用计划允许我们设置参数来限制您的API的使用。这本质上类似于节流,但不是在应用程序级别,而是在API级别和阶段级别。

节流是使用令牌桶模型进行的。桶足够大,以容纳由突发值表示的标记的数量,并以给定的速度获得新的标记。每个API查询从存储桶中移除一个标记。使用令牌桶可以让您拥有支持持续请求流的API,并且能够满足随机突发。

配额是在一定时间间隔内(例如一天、一周或一个月)限制请求数量。使用此配额时,在给定时间段内不再接受请求。

总而言之,AWS Lambda旨在实现高可用性,并以大规模运行的庞大AWS基础设施为后盾。

DDoS没有完全或完美的解决方案。所能做的就是采取预防措施,并在袭击发生时迅速有效地做出反应。

给我买咖啡