Azure App ServiceをリージョンVNet統合とプライベートエンドポイントを使って非公開にする

こんにちは。神田です。今回はApp ServiceにリージョンVNet統合とプライベートエンドポイントを使って仮想ネットワーク内に閉じ込めてみます。

リージョン VNet 統合について

リージョンVNet統合とはApp Serviceの送信方向の通信を仮想ネットワークにルーティングさせる機能です。
この機能を利用することでApp Serviceから仮想ネットワーク内のサービスに接続したり、
ExpressRouteを経由してオンプレのリソースにアクセスしたりできます。

また、通信が仮想ネットワーク内を通るのでネットワークセキュリティグループによるセキュリティの強化や、ルートテーブルでのルーティングの制御などもできます。
ただし、あくまで送信方向のみ仮想ネットワークにルーティングするだけなので、
App Serviceへのアクセスは変わらずパブリックアクセスになります。

1つのApp Service Planにつき紐付けられるサブネットは1つという制限があるので、
ネットワークを細かく分ける場合はその分App Service Planが増えてしまい、料金が増えてしまいます。

また、既定では仮想ネットワークにルーティングされる通信はRFC1918 トラフィックの範囲(10.0.0.0-10.255.255.255/172.16.0.0-172.31.255.255/192.168.0.0-192.168.255.255)のみなので注意しましょう。
※App Serviceのアプリケーション設定で「WEBSITE_VNET_ROUTE_ALL」を「1」に設定することですべてのトラフィックを仮想ネットワークに向けることができます。恐らくリージョンVNet統合を使う際はほぼ確実に使うことになる設定だと思います。

参考 : リージョン VNet 統合
https://docs.microsoft.com/ja-jp/azure/app-service/web-sites-integrate-with-vnet#regional-vnet-integration

プライベートエンドポイントについて

プライベートエンドポイントはAzureのPaaSサービスに対してのアクセスを仮想ネットワーク内のクライアントからのみに制限し、
プライベートエンドポイントからPaaSサービスへの経路にAzureのバックボーンのネットワークを経由させることでパブリックネットワークにさらさず、セキュリティを向上させるサービスです。
App Serviceに対して使用した場合、AppServiceへのアクセスを仮想ネットワーク内のクライアント、
VPNまたはExpressRoute経由でのオンプレからのアクセスのみに制限することができます。

App Serviceにプライベートエンドポイントを設定した場合、パブリックアクセスはすべて強制的に拒否され、
App ServiceのIP制限の機能は一切評価されなくなります。
またApp ServiceのSCMサイトへのアクセスも同様にパブリックアクセスはできなくなるので、
アプリケーションのデプロイの方法や経路を考慮する必要があります。

参考 : Azure Web アプリでプライベート エンドポイントを使用する
https://docs.microsoft.com/ja-jp/azure/app-service/networking/private-endpoint


リージョンVNet統合とプライベートエンドポイントの組み合わせについて

App ServiceにリージョンVNet統合とプライベートエンドポイントを設定することで、
App Serviceの送信と受信の両方の通信を仮想ネットワークに閉じ込めることができ、
セキュリティを高めることができます。

App Serviceを仮想ネットワーク内で利用したい場合、App Service Environmentも選択肢に上がりますが、
App Service EnvironmentはApp Serviceに比べてかなり高額なサービスなので、
リージョンVNet統合とプライベートエンドポイントの組み合わせのほうがかなり安く構成できます。

App Serviceのネットワーク周りの機能とユースケースは以下のリンクでパターン別に紹介されてますので、
選定の際はご参考ください。

参考 : App Service のネットワーク機能 -ユース ケースと機能-
https://docs.microsoft.com/ja-jp/azure/app-service/networking-features#use-cases-and-features

リージョンVNet統合とプライベートエンドポイントの構成例としては下記のようになります。
リージョンVNet統合とプライベートエンドポイントは同じサブネットには設定できないのでご注意ください。

また、App Serviceの受信と送信で2つのルートがありますが、
通信の往路(リクエスト)と復路(レスポンス)で経路が変わるようなことはないので、
非対称ルーティングは発生しません。
オンプレミスのゲートウェイ機器によっては非対称ルーティングに対して許容するように設定を変更したり、
そもそも対応していない場合などありますが、この構成では考慮しなくても問題ないです。

リージョンVNet統合とプライベートエンドポイントの構成例

リージョンVNet統合の設定

App Serviceと仮想ネットワークが既に作られている状態から手順を紹介します。
まずはApp Serviceの[ネットワーク]から[VNet統合]の[構成するにはここをクリック]を押下します。

VNet統合の設定画面に飛ぶので、[VNetの追加]を押下します。

設定画面で対象の仮想ネットワークが所属するサブスクリプション、仮想ネットワーク、サブネットを指定し、[OK]を押下します。これでリージョンVNet統合自体の設定は完了です。

App Serviceからのすべてのトラフィックを仮想ネットワークにルーティングさせたい場合はApp Serviceの[構成]で[新しいアプリケーション設定]を押下し、

名前 : WEBSITES_VNET_ROUTE_ALL、値 : 1の設定を追加し、[OK]を押下し、最後に[保存]を押下します。
これでApp Serviceの送信方向の通信はすべて仮想ネットワークを経由するようになります。

プライベートエンドポイントの設定

まずは設定前にApp Serviceにアクセスしてみます。
リージョンVNet統合は送信方向にのみ影響する設定なので、この時点ではApp Serviceにはパブリックアクセスできます。

再度App Serviceの[ネットワーク]にアクセスし、今回は[プライベートエンドポイント接続]の[プライベートエンドポイント接続の構成]を押下します。

プライベートエンドポイントの設定画面で[追加]を押下します。

プライベートエンドポイントの名前、サブスクリプション、接続する仮想ネットワーク、接続するサブネットを入力し、[プライベートDNSゾーン]との統合で[はい]、[いいえ]のどちらかを選択します。
プライベートエンドポイントを利用するにはプライベートDNSが必要であり、[はい]を選択した場合は自動でプライベートDNSが作成され、必要なレコードが登録されます。特定のプライベートDNSを利用したい場合は[いいえ]を選択し、後から手動で必要なレコードを登録し、プライベートエンドポイントと紐付ける必要があります。
今回は特にこだわりはないので[はい]を選択し、[OK]を押下します。

以上でプライベートエンドポイントの設定は完了なので、再度App Serviceにアクセスしてみると、
今度は403を返すようになります。これでApp Serviceへのパブリックアクセスはすべて拒否されるようになりました。

最後に

以上でApp ServiceにリージョンVNet統合とプライベートエンドポイントを設定し、
仮想ネットワーク内に閉じ込めることができました。
App Service Environmentは高額でデプロイにも時間がかかるので、こちらの構成のほうが手軽で好みですが、
App Service Environmentには最大100インスタンスまでスケールアウトできるといった強みもあるので、
要件に応じて使い分けるのがいいかと思います。