この記事では、バックエンド サービスへのセキュリティで保護されたネットワーク分離通信を使用して 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 で仮想ネットワーク統合を構成する
[前提条件]
チュートリアルを完了する: Key Vault を使用して App Service からの Cognitive Service 接続をセキュリティで保護し、言語検出アプリを作成します。
チュートリアル: Key Vault を使用して App Service から Cognitive Service 接続をセキュリティで保護する方法については、次の環境変数を必ず設定してください。
groupName=myKVResourceGroup region=canadacentral csResourceName=<cs-resource-name> appName=<app-name> vaultName=<vault-name> planName=<plan-name> csResourceKVUri=<cs-resource-kv-uri> csKeyKVUri=<cs-key-kv-uri>
仮想ネットワークとサブネットの作成
仮想ネットワークを作成します。 <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/16App 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 EnabledApp Service の場合は、仮想ネットワーク統合サブネットに少なくとも
/26の CIDR ブロックを設定することをお勧めします。 ( 仮想ネットワーク統合サブネットの要件を参照してください)。/24は十分以上です。--delegations Microsoft.Web/serverfarmsでは、サブネットを App Service の仮想ネットワーク統合に委任することを指定します。プライベート エンドポイント用の別のサブネットを作成します。
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 レコードをホストし、クライアントが名前でバックエンド サービスを検索できるようにするために使用されます。
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 構成」を参照してください。
プライベート 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
プライベート エンドポイントを作成する
仮想ネットワークのプライベート エンドポイント サブネットで、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-subnetFoundry 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.comFoundry 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 リソースへの接続を失いました。キーボールトに対して前述の手順を繰り返します。
# 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アプリの設定を再設定して、アプリ内のキー ボールト参照を即時に再フェッチするように強制します。 (詳細については、「 回転」を参照してください)。
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 の [シークレット ] ページからキー コンテナー内のシークレットにアクセスすることもできません。 (「 ロックダウンされたリソースの管理」を参照してください)。
アプリで仮想ネットワーク統合を構成する
サポートされている価格レベルにアプリをスケールアップします。 (アプリ と Azure 仮想ネットワークの統合に関するページを参照してください)。
az appservice plan update --name $planName --resource-group $groupName --sku S1受信要求に HTTPS を適用します。 (この手順は現在のシナリオには関係ありませんが、重要です)。
az webapp update --resource-group $groupName --name $appName --https-onlyアプリで仮想ネットワーク統合を有効にします。
az webapp vnet-integration add --resource-group $groupName --name $appName --vnet $vnetName --subnet vnet-integration-subnet仮想ネットワーク統合により、アウトバウンド トラフィックを仮想ネットワークに直接流すことができます。 既定では、RFC-1918 で定義されているローカル IP トラフィックのみが仮想ネットワークにルーティングされます。これはプライベート エンドポイントに必要な動作です。 すべてのトラフィックを仮想ネットワークにルーティングする方法については、「仮想ネットワーク 統合ルーティングの管理」を参照してください。 Azure NAT ゲートウェイ や Azure Firewall など、仮想ネットワーク経由でインターネット トラフィックをルーティングする場合は、すべてのトラフィックをルーティングすることもできます。
ブラウザーで、
<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 分かかることがあります。