この記事では、バックエンド サービスへのセキュリティで保護されたネットワーク分離通信を使用して App Service アプリを構成します。 この例で使用されているシナリオは、Tutorial: Key Vault を使用した App Service からの Cognitive Service 接続をセキュリティ保護する方法です。 完了すると、Key Vaultと Foundry Tools の両方に Azure 仮想ネットワーク経由でアクセスする App Service アプリがあり、そのバックエンド リソースへの他のトラフィックへのアクセスは許可されません。 すべてのトラフィックは、仮想ネットワーク統合とプライベート エンドポイントを使用して、仮想ネットワーク内で分離されます。
マルチテナント サービスとして、App Service アプリから他のAzure サービスへの送信ネットワーク トラフィックは、他のアプリや他のサブスクリプションと同じ環境を共有します。 トラフィック自体は暗号化できますが、一部のシナリオでは、バックエンド通信を他のネットワーク トラフィックから分離することで、追加のレベルのセキュリティが必要になる場合があります。 これらのシナリオは、通常、高度な専門知識を持つ大企業からアクセスできますが、App Service では仮想ネットワーク統合を利用できます。
シナリオ アーキテクチャ
このアーキテクチャでは、次のことが行われます。
- バックエンド サービスへのパブリック トラフィックがブロックされます。
- App Service からの送信トラフィックは仮想ネットワークにルーティングされ、バックエンド サービスに到達できます。
- App Service は、プライベート DNS ゾーンを介してバックエンド サービスに対して DNS 解決を実行できます。
学習内容
- App Service 仮想ネットワーク統合用の仮想ネットワークとサブネットを作成する
- プライベート DNS ゾーンを作成する
- プライベート エンドポイントを作成する
- App Service で仮想ネットワーク統合を構成する
[前提条件]
このチュートリアルでは、チュートリアル: Key Vault を使ったアプリサービスからのセキュアな Cognitive Service 接続から始め、言語検出アプリを作成していることを前提としています。
このチュートリアルでは、前のチュートリアルの次の環境変数を引き続き使用します。 正しく設定していることを確認します。
groupName=myKVResourceGroup
region=westeurope
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 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/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 の場合、仮想ネットワーク統合サブネットには、少なくとも の CIDR ブロックを設定することをお勧めします ( 仮想ネットワーク統合サブネットの要件を参照)。 十分すぎるほどです。 では、サブネットを 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リソースとAzure AI サービス リソースは private エンドポイント の背後に配置されるため、private DNS ゾーンを定義する必要があります。 これらのゾーンは、プライベート エンドポイントの DNS レコードをホストし、クライアントが名前でバックエンド サービスを検索できるようにするために使用されます。
Azure AI サービス リソース用とキー コンテナー用の 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
プライベート エンドポイントを作成する
仮想ネットワークのプライベート エンドポイント サブネットで、Cognitive Service のプライベート エンドポイントを作成します。
# 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-subnetAzure AI Services プライベート エンドポイントの 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.comAzure AI サービス リソースへのパブリック トラフィックをブロックします。
az rest --uri $csResourceId?api-version=2024-10-01 --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注
変更のプロビジョニングの状態が になっていることを確認します。 その後、サンプル アプリで動作の変化を観察できます。 引き続きアプリを読み込むことができますが、[ 検出 ] ボタンをクリックしようとすると、 エラーが表示されます。 アプリは、共有ネットワークを介してAzure AI サービス リソースへの接続を失いました。
キーボールトに対して上記の手順を繰り返します。
# 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アプリの設定をリセットして、アプリ内のキー ボールト参照を即座に取得し直すように強制します(詳細については、「ローテーション」を参照してください)。
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 ポータルの Secrets ページを介してキー コンテナー内のシークレットにアクセスすることもできません (ロックダウン リソースの管理を参照)。
アプリで仮想ネットワーク統合を構成する
サポートされている価格レベルにアプリをスケールアップします (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 Virtual Network NAT または Azure Firewall のような仮想ネットワークを介してインターネットトラフィックをルーティングしたい場合、すべてのトラフィックのルーティングを使用することもできます。
ブラウザーで、もう一度 に移動し、統合が有効になるまで待ちます。 HTTP 500 エラーが発生した場合は、数分待ってからやり直してください。 ページを読み込んで検出結果を取得できる場合は、キー コンテナー参照を使用して Azure AI Services エンドポイントに接続します。
注
しばらく待っても HTTP 500 エラーが返される場合は、再度、Key Vault 参照の再フェッチを強制的に実行してみてください。
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
このコマンドの実行には、少し時間がかかる場合があります。
次のステップ
- Azure仮想ネットワークを使用してアプリを統合します
- App Service のネットワーク機能