教學課程:使用虛擬網路整合在 Azure App Service 中隔離後端通訊

在本文中,您將使用與後端服務的安全、網路隔離的通訊來設定 App Service 應用程式。 使用的範例案例在教學課程:使用 Key Vault 從 App Service 中保護認知服務。 當您完成時,您有一個App Service應用程式,可透過Azure 虛擬網路存取金鑰保存庫和 Azure AI 服務,而且不允許其他流量存取這些後端資源。 在您的虛擬網路中,會使用虛擬網路整合私人端點隔離所有流量。

作為多重租用戶服務,從您的 App Service 應用程式輸出至其他 Azure 服務的網路流量,與其他應用程式,或者甚至是其他訂用帳戶共用相同的環境。 雖然流量本身可以加密,但是某些案例可能需要透過隔離來自其他網路流量後端通訊的額外安全性等級。 通常僅有具備高階專業知識的大型企業,才能使用這些案例,但 App Service 透過虛擬網路整合讓這些案例變得更平易近人。

案例結構

透過此結構:

  • 後端服務的公用流量已封鎖。
  • 從 App Service 的輸出流量已路由至虛擬網路,並且可以觸達後端服務。
  • App Service 能夠透過私人 DNS 區域對後端服務執行 DNS 解析。

您將了解:

  • 建立虛擬網路和子網路以進行 App Service 虛擬網路整合
  • 建立私人 DNS 區域
  • 建立私人端點
  • 在 App Service 中設定虛擬網路整合

先決條件

本教學課程假設您已遵循教學課程:使用 Key Vault 從 App Service 設定認知服務連線,並且已建立語言偵測器應用程式。

本教學課程會繼續使用下列上一個教學課程中的環境變數。 請確定您已正確設定。

    groupName=myKVResourceGroup
    region=westeurope
    csResourceName=<cs-resource-name>
    appName=<app-name>
    vaultName=<vault-name>

建立虛擬網路和子網路

  1. 建立虛擬網路。 以唯一的名稱取代 <virtual-network-name>

    # Save vnet name as 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. 建立 App Service 虛擬網路整合的子網路。

    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 --disable-private-endpoint-network-policies false
    

    針對 App Service,建議虛擬網路整合子網路至少具有 /26 個 CIDR 區塊 (請參閱虛擬網路整合子網路需求)。 /24 已足夠。 --delegations Microsoft.Web/serverfarms 指定將子網路委派至 App Service 虛擬網路整合

  3. 建立私人端點的另一個子網路。

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

    針對私人端點子網路,您必須停用私人端點網路原則

建立私人 DNS 區域

由於您的金鑰保存庫和 Azure AI 服務資源會位於私人端點後方,因此您必須為其定義私人 DNS 區域。 這些區域可以用來支援私人端點的 DNS 資料列,並允許用戶端依名稱尋找後端服務。

  1. 建立兩個私人 DNS 區域,一個用於您的 Azure AI 服務資源,另一個用於金鑰保存庫。

    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. 在虛擬網路的私人端點子網路中,為您的認知服務建立私人端點。

    # Get Cognitive Services 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. 建立 Azure AI 服務私人端點的 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. 封鎖對 Azure AI 服務資源的公用流量。

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

    注意

    請確定您變更的佈建狀態為 "Succeeded"。 然後您可以觀察樣本應用程式中的行為變更。 您仍可以載入應用程式,但如果您嘗試按一下 [偵測] 按鈕,您會收到 HTTP 500 錯誤。 應用程式已透過共用網路失去與 Azure AI 服務資源的連線。

  4. 對金鑰保存庫重複以上步驟。

    # Create private endpoint for 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 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 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 $appName --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 流量,才會路由至虛擬網路,這正是您私人端點所需要的。 若要將您的所有流量路由至虛擬網路,請參閱管理虛擬網路整合路由。 如果您想要透過您的虛擬網路路由網際網路流量,例如:透過 Azure 虛擬網路 NATAzure 防火牆,也可以使用路由所有流量。

  4. 在瀏覽器中,再次瀏覽至 <app-name>.azurewebsites.net,並等待整合生效。 如果您收到 HTTP 500 錯誤,請稍候幾分鐘後再試一次。 如果您可以載入頁面並取得偵測結果,則會使用金鑰保存庫參考連線到 Azure AI 服務端點。

    注意

    如果長時間持續收到 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 呼叫,以透過公用網際網路存取資源,並且遭到您的設定封鎖。 以下是一些存取鎖定資源的選項:

  • 針對 Key Vault,請新增您本機電腦的公用 IP,以檢視或更新私人端點受保護的祕密。
  • 如果您的內部部署網路是透過 VPN 閘道ExpressRoute 擴充至 Azure 虛擬網路,您可以從您的內部部署網路,直接管理私人端點中受保護的資源。
  • 從虛擬網路中的跳躍伺服器管理受私人端點受保護資源。
  • 將 Cloud Shell 部署至虛擬網路

清除資源

在前述步驟中,您在資源群組中建立了 Azure 資源。 如果您在未來不需要這些資源,請在 Cloud Shell 中執行下列命令,刪除資源群組:

az group delete --name $groupName

此命令可能會花一分鐘執行。

後續步驟