如何防止第三方应用程序滥用 AWS Lambda

How To Prevent AWS Lambda Abuse by 3rd-party apps

非常有兴趣在几个分散的应用程序项目中获得 hands-on 和 Serverless in 2018. Already looking to implement usage of AWS Lambda。但是,我还不明白如何防止第 3 方应用程序 (甚至可能是竞争对手)滥用您的端点, 从而推高您的使用成本。

我不是在谈论 DDoS,也不是所有流量都来自单个 IP,这可能发生在任何网络上,而是特别是让第 3 方应用程序的客户直接进行 REST 调用,这会导致您的使用成本会上升,因为他们的应用程序在您的 "open" 端点上 piggy-backing。

例如:

我希望在 AWS Lambda 上创建一个端点来给我 current price of Ethereum ETH/USD. 什么会阻止另一个 (或每个) dapp 开发人员使用 MY lambda 端点并导致我的帐户产生过多的账单费用?

当您部署一个对世界开放的端点时,您打开它是为了使用,但也是为了被滥用。

AWS 提供服务来避免常见的滥用方法,例如 AWS Shield,它可以缓解 DDoS 等,但是,正如您所问的,他们不知道什么是或不是滥用您的 Lambda 函数。

如果您的 Lambda 函数是私有的,那么您应该使用 API 网关安全机制之一来防止滥用:

  • IAM 安全性
  • API 密钥安全
  • 自定义安全授权

有了其中一个,您的 Lambda 函数只能由授权用户调用。如果其中任何一项都没有到位,就无法防止您担心的滥用类型。

无限制地访问您的 public Lambda 函数 - 无论是恶意行为者, 还是 由合法的第三方开发的不良软件,都可能导致不必要的使用可计费公司资源,并且会降低应用程序性能。作为系统安全设计的一部分,考虑限制和限制对 Lambda 客户端的访问的方式对您来说很重要,以防止 运行away 函数调用和不受控制的成本。

考虑使用以下方法来防止第 3 方应用程序"abuse" 执行您的 Lambda 端点

您要控制的一个因素是并发性,或者每个帐户和每个函数支持的并发请求数。你是billed per request plus total memory allocation per request,所以这是你要控制的单位。为了防止 运行 外出成本,您可以防止 运行 外出执行 - 由不良行为者或由合法的第 3 方造成的不良软件造成。

来自Managing Concurrency

The unit of scale for AWS Lambda is a concurrent execution (see Understanding Scaling Behavior for more details). However, scaling indefinitely is not desirable in all scenarios. For example, you may want to control your concurrency for cost reasons, or to regulate how long it takes you to process a batch of events, or to simply match it with a downstream resource. To assist with this, Lambda provides a concurrent execution limit control at both the account level and the function level.

除了每个帐户和每个 Lambda 调用限制之外,您还可以通过将 Lambda 调用包装在 AWS API 网关中来控制 Lambda 公开,以及创建和使用 API Gateway Usage Plans :

After you create, test, and deploy your APIs, you can use API Gateway usage plans to extend them as product offerings for your customers. You can provide usage plans to allow specified customers to access selected APIs at agreed-upon request rates and quotas that can meet their business requirements and budget constraints.

What Is a Usage Plan? A usage plan prescribes who can access one or more deployed API stages— and also how much and how fast the caller can access the APIs. The plan uses an API key to identify an API client and meters access to an API stage with the configurable throttling and quota limits that are enforced on individual client API keys.

The throttling prescribes the request rate limits that are applied to each API key. The quotas are the maximum number of requests with a given API key submitted within a specified time interval. You can configure individual API methods to require API key authorization based on usage plan configuration. An API stage is identified by an API identifier and a stage name.

使用 API 网关限制 为每个客户创建 Gateway Usage Plans,您可以控制 API 和 Lambda 访问以防止不受控制的帐户计费。

@Matt 回答正确,但不完整。

如@Rodrigo 的回答所述,添加安全层是实现安全的必要步骤,但不能保护您免受经过身份验证的调用者的侵害。

我实际上刚刚在我的一个 lambda 上遇到并解决了这个问题,感谢这篇文章:https://itnext.io/the-everything-guide-to-lambda-throttling-reserved-concurrency-and-execution-limits-d64f144129e5

基本上,我在我的 serverless.yml 文件中添加了一行,在我的函数中,该函数被所述授权的第 3 方调用:

reservedConcurrency: 1

下面是整个函数:

refresh-cache:
    handler: src/functions/refresh-cache.refreshCache
    # XXX Ensures the lambda always has one slot available, and never use more than one lambda instance at once.
    #  Avoids GraphCMS webhooks to abuse our lambda (GCMS will trigger the webhook once per create/update/delete operation)
    #  This makes sure only one instance of that lambda can run at once, to avoid refreshing the cache with parallel runs
    #  Avoid spawning tons of API calls (most of them would timeout anyway, around 80%)
    #  See https://itnext.io/the-everything-guide-to-lambda-throttling-reserved-concurrency-and-execution-limits-d64f144129e5
    reservedConcurrency: 1
    events:
      - http:
          method: POST
          path: /refresh-cache
          cors: true

当任何数据发生变化时,refresh-cache lambda 由第三方服务触发的 webhook 调用。导入数据集时,它会触发多达 100 次对 refresh-cache 的调用。这种行为完全是在向我的 API 发送垃圾邮件,这反过来又 运行 向其他服务发送请求以执行缓存失效。

添加这一行改善了很多情况,因为一次只有一个 lambda 实例 运行ning(没有并发 [​​=57=]),调用次数除以 ~10 ,而不是对 refresh-cache 的 50 次调用,它只触发了 3-4 次,并且所有这些调用都有效(由于超时问题,200 次而不是 500 次)。

总体来说,还不错。还不适合我的工作流程,但向前迈进了一步。


不相关,但我使用了 https://epsagon.com/,这极大地帮助我弄清楚了 AWS Lambda 上发生的事情。这是我得到的:

对 lambda 应用 reservedConcurrency 限制之前:

您可以看到大多数调用因超时(30000 毫秒)而失败,只有少数调用首先成功,因为 lambda 尚未过载。

After 对 lambda 应用 reservedConcurrency 限制:

可以看到调用都成功了,而且速度也快了很多。没有超时。 既省钱又省时。


Using reservedConcurrency is not the only way to deal with this issue, there are many other, as @Rodrigo stated in his answer. But it's a working one, that may fit in your workflow. It's applied on the Lambda level, not on API Gateway (if I understand the docs correctly).