如何在 Azure SQL 数据库中将 Function 应用程序添加到白名单?

8
我需要配置 Azure SQL 数据库 防火墙设置,以便只能由我的 Azure 函数应用程序 访问。问题是我正在消耗计划中运行该应用程序,并且据我所知,即使我不执行任何操作,出站 IP 地址也可能会改变。
有没有一种方法可以将该应用程序列入白名单,以便保护数据库免受不必要的连接?
我考虑按 Azure 区域进行白名单,因为所有内容都托管在同一区域中,但是如何防范同一区域内的其他应用程序呢?这就是我考虑使用特定 IP 地址的原因。我唯一担心的是,我不知道其他函数应用程序是否可能与我的应用程序共享相同的出站 IP 地址。
附:目前,我的防火墙设置拒绝公共网络访问,并仅允许连接 Azure 服务。

如果您使用高级计划,那么我知道这是可能的。但是我对消耗量一无所知。 - Charles Xu
我觉得高级计划违背了无服务器的初衷。如果必须选择高级函数,我宁愿使用AppService而不是Functions。 - user246392
没问题。如果您使用WebApp,那么标准类型的计划就足够了。而且它也可以实现。 - Charles Xu
@user246392,我知道已经过了一段时间,但我想知道你是否找到了解决方案,因为我也遇到了同样的情况。最终你是否实现了托管服务标识?提前感谢。 - Barnercart
6个回答

4
我遇到了相同的问题,但受管身份验证并没有产生太大的影响。
在SQL服务器的防火墙设置中有一个选项允许Azure资源访问该服务器。对我来说,这个选项被设置为“否”,但需要将其设置为“是”。 enter image description here

1
这将允许来自所有其他客户端的所有Azure资源。 - bittebak

4
有几种方法可以实现这一点。
您可能希望集成VNet或为Azure Functions获取静态IP地址。
图片来自:https://learn.microsoft.com/en-us/azure/azure-functions/functions-networking-options

enter image description here

然而,根据您的评论,我看到您不想使用高级计划。

我建议您实施托管服务标识。

其背后的思想是,您不再使用连接字符串连接数据库,而是使用授予您的访问令牌连接数据库。如果您不在同一身份中,则无法获取访问令牌。

此教程解释了使用应用程序服务的一般思路: https://learn.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-connect-msi

而这个教程则涵盖了您真正想要实现的内容。

https://www.azurecorner.com/using-managed-service-identity-in-azure-functions-to-access-azure-sql-database/

祝你好运!


1

我找不到我得到答案的地方(所以不是我的答案,但在这里分享),您的Azure函数有一个outboundIpAddressespossibleoutboundIpAddresses列表,您可以将它们添加到Azure SQL防火墙规则中(我的有大约10个)。

您可以通过以下方式找到它们...

  1. 转到https://resources.azure.com
  2. 展开订阅 -> [展开您的订阅] -> 提供程序 -> Microsoft.Web -> 网站
  3. 在JSON中找到您的Azure函数站点,并找到outboundIpAddressespossibleoutboundIpAddresses,这些将包含IP地址列表。
  4. 将它们全部添加到SQL服务器的防火墙中。

虽然我不确定这些是否会发生变化,但到目前为止,对我和最初发布此解决方案的人来说,它们都没有出现问题。


这些IP地址是否未绑定到您自己的订阅?如果是,这将基本上使每个客户的每个函数都可以访问您的数据库。 - bittebak
1
有关上述内容的文档链接,请参见https://learn.microsoft.com/en-us/azure/azure-functions/ip-addresses?tabs=portal#find-outbound-ip-addresses - d219
如果我没记错的话,possibleoutboundIpAddresses不包括函数在多个主机上缩放时使用的所有可能IP地址。只有在函数不进行缩放时,此解决方案才能可靠地工作。 - DaveF
你说得很对,我的应用程序从不需要扩展。 - Trevor F

0

1
谢谢。不幸的是,由于预算限制,升级到高级计划对我来说不是一个选择。 - user246392

0

如果函数应用程序运行在消耗层(没有静态 IP)上,那么不需要将 IP 地址加入白名单,这个能否正常工作? - retail3r

-1

虚拟网络在Azure上的工作方式与本地不同

如果您创建了一个vnet,在子网中添加了Azure函数,并在SQL Server中允许此子网访问,很遗憾这样做是行不通的

如果您允许“公共访问”和/或“Azure资源访问”,那么事情就简单了。您使用SQL凭据登录并获得访问权限。

如果您阻止公共访问,我不确定您的资源是否能够访问数据库,因为所有连接都来自于互联网而不是您的内部网络。

对我有效的解决方案是:

  1. 创建一个vnet
  2. 在此vnet中为Sql server创建一个私有端点(IT-OPS人员创建了自定义DNS记录)。
  3. Azure函数使用此vnet的子网。

现在,您可以关闭数据库中的公共和Azure资源访问。

所有调用都将通过您的虚拟网络进行(不再通过互联网),只有使用此vnet的子网的应用程序才能连接到数据库。


关于第三点,据我所知,消耗计划不支持虚拟网络集成。 - baouss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接