チュートリアル:仮想ネットワーク統合を使用して Azure App Service のバックエンド通信を分離する

この記事では、バックエンド サービスへのセキュリティで保護されたネットワーク分離通信を使用して App Service アプリを構成します。 使用されているシナリオの例は、Tutorial: App Service から Key Vault を使用して Cognitive Service 接続をセキュリティ保護する方法です。 完了すると、 Azure 仮想ネットワークを介して Key Vault と Foundry Tools の両方にアクセスする App Service アプリが完成します。 その他のトラフィックは、これらのバックエンド リソースへのアクセスを許可されません。 すべてのトラフィックは、仮想ネットワーク統合とプライベート エンドポイントを介して仮想ネットワーク内で分離されます。

マルチテナント サービスでは、App Service アプリから他の Azure サービスへの送信ネットワーク トラフィックは、他のアプリや他のサブスクリプションと同じ環境を共有します。 トラフィック自体は暗号化できますが、特定のシナリオでは、他のネットワーク トラフィックからのバックエンド通信を分離することで、追加のレベルのセキュリティが必要になる場合があります。 これらのシナリオは、通常、高度な専門知識を持つ大企業からアクセスできますが、App Service では仮想ネットワーク統合を利用できます。

シナリオのアーキテクチャを示す図。

このアーキテクチャでは、次のことを行います。

  • バックエンド サービスへのパブリック トラフィックがブロックされます。
  • App Service からの送信トラフィックは仮想ネットワークにルーティングされ、バックエンド サービスに到達できます。
  • App Service では、プライベート DNS ゾーンを介してバックエンド サービスに対して DNS 解決を実行できます。

学習内容:

  • App Service 仮想ネットワーク統合用の仮想ネットワークとサブネットを作成する
  • プライベート DNS ゾーンを作成する
  • プライベート エンドポイントを作成する
  • App Service で仮想ネットワーク統合を構成する

[前提条件]

仮想ネットワークとサブネットの作成

  1. 仮想ネットワークを作成します。 <virtual-network-name> を一意の名前に置き換えます。

    # 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. 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 --private-endpoint-network-policies Enabled
    

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

    プライベート エンドポイント サブネットの場合は、 プライベート エンドポイント ネットワーク ポリシーを無効にする必要があります

プライベート DNS ゾーンを作成する

Key Vault と Foundry Tools のリソースは プライベート エンドポイントの背後に配置されるため、それらの プライベート DNS ゾーン を定義する必要があります。 これらのゾーンは、プライベート エンドポイントの DNS レコードをホストし、クライアントが名前でバックエンド サービスを検索できるようにするために使用されます。

  1. Foundry Tools リソース用とキー コンテナー用の 2 つのプライベート DNS ゾーンを作成します。

    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 Tools プライベート エンドポイントの 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)"
    

    ここでも、サンプル アプリで動作の変化を観察できます。 アプリを読み込むことができません。Key Vault の参照にアクセスできなくなったためです。 アプリは、共有ネットワークを通じてキー ボールトへの接続を失いました。

2 つのプライベート エンドポイントには、作成した仮想ネットワーク内のクライアントのみがアクセスできます。 ポータルはパブリック インターネット経由でシークレットにアクセスするため、Azure portal の [シークレット ] ページからキー コンテナー内のシークレットにアクセスすることもできません。 (「 ロックダウンされたリソースの管理」を参照してください)。

アプリで仮想ネットワーク統合を構成する

  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 トラフィックのみが仮想ネットワークにルーティングされます。これはプライベート エンドポイントに必要な動作です。 すべてのトラフィックを仮想ネットワークにルーティングする方法については、「仮想ネットワーク 統合ルーティングの管理」を参照してください。 Azure NAT ゲートウェイAzure Firewall など、仮想ネットワーク経由でインターネット トラフィックをルーティングする場合は、すべてのトラフィックをルーティングすることもできます。

  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 portal、Azure CLI、または Azure PowerShell (Key Vault など) を使用して、プライベート エンドポイントで保護されたリソースを管理できない場合があります。 これらのツールはすべて、パブリック インターネット経由でリソースにアクセスするための REST API 呼び出しを行い、構成によってブロックされます。 ロックダウンされたリソースにアクセスするためのオプションをいくつか次に示します。

  • Key Vault の場合は、ローカル コンピューターのパブリック IP を追加して、プライベート エンドポイントによって保護されているシークレットを表示または更新します。
  • オンプレミス ネットワークが VPN ゲートウェイ または Azure ExpressRoute 経由で Azure 仮想ネットワークに拡張されている場合は、オンプレミス ネットワークから直接プライベート エンドポイントの保護されたリソースを管理できます。
  • 仮想ネットワーク内の ジャンプ サーバー からプライベート エンドポイントで保護されたリソースを管理します。
  • 仮想ネットワークへのCloud Shellのデプロイ

リソースをクリーンアップする

前の手順では、リソース グループ内にAzureリソースを作成しました。 今後これらのリソースが必要ない場合は、Cloud Shellで次のコマンドを実行してリソース グループを削除します。

az group delete --name $groupName

このコマンドの実行には 1 分かかることがあります。

次のステップ