こんにちは、ACS事業部の吉川です。
本記事は エーピーコミュニケーションズ Advent Calendar 2024 の14日目の記事です。
先月開催されたMicrosoft Igniteに合わせ ネットワークセキュリティ境界(Network Security Perimeter) なるサービスのパブリックプレビューが始まりました。
どんなサービスなのか、手を動かしながら確認してみましょう。
概要
サービスの概要を掴むために、まずは公式ドキュメントに目を通すのがよいでしょう。
こちらのドキュメントにある以下の図から、
- 複数のPaaSを束ねてグループ化して
- Internetや他サービスへのInbound/Outboundを制御する
というサービスだというのが見て取れます。
ざっくりと、従来は各サービスの設定にあったアクセス制限のルールをまとめて設定できるもの、と考えてよさそうです。
検証環境
以下のような検証環境を準備してみました。
VNetにサブネットを2つ作り、片方にVMを配置、もう片方にSQL DatabaseのPrivate Endpointを作成した構成です。 SQL Databaseを閉域接続するケースでは一般的な構成でしょう。
以下のコマンドで作成しています。
RG_NAME="rg-sample" LOCATION="japaneast" VNET_NAME="vnet-sample" VM_SNET_NAME="snet-VM" SQL_SNET_NAME="snet-SQL" VM_NAME="sample-vm" SQL_SERVER_NAME="sample-sql-server-hoge" SQL_DB_NAME="sample-sql-db" # リソースグループの作成 az group create -n $RG_NAME -l $LOCATION # ネットワークの作成 az network vnet create -n $VNET_NAME -g $RG_NAME -l $LOCATION \ --address-prefixes 192.168.0.0/16 az network vnet subnet create -n $VM_SNET_NAME \ --vnet-name $VNET_NAME -g $RG_NAME \ --address-prefixes 192.168.0.0/24 az network vnet subnet create -n $SQL_SNET_NAME \ --vnet-name $VNET_NAME -g $RG_NAME \ --address-prefixes 192.168.1.0/24 # VMの作成 az vm create -n $VM_NAME -g $RG_NAME --image Ubuntu2204 \ --vnet-name $VNET_NAME --subnet $VM_SNET_NAME --public-ip-address "pip-sample" \ --nsg "nsg-sample" --nsg-rule SSH # SQL Databaseの作成 az sql server create -n $SQL_SERVER_NAME -g $RG_NAME -u myadminuser -p myAdminpassword123 az sql db create -n $SQL_DB_NAME -g $RG_NAME --server $SQL_SERVER_NAME \ --sample-name AdventureWorksLT --edition GeneralPurpose \ --compute-model Serverless --family Gen5 --capacity 2 # Private EndpointとPrivate DNS Zoneの作成 ID=$(az sql server show -n $SQL_SERVER_NAME -g $RG_NAME --query id -o tsv) az network private-endpoint create --connection-name connection-1 \ -n private-endpoint -g $RG_NAME --private-connection-resource-id $ID \ --vnet-name $VNET_NAME --subnet $SQL_SNET_NAME --group-ids sqlServer az network private-dns zone create \ -n "privatelink.database.windows.net" -g $RG_NAME az network private-dns link vnet create \ -n DNSLink -g $RG_NAME -v $VNET_NAME \ -z "privatelink.database.windows.net" \ --registration-enabled false az network private-endpoint dns-zone-group create \ -n MyZoneGroup -g $RG_NAME \ --endpoint-name private-endpoint \ --private-dns-zone "privatelink.database.windows.net" \ --zone-name sql
このSQL Databaseに対し、ネットワークセキュリティ境界を設定していきます。
ネットワークセキュリティ境界はプレビュー扱いのサービスのため、有効化設定が必要です。
以下のコマンドで有効化します。
# ネットワークセキュリティ境界の有効化 az feature register --name AllowNSPInPublicPreview --namespace Microsoft.Network # 有効化状態の確認。RegisteredになればOK。 az feature show --name AllowNSPInPublicPreview --namespace Microsoft.Network --output table # 有効化を反映するためにMicrosoft.Networkプロバイダーを再登録 az provider register --namespace Microsoft.Network
有効化が完了したら、ネットワークセキュリティ境界のリソースを作成していきます。
NSP_NAME="nsp-sample" PROFILE_NAME="npp-sample" az network perimeter create -n $NSP_NAME -g $RG_NAME az network perimeter profile create \ -n $PROFILE_NAME -g $RG_NAME --perimeter-name $NSP_NAME
上記のコマンドで、nsp-sample
というネットワークセキュリティ境界 リソースと、npp-sample
というポリシー定義が作成されます。
ここまでで環境の準備ができました。
続いて設定項目と挙動を見ていきましょう。
ネットワークセキュリティ境界 の設定
ネットワークセキュリティ境界は、作成したポリシーに対象となるPaaSリソースと受信/送信規則を登録して使用します。
受信・送信それぞれの設定を見ていきましょう。
受信規則の設定
前項で作成したSQL Databaseは、インターネットからのアクセスは許可されておらずPrivate Endpointからのみアクセス可能な状態です。
実際にインターネット越しにアクセスしてみると
Cannot open server 'sample-sql-server-hoge' requested by the login. Client with IP address '###.###.###.###' is not allowed to access the server. To enable access, use the Azure Management Portal or run sp_set_firewall_rule on the master database to create a firewall rule for this IP address or address range. It may take up to five minutes for this change to take effect.
といったエラーが表示されます。
このSQL Databaseをポリシーに追加してみましょう。
ポリシーの設定メニューの 関連するリソース
から、リソースの関連付け
ボタンでリソースを追加します。
リソースを追加すると、最初は Learning
モードとして設定されます。
これは、ネットワークセキュリティ境界の通信規則を実際には適用せず、通信状態のモニタリングのみを行うモードです。WAFにおける検出モードのようなものですね。
このモードを Enforced に変更してみましょう。同画面の アクセスモードの変更
から変更できます。
現状は通信規則を一つも追加していない状態です。この状態でインターネット越しにSQL Databaseへのログインを試みると、以下のようにエラーメッセージが変わっていることが確認できます。
Login failed because the network security perimeter denied inbound access.
なお、この状態でも Private Endpoint経由の通信は問題なく行えます。ネットワークセキュリティ境界が制御するのは、パブリックIP経由のアクセスのみのようです。
では、受信アクセス規則を許可してみましょう。
受信アクセス規則
の画面から自宅のパブリックIPを登録してみます。
登録後、正常にログインできるようになりました。
この状態でSQL Databaseのネットワーク設定を見ても、ファイアウォール設定に変更がないことが見て取れます。
ネットワークセキュリティ境界を設定すると、PaaS側のファイアウォール設定に入っている設定に関係なく、ネットワークセキュリティ境界のポリシーの設定内容に従って制御されるようです。 ネットワークセキュリティ境界への移行を検討する際には注意が必要なポイントですね。
送信規則の設定
送信側の設定についても確認してみましょう。
SQL Databaseには外部のエンドポイントを参照する機能 があるので、これを利用して確認します。 Azureサービスのドメインしか許可されていないので、この辺りを参考にApp Serviceで適当にサンプルサイトを準備して確認します。
送信規則を設定する前に確認すると、以下のようにネットワークセキュリティ境界にてブロックされている旨が表示されます。
送信規則はFQDNでアクセス許可する先を指定します。送信アクセス規則の追加
メニューからFQDNを追加します。
また、ネットワークセキュリティ境界での送信規則制御にはマネージドIDの有効化が必須なようです。SQL Database側でシステム割り当てマネージドIDを有効化しておきましょう。
規則の追加・マネージドIDの有効化の双方が完了した後に再度確認すると、正常にAPIエンドポイントに接続できたことが見て取れます。
おわりに
PaaSのインターネットアクセスを制御できる新サービスの紹介でした。
今回は単一のリソースのみを登録して確認しましたが、複数のPaaSをまとめて設定できるのは有用なシーンが多そうです。
一方、既存の各PaaSのネットワーク設定と競合する部分なので、実際の運用面では設定の確認で混乱しそうな予感もあります。そのあたりが今後クリアされることに期待しつつ、GAを待ちたいと思います。