限制来自 Blob 存储中静态网站的 Azure 函数调用?

Posted

技术标签:

【中文标题】限制来自 Blob 存储中静态网站的 Azure 函数调用?【英文标题】:Limit Azure functions call from static website in Blob Storage? 【发布时间】:2021-11-02 14:54:09 【问题描述】:

我们在 Azure Functions 中有多个函数,其中一些被托管在 blob 存储上的网页使用。

我希望网页(blob 存储)使用的函数限制调用,因此它们只能被网页调用,而不能被其他任何人调用。这样的事情可能吗?

我找到了通过 IP 限制访问的选项,但网页几乎在任何计算机上都有不同的 IP,所以这个选项似乎不是一个好的解决方案。

好的解决方案是限制从域名调用函数,但 Azure 中没有此选项。

有人有其他想法吗?

【问题讨论】:

由于基于 blob 的网站托管在某个站点上,因此您可以使用 CORS 使您的网站仅调用 API。给定的答案将完美地工作 【参考方案1】:

您可以通过两种方式实现:

1.如果您在函数应用中有少量函数,那么这种快速且简单且便宜的方法

您可以通过在您的函数应用中启用 CORS 并指定可以访问您的函数应用(及其函数)的域列表来实现此目的。

执行此操作的步骤:

    转到 Azure 中的函数应用资源 在 API 菜单下选择 CORS 选中提供“启用访问控制允许凭据”选项的复选框 指定要允许访问的域或域列表 保存

跨域资源共享 (CORS) 允许 javascript 代码在 外部主机上的浏览器与您的后端交互。指定 应该允许进行跨域调用的源(对于 例如:http://example.com:12345)。要允许所有,请使用“*”并删除 列表中的所有其他来源。斜杠不允许作为 域或 TLD 之后。

2。如果您有更多预算并且您的功能是大型企业应用程序的一部分,则这种方法更安全

    在您的函数应用前面部署一个新的 Azure API 管理实例。 (https://docs.microsoft.com/en-us/azure/api-management/import-function-app-as-api)

    使用 APIM 服务标签对您的函数应用进行安全访问限制,以仅允许从 APIM 访问并拒绝所有其他流量(在此处阅读更多信息:https://docs.microsoft.com/en-us/azure/app-service/app-service-ip-restrictions)

    完成第 1 步和第 2 步后,您的函数应用将无法直接访问。您(或其他任何人)只能使用订阅密钥通过 APIM 访问它。 (信息: https://docs.microsoft.com/en-us/learn/modules/publish-manage-apis-with-azure-api-management https://docs.microsoft.com/en-us/learn/modules/control-authentication-with-apim/)

    在 APIM 中启用 CORS (https://docs.microsoft.com/en-us/azure/api-management/api-management-cross-domain-policies#CORS)

如您所见,APIM 为您提供了额外的保护层,您可以在其中按域进行限制,除此之外,仅允许提供订阅密钥访问您的函数的请求。您可以随时撤销和重新生成这些密钥,以确保恶意用户无法访问您的函数应用。您还可以配置诸如速率限制之类的东西来防止 DDOS 攻击。

PS:估计你也会觉得这个答案很有趣。恶意用户可以欺骗 CORS。但是,将您的函数应用程序保护在 APIM 实例后面将为您提供更高的安全性。取决于您希望应用程序的安全级别与预算 - What's to stop malicious code from spoofing the "Origin" header to exploit CORS?

您可以遵循 Azure 的 APIM 安全基线建议,通过 APIM 进一步保护您的函数应用: https://docs.microsoft.com/en-us/security/benchmark/azure/baselines/api-management-security-baseline

【讨论】:

请注意,CORS 只能限制其他 Web 应用程序调用您的函数,因为浏览器会尊重 CORS。但是,这很容易绕过,移动和桌面应用等其他类型的应用仍然可以调用这些函数。 @AnthonyChu :正是我在这里提到的。取决于他渴望拥有的安全级别以及他是否有预算来保护 APIM 实例后面的功能应用程序。 ***.com/questions/21058183/… 不幸的是,需要 APIM 密钥也不一定安全,因为通常您会将密钥嵌入您的网络应用程序(或其他类型的客户端,如移动和桌面应用程序)。可以提取密钥并用于调用 API。我担心这个答案中的选项显示为安全的,但事实并非如此。 同意您的担忧。我从来没有说过保护函数应用程序的两种方法是万无一失的。我只是说第二个选项是一个更好的选择,因为它“更安全”,因为“您可以随时撤销和重新生成这些密钥,以确保恶意用户无法访问您的函数应用程序。您还可以配置诸如速率之类的东西-限制以防止 DDOS 攻击。” 您可以按照 Azure 的 APIM 安全基线建议进一步提高安全性:docs.microsoft.com/en-us/security/benchmark/azure/baselines/…

以上是关于限制来自 Blob 存储中静态网站的 Azure 函数调用?的主要内容,如果未能解决你的问题,请参考以下文章

web.config 重写规则在 blob 存储中的 Azure 静态网站中不起作用

Azure Blob 存储的文件大小限制?

Azure Vnet Blob 存储

如何检查文件是不是存储在 Azure Blob 中

保护 Azure 存储帐户中托管的静态网站的路由

从 azure blob 存储中提供 webapp 静态内容