【问题标题】:How to secure access from App Service To Azure Sql Database using virtual network?如何使用虚拟网络保护从应用服务到 Azure Sql 数据库的访问?
【发布时间】:2018-11-02 03:13:01
【问题描述】:

场景

我想使用虚拟网络来限制仅从我的应用服务访问 Azure 数据库,以便我可以在防火墙设置中打开“允许访问应用服务”

我做了什么:

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

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

问题

但是,我仍然得到了

SqlException:无法打开服务器请求的服务器“my-sqlserver” 登录。不允许 IP 地址为“52.233..”的客户端 访问服务器。:

我错过了什么?

【问题讨论】:

  • DavidBrowne anwsered here 说这是可能的,但我也没有成功。有什么建议吗?
  • 为了节省大家阅读以下答案的时间,请知道这仍然不是合理通过 Azure 直接进行的。您可以使用服务端点,但前提是您的应用服务与您的 SQL 数据库位于同一区域。

标签: azure azure-sql-database azure-web-app-service firewall azure-virtual-network


【解决方案1】:

很遗憾,您目前无法实现这种情况。

原因:

  1. 当您将 VNET 集成与 Web 应用程序一起使用时,您的 Web 应用程序可以像 Web App <---> VNET 一样与 VNET 通信。

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

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

解决方案:

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

参考:

VNet Integration 让您的 Web 应用程序可以访问您的资源 虚拟网络,但不授予对您的 Web 应用程序的私有访问权限 虚拟网络。私有站点访问是指使您的应用程序 只能从专用网络访问,例如从 Azure 内部 虚拟网络。私有站点访问仅适用于 ASE 配置有内部负载平衡器 (ILB)。有关使用的详细信息 ILB ASE,从这里的文章开始:Creating and using an ILB ASE

类似情况:App Service VNet Integration with Azure Storage Service Endpoint

【讨论】:

  • 所以你是说每个飞蛾会花费我超过 1000 美元(ASE v2 的月费)?对于只访问 SQL 数据库什么都不做的应用服务?
  • 嗨@Liero。我明白你的意思。但这只是这种情况的解决方案。这取决于产品功能。 ASE 可以做的事情远不止这些。我想说的主要思想是 VNet 集成不能让您的 Web 应用程序位于 VNET 内。 :-)
  • 好的,谢谢。有没有计划在未来改变它?我的意思是在网络级别限制对单个应用服务的 SQL 访问?
  • @Liero 我不知道。但我会将此问题反馈给 Azure PG 团队。
  • Azure 多租户 Web 应用程序毫无价值的另一个原因。没有任何信息安全专家会允许从公共 Internet 访问 SQL 服务器(托管或非托管)。
【解决方案2】:

考虑允许您删除防火墙设置“允许访问应用服务”的一个选项是为特定应用服务的出站 IP 地址添加防火墙规则

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

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

几个重要的警告。

  1. 出站 IP 可以更改,但这样做是可以预见的(请参阅下面的链接)。我在更新防火墙规则的 VSTS 发布过程中运行 PowerShell 脚本。 (如果您还通过发布过程而不是 Azure 门户来管理资源及其规模,那么这种方法似乎是可靠的。)

  2. 我找不到任何信息来确认这些 IP 是否对您的应用服务是唯一的。这是需要考虑的风险。

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

【讨论】:

  • 我对应用服务架构的理解是,这些 IP 地址对于任何一个客户都是/不是/唯一的。除非您拥有每月 1000 美元以上的 ASE,否则您会与许多其他人共享这些外部 IP 地址。
  • @bchurchill 您可能是对的,但替代方案(ASE 除外)是向 所有 Azure 服务开放 - 这种方法至少减少了具有访问权限的 IP 集显着。
  • 是的!这是正确的。事实上,在做出一些改进之前,情况非常糟糕。
  • @SteveS:您介意分享更新防火墙规则的 powershell 吗?
【解决方案3】:

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

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

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

【讨论】:

  • 我刚刚创建了一个全新的环境,其中包含新的应用服务和计划、具有 sql 服务端点的新 vnet 和子网、新的应用服务 vnet 集成(预览版)、具有高级防火墙的新 sql 服务器。仍然,当我从我的 appservice 连接到 azure sql 服务器时,我获得了公共 IP,并且当“允许从 azure 资源访问被禁用”时出现错误
  • 不适用于 sql,因为您需要设置私有 dns 端点并且 Azure Web 应用 vnet 集成无法使用私有 dns。
  • @PeterMoore 您不再需要使用私有端点。请参阅此处替代项下的项目符号 #2:docs.microsoft.com/en-us/azure/architecture/example-scenario/…
【解决方案4】:

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

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

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

【讨论】:

  • 这是“私人链接”功能,还是其他?
  • @Liero 此功能可与 Private Link/Private Endpoints 一起使用,在这种情况下,您可以完全禁用 SQL 公共端点,但也可以与服务端点一起使用。请参阅替代项下的项目符号 #2:docs.microsoft.com/en-us/azure/architecture/example-scenario/…
  • 这个答案含糊地“正确”,但缺乏足够的信息来真正对 IMO 有所帮助。 @SvenAelterman 提到的服务端点只能在您的 SQL DB 和 App 服务位于同一区域时使用,因此仅适用于非常简单的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 2015-08-21
相关资源
最近更新 更多