Azure 仮想ネットワークの Point to Site VPN 接続 (OpenVPN) でAzure AD認証がサポートされたとアナウンスがありました。
アップデートを確認
参考:Native Azure Active Directory authentication support in point-to-site VPN
上記のアップデート情報には、以下のように記載されています。(機械翻訳)
OpenVPN プロトコルのネイティブ Azure Active Directory (Azure AD) 認証サポート、および Windows 用 Azure VPN クライアントが利用可能になりました。
Azure AD の統合により、Point to Site VPN のユーザーベースのポリシー、条件付きアクセス、および多要素認証 (MFA) が可能になるため、ネイティブの Azure AD 認証サポートは企業顧客から広く要求されました。ネイティブ Azure AD 認証では、Azure AD トークンを取得および検証するために、Azure VPN ゲートウェイ統合と新しい Azure VPN クライアントの両方が必要です。
今までよりセキュアに VPN 接続でき、かつ運用がとてもラクになりそうですね。
やってみよう
ざっくりな手順は以下のとおり。
今回は、新規の仮想ネットワークの作成から作業してみます。
- 新規で仮想ネットワークと VPN ゲートウェイを作成する
- Azure AD テナントを構成する
- Point to Site VPN クライアントを構成する
1. 新規で仮想ネットワークと VPN ゲートウェイを作成する
まず新規で仮想ネットワークを作成し、GatewaySubnet を作成します。
続いて、VPN ゲートウェイを作成します。
※VPN ゲートウェイの SKU は Basic 以外を選択すること
2. Azure AD テナントを構成する
それでは本題に入ります。
以下のドキュメントの手順に従って操作していきます。
参考:Azure AD 認証を使用する P2S Open VPN 接続用の Azure Active Directory テナントを作成する
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
すると、以下のように管理者の承諾を求められますので、[承諾] をクリックします。
その後、Azure AD テナントの [エンタープライズ アプリケーション] の一覧に「Azure VPN」が掲載されます。
「Azure VPN」のプロパティを確認してみます。
[ユーザーの割り当てが必要ですか?] 項目を「はい」と設定することにより、このアプリケーションにアクセスを許可するユーザーを限定することも可能ですね。
VPN ゲートウェイで Azure AD 認証を有効にする
まずは、Azure AD テナントの「ディレクトリ ID」を確認します。
対象の Azure AD テナントの [プロパティ] を開き、[ディレクトリ ID] をコピーして、テキストエディターなどにメモっておきます。
PowerShell で、以下のコマンドを実行して、VPN ゲートウェイでの Azure AD 認証を有効にします。
「<your Directory ID>」を先ほどコピーした Azure AD テナントの「ディレクトリ ID」に置換してください。
併せて、VPN クライアントのプロトコル「-VpnClientProtocol OpenVPN」とアドレス空間「-VpnClientAddressPool "172.16.0.0/24"」も設定します。
$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)」が設定されていることが確認できます。
クライアント構成プロファイルをダウンロードする
クライアント構成プロファイルを生成して、ダウンロードします。
PowerShell で、以下のコマンドを実行して、クライアント構成プロファイルを生成します。
$rgName = "<Resource group>"
$gwName = "<name of VPN gateway>"
$profile = New-AzVpnClientConfiguration -ResourceGroupName $rgName -Name $gwName `
-AuthenticationMethod "EapTls"
次に、クライアント構成プロファイルが格納している ZIP ファイルをダウンロードするための URL を出力します。
$profile.VpnProfileSASUrl
出力した URL をブラウザーでアクセスして、クライアント構成プロファイルが格納している ZIP ファイルをダウンロードします。
ダウンロードした ZIP ファイルを解凍して「AzureVPN」フォルダーを開くと、「azurevpnconfig.xml」があることが確認できます。
3. Point to Site VPN クライアントを構成する
最後に、VPN クライアントをセットアップします。
以下のドキュメントを参考に操作していきます。
参考:VPN クライアントを P2S VPN 接続用に構成する:Azure AD 認証 (プレビュー)
Point to Site VPN 接続する PC (検証では Windows 10 を使用) で、Microsoft ストアから「Azure VPN Client (Preview)」をダウンロードしてインストールします。
起動すると、以下のような画面が表示されます。
VPN クライアントを構成するため、画面の左下にある「+」をクリックして「インポート」を選択します。
先ほど入手した「クライアント構成プロファイル (azurevpnconfig.xml)」を開きます。
画面の右側に反映されますので、[保存] をクリックします。
利用できる状態になりました。
動作確認
それでは VPN 接続してみます。
PC で、「Azure VPN Client」を起動します。
画面の左側のリストから先ほどインポートした「VPN 接続」を選択して [接続] をクリックします。
資格情報が求められますので、対象の Azure AD テナントのユーザーでサインインします。
※デバイスに登録されているアカウントでない場合は「別のアカウントを使用する」を選択して、[続行] をクリック
接続できました。
仮想ネットワーク上の仮想マシンにリモートデスクトップ接続もできました。
検証:「Azure VPN に割り当てられていないユーザー」の場合
前述した以下の点を検証してみます。ユーザー割り当てを必要とし、割り当てられていないユーザーが Point to Site VPN 接続を試みた場合はどうなるでしょう。
「Azure VPN」のプロパティを確認してみます。
[ユーザーの割り当てが必要ですか?] 項目を「はい」と設定することにより、このアプリケーションにアクセスを許可するユーザーを限定することも可能ですね。
[ユーザーの割り当てが必要ですか?] 項目を「はい」と設定し、[ユーザーとグループ] にいないユーザーアカウントで試してみます。
「サインインしているユーザーは、アプリケーションのロールに割り当てられていません」ということで接続できず...これは想定どおりの動作ですね。
検証:ゲストユーザー「別組織のアカウント(外部の Azure AD アカウント)」の場合
Azure AD テナントにゲストとして招待した「別組織のアカウント(外部の Azure AD アカウント)」は VPN 接続できるのでしょうか?
以下はその実行結果です。VPN 接続できませんでした。
「クライアントは、クライアントのアプリケーション登録で要求された許可にリストされていないリソースへのアクセスを要求しました。」というのは、サインインしているユーザーのプロファイルを読み取ろうとして失敗したということです。このアカウントの Azure AD テナントでは、「Azure VPN」からのユーザープロファイルのアクセス許可していない (そもそもアプリケーション登録していない) ので、正しい動作となります。
検証:ゲストユーザー「Microsoft アカウント」の場合
Azure AD テナントにゲストとして招待した「Microsoft アカウント」は VPN 接続できるのでしょうか?
※検証では「Outlook.com (hotmail) アカウント」を使いました。
以下はその実行結果です。
挙動はナゾですが、VPN 接続できませんでした。
検証した結果、「Azure VPN」にアクセスを許可されたユーザー (対象 Azure AD テナント内部) は VPN 接続可。ゲストユーザーは VPN 接続不可。となりました。
※これは、あくまで私が検証したの結果 (2019年11月時点) であり、今後のアップデートで機能改善するかもしれません。あしからず。
まとめ
これまで Point to Site VPN 接続を採用した場合、私は「VPN クライアント証明書の認証 (Azure 証明書)」を主に使っていました。これだと、定期的に証明書を更新しなければならず、また厳密にはユーザーと紐づかないので、運用がとても面倒くさいなと思っていました。
今回の「Azure AD 認証がサポート」されたことによって、ID 管理だけでアクセス許可/拒否が管理できるのはとてもラクであり、Azure AD MFA や Azure AD 条件付きアクセス を併せて使えばよりセキュアに VPN 接続することができるようになるので、安心ですね。