APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【Azure】App ServiceのVNet統合とプライベートリンクを利用した通信閉域化

f:id:tarutaru_pyorne:20210312145923p:plain# はじめに

Azureコンテナソリューショングループ)土居です。
我々の部署ではAzureにフォーカスをあてクラウドネイティブ関連の技術を追求しお客様をサポートしていきます。 その一環としてAzureに関して日々ブログで技術紹介していきますので宜しくお願いします。

今回はApp Serviceの連載第二弾目となります。
AzureのPaaS代表格であるApp ServiceとSQL Databaseの組み合わせでよく使われるVNet統合とプライベートリンクを利用した構成を紹介していきます。

PaaSのデフォルト設定は危険

PaaSはインフラを一から管理をする必要もなくポータル画面からポチポチッと数クリックするだけでアプリケーション環境が構築できるため非常に便利ですが、利用にあたっては注意が必要です。

PaaSはインターネットアクセスを前提としているため、普通に利用すると周辺サービスとの連携の際もインターネットを利用します。オンプレでDBサーバは通常プライベートネットワークに配置され、WEBサーバまたはAPPサーバからのアクセスは全てプライベートネットワークを通って通信する事が一般的でした。そのため、従来のDBサーバへの接続通信は暗号化されていないケースも多々存在します。 このようなアプリケーションを上記のPaaS環境にリフト&シフトした場合どうなるでしょう? 暗号化されていないDBへの接続通信がインターネット上を流れる事になりセキュリティ上好ましくありません。

また、DBサーバへの管理アクセスもインターネット上に公開されているというのも攻撃者にとって格好の的となります。万が一、管理者アカウントとパスワード等が流出でもしてしまったら、悪徳者へデータ全てへのアクセスを許してしまうことになり大変危険です。

f:id:tarutaru_pyorne:20210312112149p:plain
PaaSデフォルト設定時のアクセス経路

プライベートエンドポイント

上記のような問題を解決するため、AzureのPaaSではプライベートエンドポイント(プライベートリンク)をサポートするサービスが多く存在します。 プライベートエンドポイントではPaaSのサービスをユーザーのVNet環境に紐付けて、Azure上のプライベートネットワーク経由でサービスを利用できます。

プライベートエンドポイントを作成するためには、VNetにプライベートエンドポイント用のサブネットを作成する必要があります。

今回のケースでは、SQL Databaseのプライベートエンドポイントを作成していきます。 プライベートエンドポイントを作成してもまだインターネットからのアクセスは有効なままになっているので、必ずインターネットからデータベースにアクセスできないようにアクセス制御設定も行うようにしましょう。

f:id:tarutaru_pyorne:20210312112233p:plain
プライベートエンドポイントを利用したSQL Databaseのアクセス経路

VNet統合

VNet統合は、App ServiceをユーザーのVNet環境に紐付けてAzureプライベートネットワーク上のサービスと連携する場合に利用します。 (VMにセカンダリNICを割り当てるイメージです。そのため、Webアクセスは通常通りパブリックからアクセス可能です。

VNet統合の作成にも、専用のサブネットが必要になります。先程プライベートエンドポイントを作成したVNet上に新しくサブネットを払出して接続します。

これで、以下の図のようにApp ServiceとSQL Databaseのそれぞれが同じVNet上に接続され、プライベートネットワークを経由したデータ通信経路が確保されました。

f:id:tarutaru_pyorne:20210312112808p:plain
App ServiceのVNet統合を利用したアクセス経路

DNSによる名前解決

App ServiceからSQL Databaseへの接続にはFQDNを利用します。 そのため、VNet統合とプライベートエンドポイントを使ってセキュアなアクセス経路が確保できてもアプリ側でDB接続先の名前を変えないとパブリック経由アクセスのままになります。 プライベートエンドポイントを作成するとVNet内のプライベートDNSに対してレコードが作成されるので、App Serviceの設定からDB接続情報を変更します。

f:id:tarutaru_pyorne:20210312112624p:plain
App ServiceのVNet統合を利用したアクセス経路

実際の設定手順

MicrosoftドキュメントのチュートリアルにあるApp Service(ASP.NET)とSQL Databaseのサンプルを利用します。

docs.microsoft.com

チュートリアルに従ってApp ServiceとSQL Databaseを作成しアプリケーションをデプロイするところまで行います。
※App ServiceでVNetが利用できるのはStandard以上になるため、App ServiceプランはS1を選択します。

デプロイ完了後、公開URLにアクセスして動作を確認します。

f:id:tarutaru_pyorne:20210312132752p:plain
Azureにデプロイしたサンプルアプリケーション

問題なさそうですね。 デプロイ後のリソースグループはこんな感じになります。

f:id:tarutaru_pyorne:20210312132840p:plain
デプロイ後のリソースグループの中

App Serviceの【設定】-【構成】-【接続文字列】からSQL DatabaseへのアクセスFQDNを確認します。

f:id:tarutaru_pyorne:20210312133137p:plain
デプロイ直後のSQL Database接続のFQDN

試しにApp ServiceのKuduコンソールからnslookupを叩いてみます。

f:id:tarutaru_pyorne:20210312133451p:plain
App Serviceからの名前解決結果

当然のようにパブリックIPが返ってきますので、インターネット経由でSQL Databaseにアクセスしていることになります。

次に、SQL Databaseの【セキュリティ】-【ファイアーウォールと仮想ネットワーク】を開くと、【パブリックネットワークアクセスの拒否】がいいえになっていることが分かります。 【Azureサービスおよびリソースにこのサーバへのアクセスを許可する】が有効になっているのでAzureリソースからアクセスは可能ですが、好ましい状態であるとは言えませんね。

f:id:tarutaru_pyorne:20210312133947p:plain
SQL Databaseのファイアウォール設定

次に、VNet統合とプライベートエンドポイントを関連付けるVietual Networkを作成します。 今回は事前にDBサブネットとAPPサブネットも作成しておきました。

f:id:tarutaru_pyorne:20210312140627p:plain
Virtual Networkの作成

いよいよ、SQL Databaseのプライベートエンドポイントの作成に入っていきます。 SQL Databaseの【セキュリティ】-【プライベートエンドポイント接続】を開いて新規作成します。 プライベートエンドポイントを作成する場合は、接続するリンクの種類を選択する必要があります。 今回はSQL DatabaseなのでMicrosoft.Sql/serversを選択します。

f:id:tarutaru_pyorne:20210312140843p:plain
プライベートエンドポイント接続作成画面
f:id:tarutaru_pyorne:20210312140924p:plain
プライベートエンドポイントの設定値

プライベートエンドポイントを作成すると、リソースグループの中身が一気に増えました。 プライベートエンドポイントリソースとネットワークインターフェイス、作成時に統合したプライベートDNSゾーンが追加されています。

f:id:tarutaru_pyorne:20210312141308p:plain
プライベートエンドポイント作成後のリソースグループ

プライベートDNSゾーンを覗くとSQL DatabaseのAレコードがDBサブネットのIPアドレスを割当てて作成されています。

このAレコードの詳細を選択し、FQDNをコピーしておきます。

f:id:tarutaru_pyorne:20210312141643p:plain
プライベートエンドポイントのFQDN

SQL Databaseのパブリックアクセスを拒否します。これにより、アプリケーションでDBエラーが発生することが確認できます。

f:id:tarutaru_pyorne:20210312141823p:plain
SQL Databaseのパブリックアクセス拒否

f:id:tarutaru_pyorne:20210312141857p:plain
サンプルアプリケーションのDB接続エラー画面

App ServiceでVNet接続を行います。 【設定】-【ネットワーク】-【VNet統合】を選択して、APPサブネットにApp Serviceを紐付けます。

f:id:tarutaru_pyorne:20210312142021p:plain
App Serviceのネットワーク設定画面

f:id:tarutaru_pyorne:20210312142119p:plain
App ServiceのVNet設定画面

VNet接続が完了したら、最後に上記でコピーしておいたFQDNに接続文字列の変更を行います。

f:id:tarutaru_pyorne:20210312142343p:plain
App ServiceのSQL Database文字列の変更画面

サンプルアプリケーションの再起動が行われ、無事SQL Databaseに接続されました。

f:id:tarutaru_pyorne:20210312132752p:plain
VNet統合とプライベートエンドポイントを使用した場合のサンプルアプリケーション画面

App ServiceのKuduコンソールからnslookupを叩いてみても、ちゃんとプライベートIPアドレスが返ってきていることが分かります。

f:id:tarutaru_pyorne:20210312142536p:plain
App ServiceからのDNS名前解決結果

終わりに

App ServiceとSQL Databaseの組み合わせでVNet統合とプライベートリンクを利用した通信閉域化について紹介しました。 これ以外にもApp Service Environmentを利用した閉域空間での利用方法などもありますが高価格になりやすいです。 今回の手法だとプライベートリンクとAzure DNSのわずかな費用のみで似たような閉域構成を実現できるので是非ご検討下さい。

本記事の記載にあたり、以下資料を参考にしています。 前回に引き続き日本マイクロソフト社様の動画は非常に分かりやすく解説されているため、お時間ある方は是非一度見て頂いて損はないかと思います。

Microsoft Azure PaaS 構成方法 (Web Apps & SQL Database) [構築の要点] | 日本マイクロソフト - YouTube

docs.microsoft.com

docs.microsoft.com