11

非常有兴趣在 2018 年亲身体验无服务器。已经希望在几个去中心化应用程序项目中实现AWS Lambda的使用。但是,我还不明白如何防止第三方应用滥用端点(甚至可能是竞争对手)滥用端点,从而提高使用成本。

我不是在谈论 DDoS,或者所有流量都来自单个 IP,这可能发生在任何网络上,而是特别是让第三方应用程序的客户直接进行 REST 调用,这会导致您的使用成本上升,因为他们的应用程序在你的“开放”上捎带端点。

例如:

我希望在 AWS Lambda 上创建一个端点,以提供以太坊 ETH/USD 的当前价格。什么会阻止另一个(或每个) dapp 开发人员使用的lambda 端点并导致我的帐户产生过多的账单费用?

4

3 回答 3

6

当您部署一个对世界开放的端点时,您将其开放以供使用,但也可被滥用。

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

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

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

使用其中之一,您的 Lambda 函数只能由授权用户调用。如果没有其中一个,就无法防止您担心的滥用类型。

于 2018-01-02T02:59:28.647 回答
5

@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任何数据发生变化时,第三方服务触发的 webhook 会调用 lambda。例如,在导入数据集时,它会触发多达 100 次对refresh-cache. 这种行为完全是在向我的 API 发送垃圾邮件,而 API 又运行对其他服务的请求以执行缓存失效。

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

总的来说,还不错。对我的工作流程来说还不完美,但向前迈出了一步。


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

对 lambda应用reservedConcurrency限制之前: 在此处输入图像描述

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

对 lambda应用reservedConcurrency限制 后:在此处输入图像描述

您可以看到所有调用都成功了,而且它们的速度要快得多。没有超时。既省钱又省时间。


正如@Rodrigo 在他的回答中所说,使用reservedConcurrency并不是解决这个问题的唯一方法,还有很多其他方法。但它是一个可行的,可能适合您的工作流程。它应用于 Lambda 级别,而不是 API Gateway(如果我正确理解文档)。

于 2019-08-11T23:11:24.420 回答
5

对您的公共 Lambda 函数的无限访问——无论是由不良行为者,还是由合法的第 3 方开发的不良软件,都可能导致对可计费的公司资源的不必要使用,并可能降低应用程序性能。作为系统安全设计的一部分,您必须考虑限制和限制对 Lambda 客户端的访问的方法,以防止失控的函数调用和不受控制的成本。

考虑使用以下方法来防止 Lambda 端点被第 3 方应用程序“滥用”

您要控制的一个因素是并发性,即每个账户和每个功能支持的并发请求数。您按请求计费加上每个请求的总内存分配,因此这是您要控制的单位。为了防止失控成本,您可以防止失控执行 - 无论是由不良行为者,还是由合法的第三方造成的不良软件。

管理并发

AWS Lambda 的规模单位是并发执行(有关更多详细信息,请参阅了解扩展行为)。但是,并非在所有情况下都需要无限扩展。例如,出于成本原因,您可能希望控制并发性,或者控制处理一批事件所需的时间,或者只是将其与下游资源匹配。为此,Lambda 在账户级别和函数级别提供并发执行限制控制。

除了每个账户和每个 Lambda 调用限制之外,您还可以通过将 Lambda 调用包装在 AWS API Gateway 中来控制 Lambda 暴露,并创建和使用 API Gateway 使用计划

创建、测试和部署 API 后,您可以使用 API Gateway 使用计划将其扩展为为您的客户提供的产品。您可以提供使用计划,以允许指定客户以商定的请求率和配额访问选定的 API,以满足其业务需求和预算限制。

什么是使用计划?使用计划规定谁可以访问一个或多个已部署的 API 阶段,以及调用者可以访问 API 的程度和速度。该计划使用 API 密钥来识别 API 客户端,并使用对单个客户端 API 密钥实施的可配置限制和配额限制来衡量对 API 阶段的访问。

限制规定了应用于每个 API 密钥的请求速率限制。配额是在指定时间间隔内提交的具有给定 API 密钥的最大请求数。您可以根据使用计划配置配置单个 API 方法以要求 API 密钥授权。API 阶段由 API 标识符和阶段名称标识。

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

于 2018-01-02T03:30:29.353 回答