#011: P2S VPN＋EntraID認証でVNetに接続

※本記事は、個人の意見および個人的活動を記したものであり、会社を代表するものではありません

まずはAzure Portalから構築する手順。次回以降でBicepに組み込む。

# 1. Bastion以外でVNet閉域網に外部から安全に接続する方法
私が知っているVNet閉域網に安全に接続してAzure resourceを管理する方法としては３つあり、いづれも閉域網に構築したVMにアクセスして、そこからAzure Portalにアクセスするというもの。

1. AAD JoinedしたWindows Desktop OSからEntraID認証でRDPでVMにアクセス
2. アクセス元IPを制限したSubnet内のBastionから、KeyVaultでOSローカルアカウントのパスワード管理されたVMにアクセス
3. P2S VPNにEntraID認証で接続されたPCからRDPでVMにアクセス

一度VMに入ったら、Azure FirewallでVMからAzure Portalへのアクセスを許可するルールを定義すれば、VMから各リソースにアクセスできるようになる。もちろん、各リソースはPrivate EndpointでVNetに接続されており、VNetからのアクセスのみ許可されている状態にする。

それぞれ、セキュリティ的にもっと考慮すべき箇所があると思うが、（例えばRDPってファイル転送ができてしまうよねとか、VPN接続したインターネットに接続できるクライアントってどうよとか）細かい話はどっかで確認するとして、今回はBastion以外でVNetに接続できる方法としてEntraID認証のP2S VPNを構成してみようと思う。

# 2. 構築時のパラメータの確認

以下、参考にしたMS公式ドキュメント。

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/point-to-site-about

## 2-1. VPN が対応しているプロトコル

- Open VPN プロトコル
- SSTPプロトコル
- IKEv2 VPN

    今回はWindows, MacOS, Linux で利用できる **Open VPN**を使って実装してみる。

## 2-2. クライアント認証方式

- Azure 証明書
- Microsoft Entra ID
- RADIUS と Active Directory ドメインサーバー

今回は **Microsoft Entra ID** を使ってみる。Microsoft Entra ID 認証方式は Open VPN プロトコルに対応している。

条件として、接続元 PC に Azure VPN クライアントのインストールが必須。

## 2-3. アクティブ/アクティブゲートウェイ

2つのIPを持ち、１つのクライアント側VPNに２つのAzure側VPNゲートウェイが接続されることで計画メンテナンスもしくは計画外の障害時の中断を回避できる。

S2S VPN の場合、クライアント側VPNがアクティブ/アクティブゲートウェイに対応している必要があり、アクティブ/アクティブ接続の構成設定を実施しなければならない。

ちなみに、アクティブ/スタンバイにした場合、障害やメンテナンス時には以下のようになる。

- S2S VPN
    - 計画メンテナンスの時、短い切断が発生するがすぐに自動復旧する。
    - 計画外中断時、自動復旧するが切断時間は長くなる。
- P2S VPN
    - 自動復旧することはなく、再接続が必要。

追加料金は、冗長構成用のIPのみで VPN の追加費用はかからないため、**アクティブ/アクティブモードでいく。**

## 2-4. GatewaySubnetの構成

現状のVNetの構成を少し変更し、追加するsubnetのIP rangeを構成する。

- VNetのIP range: 10.0.0.0/16 (1.1.0.0)
- GatewaySubnet (min /27)
    - IP range: 10.0.0.32/27 (x.x.x.001xxxxx)
- AzureBastionSubnet (min /26)
    - IP range:10.0.0.64/26 (x.x.x.01xxxxxx)　→ これに変更
- AdminSubnet (min /29)
    - IP range:10.0.0.0/29 (x.x.x.00000xxx)　→ これに変更

## 2-5. Sku

**Generation1 の VpnGw1でいく。**

- ゾーン冗長なし
- サポートVM数450
- スループット650mbps
- OpenVPNサポート

## 2-6. 考慮しないが知っておきたいこと

### 2-6-1. VPN GatewayにおけるBGPの考慮ポイント

BGPはS2S VPNにおいて、オンプレVPNとAzure VPNの間、もしくはオンプレVPNとExpressRouteの間でルート情報を動的に交換するためのもの。

P2S VPNでは、BGPが不要なので設定は不要。

### 2-6-2. クライアント証明書を使った認証時の証明書の保存先

「Authentication Information」という項目でPreviewの項目が表示されている。

2024/9/2時点ではまだMSの公式ドキュメントでは見つけられないが、おそらくクライアントで発行した証明書(.cer)をKeyVaultに保存し、参照できるようにするというオプションだと思う。

この機能を利用するためにはVPNにManaged IDを割り当てる必要があるそうな。

今回はEntra ID認証を使いたいので、この機能は不要。

これで大体のパラメータは特定できたかな。

# 3. Azure Portal で Azure VPN を構築

上記で定義したプロパティ値でVPNを構築する。

## 3-1. VPN Gatewayの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/836f276f-cc88-2c84-72cc-3dd95ae563d5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/45b1855c-b0d4-48f7-cb06-2577f6d8c8f0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/8a72e2c6-37cd-0294-0748-eda9d308da59.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/3a606e9e-642c-2c7f-59f5-1ba47e7c2b20.png)

VPNの他、IPアドレスが２つ、「GatewaySubnet」という名前のSubnetが作成された。

## 3-2. Entra ID Authenticationを設定

https://learn.microsoft.com/en-us/azure/vpn-gateway/point-to-site-about#microsoft-entra-id-authentication

### 3-2-1. Entra 認証で知っておきたいこと

- Open VPN プロトコルのみサポート
- 最新のVPN Clientでは、VPN Clientのアプリ登録やオーディエンスの値（Audience value）の登録は自動的に行われる（それまでは管理者権限ユーザーによる手動登録が必要だったようだ）
- この方式を「Microsoft-registered Azure VPN Client App ID」と呼ぶ
- Linuxの VPN Client はこの方式のみ対応
- オーディエンスの値は固定されており、Azure Publicの場合は「c632b3df-fb67-4d84-bdcf-b95ad541b5c8」とのこと

### 3-2-2. Entra 認証を利用するための手順

- P2S GatewayにてMicrosoft Entra ID認証を有効化
- クライアントに割り当てるIPアドレスレンジを登録
- VPN clinet 設定ファイルの生成とダウンロード
- VPN Clientのダウンロード、インストール、設定
- 接続確認

次はこれ。

https://learn.microsoft.com/en-us/azure/vpn-gateway/point-to-site-entra-gateway

以下は後で読んでみる。
P2S VPNに接続できるユーザーやグループを制限する方法かな。

https://learn.microsoft.com/en-us/azure/vpn-gateway/point-to-site-entra-users-access

## 3-3. VPN Gateway を P2S 用に設定

作成した VPN Gateway にP2S設定を追加。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/c3153f2c-2096-e386-7844-2577bf3ee65d.png)

### 3-3-1. 設定方針

- Address pool : 接続元のIPレンジと被らないIPを指定するらしい。自分のIPが192.168.1.xだったので、それとは被らない192.168.10.x/24で指定
- Tunnel Type : 「Open VPN (SSL)」一択
- Authentication Type : 「Azure Active Directory」一択（Entra IDかと思いきや、ここはまだAADなんだ）
- Public IP Address : 「RagSystem-P2SVpnIpEntryPoint-dev」
これは何用なのか理解できず、ChatGPTくんに聞いてみたところ、Active-Active modeで構成されたVPN Cilentの場合、Public IPを２つ持っているのだが、それをうまく負荷分散したり高可用性を維持するために必要なんだとか。Client からの接続ポイントになるとのことなので、そのようなネーミングにしてみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/1613b21d-2cd9-02f8-6a67-450aa5a01a20.png)

- Tenant : 固定文字列＋EntraのテナントID「https://login.microsoftonline.com/tenantID/」
- Audience : 固定文字列「c632b3df-fb67-4d84-bdcf-b95ad541b5c8」（Azure Publicの場合）
- Issuer : 固定文字列＋EntraのテナントID「https://sts.windows.net/tenantID/」

ここに「Grant administrator consent for Azure VPN Client application」というリンクがあるが、これは手動設定した場合に必要となるリンクで、今回は自動登録モードを利用するので不要。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/5b573218-067e-b495-99a3-b78b0762437f.png)

ページ上部の「Save」で設定内容が登録されるが、登録処理が完了するまで20分ぐらい時間がかかる。

### 3-3-2. VPN Clientの設定ファイルのダウンロード

一度ページを再読み込みすると、ページトップの「Download VPN Client」が有効になるので、ダウンロード。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/ad20ff40-c4d1-e214-f11b-076f4a59a1bc.png)


zipファイルがダウンロードされる。展開すると「AzureVPN」というフォルダーに「azurevpnconfig.xml」というファイルがあるが、これが設定ファイルとのこと。

このファイルを、VPN接続するユーザーに配布すれば、あとはEntra IDを持っているユーザーであればアクセスできるようになるとのこと。

# 4. VPN Clinetを設定し接続する

https://learn.microsoft.com/en-us/azure/vpn-gateway/point-to-site-entra-vpn-client-mac

## 4-1. 接続手順

- Azure VPN Client for macOS をインストール
- プロファイル(xml)をインポート
- 接続情報を作成しAzureに接続

## 4-2. Azure VPN Clientのインストール

Apple StoreでAzure VPN Clientをダウンロード。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/ec975200-317e-23a3-5a56-dff7158b49c6.png)


ダウンロードしてインストールしたら起動。

## 4-3. プロファイルをインポート

Azure VPN Clientを起動したら、「インポート」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/110135f3-ea04-2012-ffef-d889b10abd9f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/8c1767d5-c41c-700f-2168-96f50a5bc642.png)

サーバー検証のCertification Informationに「DigiCert Global Root G2」が指定されていることを確認し、保存。

::: note
Azure VPN Clientの画面には、実際には「Certificate Information」という項目名は表示されていないが、手順ではそのように記載されている。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/d09c2978-87fe-f5a4-8382-ca467aca4092.png)

きた。接続！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/91bb2486-6078-d0d7-81b1-afc0f5c5d121.png)

いつものAzureログイン画面が表示されるので、ログインすると以下のメッセージが表示されるので、許可する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/1d7ecc06-126a-6976-dcea-73d8d4274240.png)

きたー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/19eb3a65-853b-9bd0-95a8-23bf1ddbe3f7.png)

一度認証すると、次回以降は認証が聞かれなくなったが、これは認証時に発行されたRefresh Tokenが効いているからだと思われるので、多分３ヶ月ぐらい放置したあとで再アクセスすると再認証されるのかも。