如何使用 AWS API Gateway 为 CORS 预检请求设置配额

Posted

技术标签:

【中文标题】如何使用 AWS API Gateway 为 CORS 预检请求设置配额【英文标题】:How to set quota for CORS preflight requests with AWS API Gateway 【发布时间】:2020-10-25 22:55:09 【问题描述】:

我正在使用 AWS Lambda 和 API Gateway 构建无服务器应用程序。为了防止 DDOS 攻击执行大量请求而花费我很多钱,我设置了一个带有请求配额的使用计划(例如 10K 请求/月)。这需要调用者将 API 密钥作为标头传递。

这看起来效果很好,但我还需要为此服务启用 CORS。为此,我需要允许未经授权的 OPTIONS 请求(“CORS preflight”请求),因为浏览器不支持在那里发送任何特殊标头。但后来我似乎找不到执行配额的方法,我又回到了原点:不受控制的这些请求数量可能会花费不可预见的金额。有没有办法排除这种可能性?

【问题讨论】:

【参考方案1】:

要对 OPTIONS 请求实施配额,请在 AWS WAF 中创建一个 Web ACL 并将其与 API Gateway 中的 API 阶段相关联。在 Web ACL 中添加基于速率的规则,以阻止超出您指定的速率限制的所有 OPTIONS 请求。 Web ACL 中的规则可以专门为此配置,如下所示:

有关整个过程的屏幕截图指导教程,请参阅my blog post。

【讨论】:

非常感谢您的广泛回复。不过,这仍然无法阻止分布式 DOS 攻击。我认为没有办法防止这种情况发生? @Gunnar 假设有一百万个机器人攻击你的 API。如果您可以检测到 DDoS 攻击正在进行中,您会为所有人关闭整个 API,还是尝试仅阻止不良行为者?显然,您不希望仅仅因为一些不良行为者决定对您的 API 造成严重破坏而阻止合法客户。因此,阻止 DDoS 攻击的唯一方法是阻止来自各个 IP 的流量。这正是 AWS 自己的自动化 WAF 解决方案的做法——AWS WAF Security Automations。 啊,这是一个很好的问题,我应该更清楚地指定我的用例。这是针对个人项目的,所以在我的情况下,一旦达到给定的支出水平,我确实宁愿为每个人关闭整个服务。由于没有办法限制这样的支出,我研究了限制请求,我认为使用计划可以让我到达那里,但后来我注意到了 OPTIONS 漏洞。似乎 WAF 与我真正想要的一样接近。 @Gunnar 您可以创建特定于 API Gateway 的 AWS 预算。让此预算向 SNS 主题发送通知。为该 SNS 主题订阅 Lambda 函数。通过将您的 API 阶段的方法限制限制设置为 0,从此 Lambda 函数关闭您的 API。有关实施整个过程的详细分步指南,请参阅my blog post。 这听起来像是一种可行的方法。非常感谢您,非常感谢您的广泛回复。【参考方案2】:

您无需为任何未经授权的 API-Gateway 调用付费。 AWS 正在承担这项费用。 您在请求获得授权后付款,并且只有在它不超过您的使用计划时才付款。

因此,如果有人在未经身份验证的情况下对您的 API 进行 DDOS,则它是免费的。

如果有人使用有效的 api 密钥进行 DDOS,您只需在超出使用计划之前付费。

查找更多信息here。

请求不收取授权和身份验证费用 失败。

使用 API 密钥时调用需要 API 密钥的方法不收费 丢失或无效。

API 网关限制的请求在请求速率时不收费 或突发率超过预先配置的限制。

当速率限制或 配额超出了预先配置的限制。

因此,请确保在您的 API 上启用身份验证,并为所有经过身份验证的请求制定使用计划。

【讨论】:

有人可能会不断地向 API 发送无限数量的 HTTP OPTIONS 请求。 CORS 要求 OPTIONS 应该不受保护,即没有 authN 和 authZ。因此,OPTIONS 请求将被计费,因为 API 网关会为每个传入的 OPTIONS 请求返回带有 CORS 标头的 HTTP 200 的 stock/mock 响应! 嗨,哈里什。 Cors 未经过身份验证,这是真的。但是您不需要配置独立的 CORS Route。请参阅“Amazon API Gateway 开发人员指南 PDF”中的“为 HTTP API 配置 CORS”。通过启用 cors API-Gateway 将响应 CORS 请求,您只需在用户稍后通过身份验证时付费。通过添加不带身份验证的 manuell OPTIONS Route,您可以实现类似的行为,但我认为在这种情况下,您需要为请求付费。您仍然可以通过使用计划来防止高成本。但是仅在没有 manuell 路线的情况下启用 cors 会更好 CORS for HTTP API documentation 没有提到对 API 网关的预检请求是免费的还是收费的。顺便说一句,Enabling CORS for a REST API 与使用模拟后端手动添加 OPTIONS 方法相同。当您通过它启用 CORS 时,API Gateway 会执行相同的操作,如 here 所示。 “通过启用 cors API-Gateway 将响应 CORS 请求,并且您只有在用户稍后通过身份验证时才需要付费”——@DominikHelps,您是否对此有权威来源,或者这是您的解释?我希望是这样,但不幸的是,它没有明确记录。 @DominikHelps 我 100% 同意这将是非常可取的,但在官方文档中没有明确说明,这只是我们的一个很好的希望 :)

以上是关于如何使用 AWS API Gateway 为 CORS 预检请求设置配额的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS Cloudformer 为现有 API Gateway 创建云形成模板?

如何使用 OpenAPI 为 AWS API Gateway 配置 CORS?

如何使用 AWS CloudFormation 在 AWS API Gateway 上应用安全策略?

如何使用 AWS API Gateway 为 CORS 预检请求设置配额

如何使用 AWS API Gateway 设置 OAuth2 身份验证提供程序?

如何使用 AWS CloudFormation 在 AWS API Gateway 集成中指定阶段变量?