Point to Site VPN で Azure AD 認証をサポート...をやってみた

Azure 仮想ネットワークの Point to Site VPN 接続 (OpenVPN) でAzure AD認証がサポートされたとアナウンスがありました。

#アップデートを確認
[参考：Native Azure Active Directory authentication support in point-to-site VPN](https://azure.microsoft.com/en-us/updates/aad-support-in-vpn/?WT.mc_id=AZ-MVP-5003113)

上記のアップデート情報には、以下のように記載されています。(機械翻訳)

> OpenVPN プロトコルの**ネイティブ Azure Active Directory (Azure AD)** 認証サポート、および Windows 用 [Azure VPN クライアント](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/aad.azurevpnclient)が利用可能になりました。
>
> Azure AD の統合により、Point to Site VPN のユーザーベースのポリシー、条件付きアクセス、および**多要素認証 (MFA)** が可能になるため、ネイティブの Azure AD 認証サポートは企業顧客から広く要求されました。ネイティブ Azure AD 認証では、Azure AD トークンを取得および検証するために、Azure VPN ゲートウェイ統合と新しい **Azure VPN クライアント**の両方が必要です。

今までよりセキュアに VPN 接続でき、かつ運用がとてもラクになりそうですね。:heart_eyes:


# やってみよう

ざっくりな手順は以下のとおり。
今回は、新規の仮想ネットワークの作成から作業してみます。

1. 新規で仮想ネットワークと VPN ゲートウェイを作成する
2. Azure AD テナントを構成する
3. Point to Site VPN クライアントを構成する

# 1. 新規で仮想ネットワークと VPN ゲートウェイを作成する

まず新規で仮想ネットワークを作成し、GatewaySubnet を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/ec9bc052-3d90-7065-d246-a0c55cb83936.png)

続いて、VPN ゲートウェイを作成します。
※VPN ゲートウェイの SKU は Basic 以外を選択すること

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/6756e11d-3708-502b-ce00-66539cdee37c.png)


# 2. Azure AD テナントを構成する

それでは本題に入ります。
以下のドキュメントの手順に従って操作していきます。

[参考：Azure AD 認証を使用する P2S Open VPN 接続用の Azure Active Directory テナントを作成する](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/openvpn-azure-ad-tenant?WT.mc_id=AZ-MVP-5003113)


## Azure AD テナントを作成する

Azure サブスクリプションに紐づく Azure AD テナントを利用します。なので省略。

## ユーザーを作成する

ユーザーは、既存の全体管理者アカウントを利用します。なので省略。

## Azure AD テナントに「Azure VPN」を登録する

Azure AD テナントにアプリケーション「Azure VPN」を登録します。これは初回だけ行います。

以下の URL アクセスします。サインインを求められますので、対象の Azure AD テナントの全体管理者アカウントでサインインします。

```
https://login.microsoftonline.com/common/oauth2/authorize?client_id=41b23e61-6c1e-4545-b367-cd054e0ed4b4&response_type=code&redirect_uri=https://portal.azure.com&nonce=1234&prompt=admin_consent
```

すると、以下のように管理者の承諾を求められますので、[承諾] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/b053f56e-1791-4218-0ac1-1a0ff91a5bf8.png)

その後、Azure AD テナントの [エンタープライズ アプリケーション] の一覧に「Azure VPN」が掲載されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/70e4eeb0-610b-0890-7df5-67aba0904b3f.png)

「Azure VPN」のプロパティを確認してみます。
[ユーザーの割り当てが必要ですか?] 項目を「はい」と設定することにより、このアプリケーションにアクセスを許可するユーザーを限定することも可能ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/e65a9239-f0a1-62b2-1b82-ffff97c2d461.png)


## VPN ゲートウェイで Azure AD 認証を有効にする

まずは、Azure AD テナントの「ディレクトリ ID」を確認します。
対象の Azure AD テナントの [プロパティ] を開き、[ディレクトリ ID] をコピーして、テキストエディターなどにメモっておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/505478fa-9a63-f2bd-77fd-06eec2f6cfb4.png)

PowerShell で、以下のコマンドを実行して、VPN ゲートウェイでの Azure AD 認証を有効にします。
「&lt;your Directory ID&gt;」を先ほどコピーした Azure AD テナントの「ディレクトリ ID」に置換してください。
併せて、VPN クライアントのプロトコル「-VpnClientProtocol OpenVPN」とアドレス空間「-VpnClientAddressPool "172.16.0.0/24"」も設定します。

```PowerShell:
$rgName = "<Resource group>"
$gwName = "<name of VPN gateway>"
$aadTenantUri = "https://login.microsoftonline.com/<your Directory ID>"
$aadIssuerUri = "https://sts.windows.net/<your Directory ID>/"
$gw = Get-AzVirtualNetworkGateway -Name $gwName -ResourceGroupName $rgName
Set-AzVirtualNetworkGateway -VirtualNetworkGateway $gw `
 -AadTenantUri $aadTenantUri `
 -AadAudienceId "41b23e61-6c1e-4545-b367-cd054e0ed4b4" `
 -AadIssuerUri $aadIssuerUri `
 -VpnClientProtocol OpenVPN `
 -VpnClientAddressPool "172.16.0.0/24"
```

実行結果は以下のとおり。
赤枠の「VPN クライアント構成 (VpnClientConfiguration)」が設定されていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/efc88557-1936-0982-ac18-9718e4243f9f.png)


## クライアント構成プロファイルをダウンロードする

クライアント構成プロファイルを生成して、ダウンロードします。

PowerShell で、以下のコマンドを実行して、クライアント構成プロファイルを生成します。

```PowerShell:
$rgName = "<Resource group>"
$gwName = "<name of VPN gateway>"
$profile = New-AzVpnClientConfiguration -ResourceGroupName $rgName -Name $gwName  `
 -AuthenticationMethod "EapTls"
```

次に、クライアント構成プロファイルが格納している ZIP ファイルをダウンロードするための URL を出力します。

```PowerShell:
$profile.VpnProfileSASUrl
```

出力した URL をブラウザーでアクセスして、クライアント構成プロファイルが格納している ZIP ファイルをダウンロードします。

ダウンロードした ZIP ファイルを解凍して「AzureVPN」フォルダーを開くと、「azurevpnconfig.xml」があることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/550b22e2-b052-b53b-5861-767ba3723d79.png)


# 3. Point to Site VPN クライアントを構成する

最後に、VPN クライアントをセットアップします。
以下のドキュメントを参考に操作していきます。

[参考：VPN クライアントを P2S VPN 接続用に構成する:Azure AD 認証 (プレビュー)](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/openvpn-azure-ad-client?WT.mc_id=AZ-MVP-5003113)

Point to Site VPN 接続する PC (検証では Windows 10 を使用) で、Microsoft ストアから「[Azure VPN Client (Preview)](https://www.microsoft.com/p/azure-vpn-client-preview/9np355qt2sqb?rtc=1&activetab=pivot:overviewtab)」をダウンロードしてインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/ca3d33d1-43bf-fbeb-8280-865a1ad6660f.png)

起動すると、以下のような画面が表示されます。
VPN クライアントを構成するため、画面の左下にある「＋」をクリックして「インポート」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/9db339c9-4010-affa-c188-b930d0cef984.png)

先ほど入手した「クライアント構成プロファイル (azurevpnconfig.xml)」を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/4d9bc770-c785-1529-062a-b6f2048cfc77.png)

画面の右側に反映されますので、[保存] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/b6709243-1ef3-242d-8cb1-ebcafe15d0ba.png)

利用できる状態になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/ce10ba7f-8dbc-7b75-4268-f5a7cc73461e.png)


# 動作確認

それでは VPN 接続してみます。

PC で、「Azure VPN Client」を起動します。
画面の左側のリストから先ほどインポートした「VPN 接続」を選択して [接続] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/ad30e6c6-9ce0-0b4c-d678-7bc7f860183c.png)

資格情報が求められますので、対象の Azure AD テナントのユーザーでサインインします。
※デバイスに登録されているアカウントでない場合は「別のアカウントを使用する」を選択して、[続行] をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/de36fa30-29cb-836e-80a7-7f0a381c1893.png)

接続できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/450aefc7-c308-33c7-fdc5-a3b475c36652.png)

仮想ネットワーク上の仮想マシンにリモートデスクトップ接続もできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/034bd997-5910-4ee0-c702-1763b6d797a0.png)


## 検証：「Azure VPN に割り当てられていないユーザー」の場合

前述した以下の点を検証してみます。ユーザー割り当てを必要とし、割り当てられていないユーザーが Point to Site VPN 接続を試みた場合はどうなるでしょう。

> 「Azure VPN」のプロパティを確認してみます。
[ユーザーの割り当てが必要ですか?] 項目を「はい」と設定することにより、このアプリケーションにアクセスを許可するユーザーを限定することも可能ですね。

[ユーザーの割り当てが必要ですか?] 項目を「はい」と設定し、[ユーザーとグループ] にいないユーザーアカウントで試してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/26a72f87-66ea-0351-3f65-5e98728d0e4e.png)

「サインインしているユーザーは、アプリケーションのロールに割り当てられていません」ということで接続できず...これは想定どおりの動作ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/f1ab12cf-8881-e9bd-556b-b1080463ddb5.png)


## 検証：ゲストユーザー「別組織のアカウント(外部の Azure AD アカウント)」の場合

Azure AD テナントにゲストとして招待した「別組織のアカウント(外部の Azure AD アカウント)」は VPN 接続できるのでしょうか？

以下はその実行結果です。VPN 接続できませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/6e100e3d-e267-b216-10d8-2ca21ff0ceb0.png)

「クライアントは、クライアントのアプリケーション登録で要求された許可にリストされていないリソースへのアクセスを要求しました。」というのは、サインインしているユーザーのプロファイルを読み取ろうとして失敗したということです。このアカウントの Azure AD テナントでは、「Azure VPN」からのユーザープロファイルのアクセス許可していない (そもそもアプリケーション登録していない) ので、正しい動作となります。


## 検証：ゲストユーザー「Microsoft アカウント」の場合

Azure AD テナントにゲストとして招待した「Microsoft アカウント」は VPN 接続できるのでしょうか？
※検証では「Outlook.com (hotmail) アカウント」を使いました。

以下はその実行結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/749e9a2e-f4dd-0590-f24e-38256eed78c6.png)

挙動はナゾですが、VPN 接続できませんでした。


検証した結果、「Azure VPN」にアクセスを許可されたユーザー (対象 Azure AD テナント内部) は VPN 接続可。ゲストユーザーは VPN 接続不可。となりました。
※これは、あくまで私が検証したの結果 (2019年11月時点) であり、今後のアップデートで機能改善するかもしれません。あしからず。


# まとめ

これまで Point to Site VPN 接続を採用した場合、私は「VPN クライアント証明書の認証 (Azure 証明書)」を主に使っていました。これだと、定期的に証明書を更新しなければならず、また厳密にはユーザーと紐づかないので、運用がとても面倒くさいなと思っていました。

今回の「Azure AD 認証がサポート」されたことによって、ID 管理だけでアクセス許可／拒否が管理できるのはとてもラクであり、[Azure AD MFA](https://docs.microsoft.com/ja-jp/azure/active-directory/authentication/concept-mfa-howitworks?WT.mc_id=AZ-MVP-5003113) や [Azure AD 条件付きアクセス](https://docs.microsoft.com/ja-jp/azure/active-directory/conditional-access/overview?WT.mc_id=AZ-MVP-5003113) を併せて使えばよりセキュアに VPN 接続することができるようになるので、安心ですね。:blush:

[次回につづく](https://qiita.com/tetsuya-ooooo/items/e9c3691b382913bcf1af)