如何限制 Firebase 云功能仅接受来自 Firebase 托管网站的请求

Posted

技术标签:

【中文标题】如何限制 Firebase 云功能仅接受来自 Firebase 托管网站的请求【英文标题】:How to restrict Firebase Cloud Function to accept requests only from Firebase Hosting website 【发布时间】:2021-11-16 08:10:11 【问题描述】:

我有一个托管在 Firebase Cloud Functions 上的 Node.js API(使用 Express.js 构建)和一个托管在 Firebase Hosting 上的随附 Web 应用程序,它应该可以交互使用上述 API。

我想限制对 API 的调用,以便只有 Web 应用程序能够调用云函数。我怎样才能做到这一点?

我尝试过的:

使用 App Check 或更准确地说是 Google 的用于网络应用的 reCAPTCHA v3。我已将 Web 应用程序的域列入白名单,并已激活 App Check 令牌验证服务器端。然而,App Check 的问题是我能够从浏览器获取 reCAPTCHA 证明令牌(在通过 Web 应用程序进行身份验证之后)并将其用于从任何地方发出的请求。这使得从 Web 应用程序外部轰炸 API 成为可能,并首先破坏了使用 App Check 的目的。

这里要注意一点,documentation for activating App Check in Cloud Functions 指示使用functions.https.onCall()。但是,由于我的 API 是使用 Express.js 构建的,因此我必须使用解决方法才能按照 here 的指示使用 functions.https.onRequest()

从 Google Cloud 控制台限制 Cloud Function 以仅允许同一项目的客户端按照指示 here 调用该函数。不幸的是,我在 Firebase Hosting 上托管的网络应用程序似乎不属于同一个 Google Cloud 项目。在 Firebase Hosting 上托管的应用不会出现在 Google Cloud 控制台中。此外,在将函数的 Ingress 设置 调整为“只允许内部流量”后,我在尝试通过 Web 应用程序访问 API 时收到 CORS 错误。不过,我无法从其他任何地方访问 API,这部分是预期的结果。

在有人提议从 API 中限制 CORS 选项中的域之前,虽然这可能有助于限制对 API 端点的访问,但它仍然允许快速调用该函数,因此可能会增加费用。

感谢您的任何建议!

【问题讨论】:

如果您对 App Check 不满意,那么您别无选择。您根本无法以您描述的方式限制流量。所有通用后端服务都有相同的问题——这就是互联网的工作方式。如果您无法根据源 IP 限制访问,则任何服务器端点都可能被滥用,甚至可以伪造。 还要注意,您从 App Check 获得的令牌是有期限的,因此不能无限期使用。这在文档中有所介绍。只要攻击者想滥用端点,他们就必须不断获取新令牌。您的后端是否有值得付出所有努力的东西? 感谢您的澄清。让我烦恼的是这种潜在滥用的容易程度——身份验证、获取应用程序检查令牌和用 3 行脚本轰炸 API 并没有那么大的“努力”。我想在这种情况下,速率限制将有助于将损害降到最低,尽管在 API 中创建内部速率限制仍然意味着该功能被触发(可能导致账单增加)。我不一定要在我的 API 中保护国家机密,但最好做好最坏的打算,不是吗? 易于攻击是网络安全是一个价值数十亿美元的行业的原因。当您成为一个大而理想的目标时,您就可以在复杂的解决方案上花费大量资金来控制您网站的流量,以管理成本并降低风险。从这个意义上说,Cloud Functions(就其本身而言)并不是一个复杂的产品,所以如果您担心受到攻击,您应该考虑使用 Cloud Armor 之类的产品对您的后端基础架构进行重大升级。 【参考方案1】:

Firebaser 在这里

这是一个很好的问题! Doug 在上面已经提出了一些重要的观点,我将补充一点,App Check 令牌上的 TTL 减少了您在第一个要点中观察到的 重播窗口,这个 TTL 是configurable.

reCAPTCHA v3 的默认 TTL 为 1 天,以防止配额用尽,但您可以设置更短的 TTL 以增加尝试设置重放攻击的攻击者的成本。但请注意文档中描述的相关权衡。您可以阅读相关的配额和限制here。

很遗憾,从 Firebase 托管重定向的网络应用程序无法连接到 GCP 内部网络。 App Check 实际上正是您在这种情况下所寻找的。​​p>

最后,因为我们一直在努力改进 App Check 平台,所以在我们决定下一步要开发哪些反滥用功能时,您在此处留下的 cmets 对我们很有价值。

【讨论】:

感谢您的澄清。 Firebase Hosting 网站将来会获得“连接到 GCP 内部网络”的能力吗?此外,是否可以为 Cloud Functions 配置基于 IP 的速率限制(在函数处理请求之前)?

以上是关于如何限制 Firebase 云功能仅接受来自 Firebase 托管网站的请求的主要内容,如果未能解决你的问题,请参考以下文章

如何触发 Firebase 云功能以添加用户、生成密码并使用该密码发送邮件

由于 CORS 限制,无法使用 firebase 在本地进行测试

Firebase 云功能 [错误:超出内存限制。函数调用被中断。] 在 youtube 视频上传

如何使用 Firebase 云消息设置图像?

如何使用 Firebase 云功能发送自定义电子邮件

是否可以在 Firebase 中仅接受来自我的应用程序的函数调用?