Microsoft Entra Private Access と Azure Private Endpoint の組合せが最高

2024/07/13に公開
2

TL;DR

はじめに

Microsoft Entra Private Access (MEPA) は SSE の出口である Microsoft Entra Private Access Connector (MEPA-C) の場所によって大きく 2 つあるかと思います。
そのうち、今回は Azure に MEPA-C を置くケースの場合、Azure Private Endpoint との組み合わせるとめちゃいいのではないか、と発想したので試してみました。

実現できることのイメージとしては以下のような感じです。

  • 自分の PC で Visual Studio を起動してアプリを開発し、Cosmos DB が必要な際に、Azure Cosmos DB Emulator ではなくて、Azure Private Endpoint を生やしてロックダウンした本物の Azure Cosmos DB を使う
  • 自分の PC で Visual Studio Code を起動して Jupyter Notebook を使う際に、Azure Private Endpoint を生やしてロックダウンした Azure OpenAI Service を使う
  • 自分の PC で Azure portal から Azure Machine Learning Studio を開いて、Azure Private Endpoint を生やしてロックダウンした Azure Machine Learning を使う

どうですか、めちゃいいですよね。

アーキテクチャ

細かいところは後述しますが、ざっくりとしたアーキテクチャは以下のような感じです。
MEPA に 2 種類のトラフィックが乗り、まずは DNS の名前解決を MEPA 経由 Azure DNS Private Resolver (ADPR) で行い、その応答に書かれた IP アドレス向けのトラフィックもまた MEPA を経由します。

MEPA - Azure Private Endpoint - architecture
MEPA - Azure Private Endpoint - architecture

Azure 側の準備

ということで、接続先の VNet には以下のようなものを置いておきます。

  • VNet
    • もろもろのリソースが入るやつ (10.0.0.0/16)
    • 2 つのサブネットを作成する
      • Azure VM と Azure Private Endpoint を配置する default サブネット
      • ADPR の inbound endpoint 用の adpr-inbound サブネット
  • MEPA-C 用の Azure VM
    • 適当な Windows Server の Azure VM を作成し、MEPA-C をインストールしておきます (10.0.0.4/24、default サブネット)
  • Storage Account
    • blob の中に適当なコンテナーを作っておく
    • Public network access は無効化しておきます
      Storage Account - public network access disabled
      Storage Account - public network access disabled
  • Storage Account の blob を対象とした Azure Private Endpoint (10.0.0.5/24、default サブネット)
    Storage Account - Azure Private Endpoint created
    Storage Account - Azure Private Endpoint created
    • 「privatelink.blob.core.windows.net」の Private DNS zone も標準の手順どおり作っておきます
  • Azure DNS Private Resolver
    • blob 宛ての名前解決を 168.63.129.16 で名前解決するため、ADPR を作成し、上記 VNet に inbound endpoint を作成しておきます (10.10.0.4/24、adpr-inbound サブネット)

Global Secure Access 側の準備

Entra admin center を開き、MEPA 側の設定をしておきます。
Windows Server に MEPA-C をインストールし、Microsoft Entra ID の認証が済んでいると、新しい MEPA-C が「Default」コネクター グループの中に表示されているはずです。
新しいコネクター グループを作り、新しい MEPA-C をそちらに移動させておきます。

MEPA - connector configuration
MEPA - connector configuration

ネットワークアクセスプロファイルはこのような感じです。

  • VNet 全体 (10.0.0.0/16) の tcp/443 を向ける
  • ADPR の inbound endpoint (10.10.0.4/24) の udp/53 と tcp/53 を向ける

MEPA - network access properties
MEPA - network access properties

また、ユーザーのアサインも忘れずに設定しておきます。

MEPA - assign users
MEPA - assign users

PC 側の準備

クライアントとなる PC には Global Secure Access Client (GSAC) をインストールしておきます。
現時点では PC が Microsoft Entra Joined (MEJ) である必要があるため、忘れずに実行しておきます。
クライアントが起動したら、権限のある Microsoft Entra ID アカウントでログインしておきます。
問題が無ければ、GSAC のクライアントが緑色になります。

また、一部のドメイン宛ての通信を ADPR の inbound endpoint に向け、それを MEPA に吸い込んでもらうための追加設定が必要です。
Windows Client OS で条件付きフォワーダー的なことをやってみる を参考に、管理者として実行した PowerShell で Add-DnsClientNrptRule を実行します。

Add-DnsClientNrptRule -Namespace ".blob.core.windows.net" -NameServers 10.0.10.4

うまくいったかは Get-DnsClientNrptRule で確認できます。

PS C:\Users\KazuyukiSakemi(PDSan> Get-DnsClientNrptRule

Name                             : {xxxxxxxx-xxxx-xxxx-xxxx-7667A381FD7C}
Version                          : 2
Namespace                        : {.blob.core.windows.net}
IPsecCARestriction               :
DirectAccessDnsServers           :
DirectAccessEnabled              : False
DirectAccessProxyType            :
DirectAccessProxyName            :
DirectAccessQueryIPsecEncryption :
DirectAccessQueryIPsecRequired   :
NameServers                      : 10.0.10.4
DnsSecEnabled                    : False
DnsSecQueryIPsecEncryption       :
DnsSecQueryIPsecRequired         :
DnsSecValidationRequired         :
NameEncoding                     : Disable
DisplayName                      :
Comment                          :

動作確認

Azure portal を使って簡単に動作を確認します。
Azure のコントロール プレーンとデータ プレーンのはなし にも書いたような話ですが、Azure portal の データ ストレージ > コンテナー などの部分はデータ プレーンのアクセスとなり、Azure Private Endpoint の影響を受けます。

Microsoft Entra Private Access を使っていない状態でのアクセス

まず、MEPA を使っていない場合には繋がらない、つまり純粋にインターネット経由では接続できないことを確認します。
タスクトレイにある GSAC を右クリックし、適当に停止しておきます。

Public network access が正しく無効化された状態で Azure portal でアクセスすると、その IP アドレスからはアクセスできない、という旨のエラー画面が出ます。
エラーが出なければ、再度設定を見直してください。

Storage Account - public access denied
Storage Account - public access denied

Microsoft Entra Private Access を使っている状態でのアクセス

次に、GSAC を再度起動し、MEPA を利用できる状態にして再度アクセスしてみます。

GSAC の Forwarding profile は以下のようになっています。
Entra admin center で設定したとおりの内容がここにも表示されています。

GSA Client - forwarding profile
GSA Client - forwarding profile

とりあえず、先ほどエラーが出た、コンテナーの中身を一覧する画面まではアクセスできることが確認できます。

Storage Account - list blobs in container
Storage Account - list blob in container

さらに、ファイルをアップロードが成功することも確認します。

Storage Account - file upload preparing
Storage Account - file upload preparing

Storage Account - file uploaded
Storage Account - file uploaded

なお、隣でブラウザーの DevTools を開き、ネットワークのタブを開くと、グローバル IP アドレス宛ての通信が並ぶ中に一部プライベート IP アドレス宛ての通信があり、これが Storage Account の Azure Private Endpoint 宛ての、データ プレーンのトラフィックであることが確認できます。

DevTools - look IP address in network log
DevTools - look IP address in network log

ほかにも、ping を使って簡単な動作が確認できます。
Azure Private Endpoint を名前解決観点で詳細に説明してみた にも書いた内容と関連しますが、この動作確認は nslookup ではできません。

PS C:\Users\KazuyukiSakemi(PDSan> ping xxxxxxxx.blob.core.windows.net

Pinging xxxxxxxx.privatelink.blob.core.windows.net [10.0.0.5] with 32 bytes of data:
右の方見て >>>>>>>>                                  ^^^^^^^^ ここを見る
Control-C

事後の片付け

検証が完了した後、Add-DnsClientNrptRule で追加した内容を Remove-DnsClientNrptRule を実行して削除しておきます。
削除を忘れると、後日なんでうまくいかないのかのトラブルシュートに時間がかかることが容易に想定されますので。。

PS C:\Users\KazuyukiSakemi(PDSan> Get-DnsClientNrptRule | Where-Object { $_.NameSpace -eq ".blob.core.windows.net" } | Remove-DnsClientNrptRule

Confirm
Removing NRPT rule for namespace .blob.core.windows.net with
DAEnable: Disabled,
DnsSecValidationRequired: Disabled,
NameEncoding: Disable
NameServers: 10.0.10.4
Do you want to continue?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): y

まとめ

ということで、Azure Private Endpoint を VNet の外から使う方法として、MEPA を利用してはどうか、という記事でした。
今時 Azure Private Endpoint はほとんどの Azure ユーザーが利用しているのではと思いますが、それを利用するためには VNet の中に入る必要がありました。
それは例えば Azure Virtual Desktop (AVD) であったり、ExpressRoute でオンプレミス ネットワークとの閉域接続が定番のパターンでした。
ですが、先日 GA した MEPA を使うことで、手元にある PC のリソースと Azure Private Endpoint のベストな組合せが実現できます。

参考

  • The Microsoft Entra Suite and unified security operations platform are now generally available

    GSA が GA した!!!

https://www.microsoft.com/en-us/security/blog/2024/07/11/simplified-zero-trust-security-with-the-microsoft-entra-suite-and-unified-security-operations-platform-now-generally-available/

  • Windows Client OS で条件付きフォワーダー的なことをやってみる

https://zenn.dev/skmkzyk/articles/conditional-forwarder-on-client

  • Add-DnsClientNrptRule

    自分のマシンだけ、特定のドメイン宛ての DNS サーバを別に設定できる

https://learn.microsoft.com/powershell/module/dnsclient/add-dnsclientnrptrule?wt.mc_id=MVP_391314

  • Azure のコントロール プレーンとデータ プレーンのはなし

https://zenn.dev/skmkzyk/articles/portal-control-data-plane

  • Azure Private Endpoint を名前解決観点で詳細に説明してみた

https://zenn.dev/skmkzyk/articles/private-endpoint-in-detail

  • Microsoft Entra Suite が GA されました

https://zenn.dev/shmatsuy/articles/e79fc90a254505

  • Microsoft Entra の Global Secure Access を使ってみる (Private Access 編)

https://zenn.dev/sugar3kg/articles/645e632231735f


Update log

  • tag の追加とか - 2024/07/14
  • typo の修正とか - 2024/07/15

Discussion

k.satok.sato

アプリケーション セグメントの登録時に FQDN を指定すると、名前解決までコネクタが代行してくれますので、DNS 周りの構成や設定は不要です、ぜひお試しください~ (ストレージ アカウントで確認しましたが、若干動作が不安定です...)

skmkzykskmkzyk

いやー、そうなんですよね、本来は今まだ private preview っぽい private DNS 機能がいい感じにしてくれると信じてます!w
FQDN で書くと PE 増えた時になぁ、、という感じなので wildcard 的に書きたいので、、