如何使用虚拟网络保护从 App Service 到 Azure Sql 数据库的访问?

How to secure access from App Service To Azure Sql Database using virtual network?

场景

我想使用虚拟网络来限制只能从我的应用服务访问 Azure 数据库,这样我就可以在防火墙设置中关闭 "Allow access to App Services"

我做了什么:

  1. 我转到应用服务 -> 网络 -> VNET 集成 -> 设置 -> 创建新的虚拟网络
  2. 我已经使用默认设置创建了新的 VNET。
  3. 创建 VNET 时,我转到应用服务 -> 网络 -> VNET 集成并确保 VNET 已连接
  4. 我转到 SQL 防火墙设置 -> 虚拟网络 -> 添加现有虚拟 Newtork 并选择我的 VNET。我保留了默认子网和地址 space: "default / 10.0.0.0/24" 并且未选中 IgnoreMissingServiceEndpoint 标志。

我现在可以在我的 VNET 中看到 Microsoft.Sql 服务端点:

问题

但是,我仍然得到

SqlException: Cannot open server 'my-sqlserver' requested by the login. Client with IP address '52.233..' is not allowed to access the server.:

我错过了什么?

很遗憾,您暂时无法实现此场景。

为什么:

  1. 当您将 VNET 与您的 Web 应用程序集成时,您的 Web 应用程序可以像 Web App <---> VNET.

  2. 一样与 VNET 通信
  3. 当您使用 SQL 防火墙允许来自特定 VNet 的流量时,来自 VNET 地址 space 的流量可以与您的 SQL 通信,例如 VNet <---> SQL server.

  4. 设置完所有配置后,您的场景应该是Web App <---> VNET <---> SQL server重要的是,来自 Web App 的流量无法通过 VNET 到达 SQL 服务器,因为 Web App 不在 VNET 内,而是在 VNET 之外!所以,当您使用Web App尝试访问SQL服务器时,流量不是来自VNET。

解法:

解决方案是将您的 Web 应用程序放入 VNet。因此,您可以使用 Azure ASE 来实现此目的。

参考:

VNet Integration gives your web app access to resources in your virtual network but does not grant private access to your web app from the virtual network. Private site access refers to making your app only accessible from a private network such as from within an Azure virtual network. Private site access is only available with an ASE configured with an Internal Load Balancer (ILB). For details on using an ILB ASE, start with the article here: Creating and using an ILB ASE.

相似案例:

允许您删除防火墙设置的一个选项"Allow access to App Services"是为您的特定应用服务的出站 IP 地址添加防火墙规则.

您可以在应用服务的“属性”部分或使用 PowerShell 找到当前列表...

$outboundIps = (Get-AzureRmResource -ResourceGroupName $rg -ResourceType Microsoft.Web/sites -ResourceName $appService).Properties.outboundIpAddresses

几个重要的警告。

  1. 出站 IP 可以更改,但可以预见(请参阅下面的 link)。我 运行 PowerShell 脚本作为更新防火墙规则的 VSTS 发布过程的一部分。 (如果您还通过发布过程而不是 Azure 门户管理资源及其规模,则此方法似乎可靠。)

  2. 我没能找到任何信息来确认这些 IP 是否是您的应用服务所独有的。这是一个需要考虑的风险。

https://docs.microsoft.com/en-us/azure/app-service/app-service-ip-addresses

如果您想通过服务端点锁定从您的应用程序到 Azure SQL、存储、Cosmos DB 等服务的访问权限,您可以使用新的 VNet 集成功能。该功能的早期形式需要网关并建立在点到站点 VPN 的基础上。来自您的应用程序的源 IP 将是指向站点地址的点之一。仅当您的源 IP 是 VNet 地址之一时,服务终结点才有效。

通过新的 VNet 集成,您的应用后端将使用所选子网中的 IP 进行调用。这意味着您可以在该子网上设置服务端点。

不要将这与您的应用程序的服务端点混淆。这是最近发布的将应用流量锁定到选定 VNet/subnets 的功能。

我相信 Azure 现在已经包含对您的方案的支持,允许像这样的连接 Web App <---> VNET <---> SQL server,这与 @Waine Yang 的回应相反。我刚刚将我的 Azure Functions 配置为通过私有 VNET 与只能通过该 VNET 访问的 SQL 服务器通信。

现在,当您尝试在应用服务中设置 VNET 集成时,Azure 会显示以下消息(请注意它还显示 or through your Azure VNET):

Here 是关于如何使用 Terraform 创建它的示例: