WVD用にAzure Firewallを設定し、インターネットアクセスを制御する


Windows Virtual Desktop (WVD)のセッションホストから、許可されたサービスにのみ接続させる、またネットワークレベルで許可/拒否されたログを取る方法です。
下記のようなシンプルな構成で進めます。赤囲みしたコンポーネント以外のWVD環境はあるものとして進めます。(つまり、既存のWVD環境に後付けできます)

要件

  • ホストプール内のセッションホスト(仮想デスクトップ)からのインターネットアクセスを制御したい
  • 既定ではすべてのアクセスを禁止したい
  • 許可されたサービスにのみ接続させたい
  • ファイアウォールに来た通信は許可/拒否ともにログを取っておく

Azure Firewallの設定

ルールの設定

Windows Virtual Desktop へのホスト プールの送信アクセス」に従って設定します。

アプリケーションルール

上のドキュメントに加え、以下の4つを追加します。

  • FQDNタグ

    • WindowsDiagnostics
    • WindowsUpdate
  • ターゲットのFQDN

    • *xt.queue.core.windows.netへのhttps
    • *.ingest.monitor.core.windows.netへのhttps

アプリケーションルールは最終的には下記のようになります。

ネットワークルール

KMSのルールを追加します。
ネットワークルールは最終的には下記のようになります。

DNSは今回Firewallを通らずに、ルーティングテーブルで直送するため、ここでは記述していません。DNSがFirewallを通る環境では記述する必要があります。

参考

ログの設定

ルーティングテーブルの設定

ルートの作成

AD(DNS)など自分の管理下にあるサービスへは直接ルーティングし、それ以外はすべてAzure Firewall (仮想アプライアンスという扱いになります)にルーティングする設定を行います。

  • 環境の例
名前 ルーティング先
default Azure Firewallへのデフォルトルート
mgmt AD DC (DNS) があるVNet

サブネットへの割り当て

ホストプールのあるサブネットに関連付けます。ホストプール以外のサブネットには関連付けません。
下記の例はhostという名前がついたサブネットがホストプールのあるサブネットになっています。NSGがあってもかまいません。

動作確認

セッションホストの再起動

ルーティングテーブルを設定するため、セッションホストを再起動します。

WVDログイン

WVDのセッションホストにログインし、Edgeなどブラウザでどこかにアクセスして、つながらないことを確認します。

ログの確認

拒否したログを確認してみます。

AzureDiagnostics
| where Category == "AzureFirewallApplicationRule"
| search "Deny"
| parse msg_s with Protocol " request from " SourceIP ":" SourcePort:int " to " FQDN ":" *
| project TimeGenerated,Protocol,FQDN

下記のような表示がされると思います。(環境によって違います)

ここまでで、インターネットに出られない環境ができました。

Azure Monitorをファイアウォールで通す (オプション)

Azure Monitor for WVDを利用している場合は、セッションホストのエージェントからログをLog Analyticsのワークスペースに書き出せるようにする必要があります。ログは、ネットワーク通信で行われ、ファイアウォールの要件が定義されています。
これに従い、Azure Firewallのアプリケーションルールを定義します。

Office 365をファイアウォールで通す

Office 365 URL および IP アドレス範囲が公開されていますので、これに従ってルールを設定します。
Microsoft 365 Common および Office Onlineはすべての基礎になるものなので、これを設定し、必要なアプリケーションを足していきます。
例えばTeamsの場合は、このようにしてもよいでしょう。

アプリケーションサイトを通す

例えばGoogleを通す場合は下記のようにします。(実際には、関連サイトなどを登録する必要があります)

留意点

  • 実環境で必要なサービスへの許可ルール設定
    ここではシンプルな構成で解説しましたので、実際の環境では足らないこともあると思います。例えばWVDのベース機能で見ても、FSLogixのプロファイル置き場に対して許可ルールを設定しないといけないことがあると思います。
    事前にわかっていることは初めから設定できますが、それ以外はAzure FirewallでDenyしたパケットのログを見ながら通していくとよいでしょう。

  • RDP Shortpathが使えない (今のところ)
    RDP Shortpath の接続シーケンス」や「Azure VM の外部接続 (SNAT) オプション まとめ」を合わせて考えると、下記のようになってつながらないものと思われます。

    1. セッションホストにより、プライベートおよびパブリックの IPv4 と IPv6 のアドレスの一覧をペイロードに載せてクライアントに送信 (アドレスは変換されない)
    2. クライアントでは、バックグラウンド スレッドが開始され、提供されたホストの IP アドレスの 1 つに対して、UDP ベースの並列トランスポートを直接確立しようと試行 (クライアント -> ホスト)
    3. セッションホストではクライアントからのUDPパケットを受領
    4. セッションホストからクライアントに対してUDPパケットを送信
    5. ルーティングテーブルに従ってAzure Firewallにルーティング
    6. Azure FirewallでSNATがかかり、送信元アドレスが変更される
    7. クライアント(もしくは中間のNATルーター)では未知のアドレスからのUDP 3390が届くので破棄

参考