你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:使用虚拟网络集成在 Azure 应用服务中隔离后端通信

在本文中,你将配置一个应用服务应用,该应用具有与后端服务的安全、网络隔离的通信。 教程:使用密钥保管库保护从应用服务进行的认知服务连接中介绍了使用的示例方案。 完成后,你有一个应用服务应用,该应用通过 Azure 虚拟网络访问 Key Vault 和 Foundry 工具。 不允许其他流量访问这些后端资源。 所有流量将通过 虚拟网络集成专用终结点在虚拟网络中隔离。

在多租户服务中,从应用服务应用到其他 Azure 服务的出站网络流量与其他应用甚至其他订阅共享相同的环境。 尽管流量本身可以加密,但某些方案可能需要通过隔离来自其他网络流量的后端通信实现额外的安全级别。 这些方案通常可供具有较高专业知识的大型企业访问,但应用服务可通过虚拟网络集成实现它。

显示方案体系结构的图表。

在此体系结构中:

  • 已阻止对后端服务的公共访问流量。
  • 从应用服务的出站流量路由到虚拟网络,并可以访问后端服务。
  • 应用服务可以通过专用 DNS 区域对后端服务执行 DNS 解析。

你将了解的内容:

  • 为应用服务虚拟网络集成创建虚拟网络和子网
  • 创建专用 DNS 区域
  • 创建专用终结点
  • 在应用服务中配置虚拟网络集成

先决条件

创建虚拟网络和子网

  1. 创建虚拟网络。 将虚拟网络名称<替换为>唯一名称。

    # Save the virtual network name as a variable for convenience
    vnetName=<virtual-network-name>
    
    az network vnet create --resource-group $groupName --location $region --name $vnetName --address-prefixes 10.0.0.0/16
    
  2. 为应用服务虚拟网络集成创建子网。

    az network vnet subnet create --resource-group $groupName --vnet-name $vnetName --name vnet-integration-subnet --address-prefixes 10.0.0.0/24 --delegations Microsoft.Web/serverfarms --private-endpoint-network-policies Enabled
    

    对于应用服务,建议虚拟网络集成子网至少具有 CIDR 块 /26 。 (请参阅 虚拟网络集成子网要求/24 已足够。 --delegations Microsoft.Web/serverfarms 指定将子网委托给应用服务虚拟网络集成

  3. 为专用终结点创建另一个子网。

    az network vnet subnet create --resource-group $groupName --vnet-name $vnetName --name private-endpoint-subnet --address-prefixes 10.0.1.0/24 --private-endpoint-network-policies Disabled
    

    对于专用终结点子网,需要 禁用专用终结点网络策略

创建专用 DNS 区域

由于 Key Vault 和 Foundry Tools 资源位于 专用终结点后面,因此需要为其定义 专用 DNS 区域 。 这些区域用于托管专用终结点的 DNS 记录,并允许客户端按名称查找后端服务。

  1. 创建两个专用 DNS 区域,一个用于 Foundry Tools 资源,一个用于密钥保管库。

    az network private-dns zone create --resource-group $groupName --name privatelink.cognitiveservices.azure.com
    az network private-dns zone create --resource-group $groupName --name privatelink.vaultcore.azure.net
    

    有关这些设置的详细信息,请参阅 Azure 专用终结点 DNS 配置

  2. 将专用 DNS 区域链接到虚拟网络。

    az network private-dns link vnet create --resource-group $groupName --name cognitiveservices-zonelink --zone-name privatelink.cognitiveservices.azure.com --virtual-network $vnetName --registration-enabled False
    az network private-dns link vnet create --resource-group $groupName --name vaultcore-zonelink --zone-name privatelink.vaultcore.azure.net --virtual-network $vnetName --registration-enabled False
    

创建专用终结点

  1. 在虚拟网络的专用终结点子网中,为 Foundry Tools 资源创建专用终结点。

    # Get Foundry Tools resource ID
    csResourceId=$(az cognitiveservices account show --resource-group $groupName --name $csResourceName --query id --output tsv)
    
    az network private-endpoint create --resource-group $groupName --name securecstext-pe --location $region --connection-name securecstext-pc --private-connection-resource-id $csResourceId --group-id account --vnet-name $vnetName --subnet private-endpoint-subnet
    
  2. 为 Foundry 工具专用终结点创建 DNS 区域组。 DNS 区域组是专用 DNS 区域与专用终结点之间的链接。 当专用终结点更新时,此链接可帮助你自动更新专用 DNS 区域。

    az network private-endpoint dns-zone-group create --resource-group $groupName --endpoint-name securecstext-pe --name securecstext-zg --private-dns-zone privatelink.cognitiveservices.azure.com --zone-name privatelink.cognitiveservices.azure.com
    
  3. 阻止公共流量访问 Foundry Tools 资源。

    az rest --uri $csResourceId?api-version=2024-10-01 --method PATCH --body '{"properties":{"publicNetworkAccess":"Disabled"}}' --headers 'Content-Type=application/json'
    
    # Repeat the following command until the output is "Succeeded"
    az cognitiveservices account show --resource-group $groupName --name $csResourceName --query properties.provisioningState
    

    注释

    确保更改的预配状态为 "Succeeded"。 然后,可以在示例应用中观察行为更改。 你仍然可以加载应用,但如果尝试选择“ 检测 ”按钮,则会收到错误 HTTP 500 。 该应用通过共享网络失去了与 Foundry Tools 资源的连接。

  4. 针对密钥保管库重复使用上述步骤。

    # Create a private endpoint for the key vault
    vaultResourceId=$(az keyvault show --name $vaultName --query id --output tsv)
    az network private-endpoint create --resource-group $groupName --name securekeyvault-pe --location $region --connection-name securekeyvault-pc --private-connection-resource-id $vaultResourceId --group-id vault --vnet-name $vnetName --subnet private-endpoint-subnet
    # Create a DNS zone group for the endpoint
    az network private-endpoint dns-zone-group create --resource-group $groupName --endpoint-name securekeyvault-pe --name securekeyvault-zg --private-dns-zone privatelink.vaultcore.azure.net --zone-name privatelink.vaultcore.azure.net
    # Block public traffic to the key vault
    az keyvault update --name $vaultName --default-action Deny
    
  5. 重置应用设置,以强制立即重新提取应用中的密钥保管库引用。 (有关详细信息,请参阅 旋转

    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
    

    注释

    同样,可以观察示例应用中的行为更改。 您无法加载应用,因为应用无法再访问密钥保管库引用。 应用通过共享网络失去了与密钥保管库的连接。

只有创建的虚拟网络中的客户端才能访问这两个专用终结点。 你甚至无法通过 Azure 门户中的 “机密” 页访问密钥保管库中的机密,因为门户是通过公共互联网访问它们的。 (请参阅 管理锁定的资源

在应用中配置虚拟网络集成

  1. 将应用升级到受支持的定价层级。 (请参阅 将应用与 Azure 虚拟网络集成

    az appservice plan update --name $planName --resource-group $groupName --sku S1
    
  2. 为入站请求强制实施 HTTPS。 (此步骤与当前方案无关,但很重要。

    az webapp update --resource-group $groupName --name $appName --https-only
    
  3. 在应用上启用虚拟网络集成。

    az webapp vnet-integration add --resource-group $groupName --name $appName --vnet $vnetName --subnet vnet-integration-subnet
    

    虚拟网络集成允许出站流量直接流入虚拟网络。 默认情况下,只会将 RFC-1918 中定义的本地 IP 流量路由到虚拟网络,这正是专用终结点所需要的。 有关将所有流量路由到虚拟网络的信息,请参阅 管理虚拟网络集成路由。 如果想要通过虚拟网络路由 Internet 流量,也可以通过 Azure NAT 网关Azure 防火墙路由所有流量。

  4. 在浏览器中,转到 <app-name>.azurewebsites.net 并等待集成生效。 如果收到 HTTP 500 错误,请等待几分钟,然后重试。 如果您可以加载页面并获得检测结果,那么您正在通过密钥保管库引用连接到 Foundry Tools 端点。

    注释

    如果经过较长一段时间后仍收到 HTTP 500 错误,再次强制重新提取密钥保管库引用可能会有帮助:

    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
    

管理锁定的资源

根据您的具体情况,您可能无法通过 Azure 门户、Azure CLI 或 Azure PowerShell(例如 Key Vault)管理受专用终结点保护的资源。 这些工具都进行 REST API 调用以通过公共 Internet 访问资源,并被配置阻止。 下面是一些用于访问锁定资源的选项:

清理资源

在前面的步骤中,你在资源组中创建Azure资源。 如果将来不需要这些资源,请通过在Cloud Shell中运行以下命令删除资源组:

az group delete --name $groupName

运行此命令可能需要一分钟时间。

后续步骤