Azure DevTest Labs のリモート デスクトップ ゲートウェイを構成して使用する
この記事では、Azure DevTest Labs のゲートウェイを設定、使って、ラボ仮想マシン (VM) への安全なリモート デスクトップ アクセスを実現する方法について説明します。 ゲートウェイを使用すると、VM の RDP (リモート デスクトップ プロトコル) ポートをインターネットに公開せずに済むため、セキュリティが向上します。 このリモート デスクトップ ゲートウェイ ソリューションでは、トークン認証もサポートされます。
DevTest Labs は、ラボ ユーザーがその VM を表示したり VM に接続したりするための一元的な場所を提供します。 ラボの VM の [概要] ページで [接続]>[RDP] を選択すると、マシン固有の RDP ファイルが作成されます。ユーザーは、このファイルを開くことで VM に接続できます。
リモート デスクトップ ゲートウェイでは、ラボのユーザーがゲートウェイ マシンを介してその VM に接続します。 ユーザーはゲートウェイ マシンに対して直接認証を行い、会社から支給された資格情報をドメイン参加済みのマシンに対して使用できます。 トークン認証により、セキュリティは一層強化されます。
ポートや IP アドレスを公開することなくラボの VM に安全にアクセスする手段としては他にも、ブラウザーから Azure Bastion を使用する方法があります。 詳細については、「Azure Bastion を使用して DevTest Labs VM へのブラウザー接続を有効にする」を参照してください。
アーキテクチャ
次の図は、リモート デスクトップ ゲートウェイでトークン認証を利用して、DevTest Labs の VM に接続する方法を示しています。
ラボの VM から [接続]>[RDP] を選択して、getRdpFileContents REST コマンドを呼び出します。
POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DevTestLab/labs/{labName}/virtualmachines/{name}/getRdpFileContents
ラボにゲートウェイが構成されている場合、認証トークンを要求する
https://{gateway-hostname}/api/host/{lab-machine-name}/port/{port-number}
がgetRdpFileContents
アクションによって呼び出されます。{gateway-hostname}
(ロード バランサーの場合は{lb-uri}
) は、[ラボの設定] ページで指定されたラボのゲートウェイのホスト名です。{lab-machine-name}
は、接続先の VM の名前です。{port-number}
は、接続に使用するポートです。 通常、このポートは 3389 ですが、ラボの VM に共有 IP が使用されている場合は、異なるポート番号になります。
リモート デスクトップ ゲートウェイは
https://{function-app-uri}/api/host/{lab-machine-name}/port/{port-number}
を使用して、Azure Functions 関数アプリの呼び出しを先延ばしします。注意
要求ヘッダーには、ラボのキー コンテナーから取得された関数キーが自動的に追加されます。 関数キー シークレットの名前は、ラボの [ラボの設定] ページにある [ゲートウェイ トークン シークレット] です。
Azure 関数は、ゲートウェイ マシンにおける証明書ベース認証用トークンを生成して返します。
認証トークンを含む完全な RDP ファイルが
getRdpFileContents
アクションから返されます。
RDP 接続プログラムが RDP ファイルを開くと、リモート デスクトップ ゲートウェイがトークンを認証し、接続がラボの VM に転送されます。
注意
すべての RDP 接続プログラムがトークン認証をサポートしているわけではありません。
重要
認証トークンには、Azure 関数によって有効期限が設定されます。 ユーザーはトークンの有効期限が切れる前に VM に接続する必要があります。
構成要件
DevTest Labs の RDP アクセスとトークン認証に使用するゲートウェイ マシン、Azure Functions、ネットワークには、いくつかの構成要件があります。
ゲートウェイ マシンの要件
ゲートウェイ マシンに必要な構成は次のとおりです。
HTTPS トラフィックを処理するための TLS/SSL 証明書。 証明書は、ゲートウェイ ファームのロード バランサーまたはゲートウェイ マシン (マシンが 1 台しかない場合) の完全修飾ドメイン名 (FQDN) と一致する必要があります。 ワイルドカード TLS/SSL 証明書は機能しません。
署名証明書。 署名証明書は、Create-SigningCertificate.ps1 PowerShell スクリプトを使用して作成できます。
トークン認証をサポートするプラグ可能な認証モジュール。 たとえば、System Center Virtual Machine Manager (VMM) のイメージに付属している RDGatewayFedAuth.msi があります。
https://{gateway-hostname}/api/host/{lab-machine-name}/port/{port-number}
への要求を処理する機能。
関数アプリに対する https://{gateway-hostname}/api/host/{lab-machine-name}/port/{port-number}
要求は、インターネット インフォメーション サーバー (IIS) のアプリケーション ルーティング要求モジュールを使用してリダイレクトできます。
Azure Functions の要件
Azure Functions 関数アプリは https://{function-app-uri}/app/host/{lab-machine-name}/port/{port-number}
形式の要求を処理し、ゲートウェイ マシンの署名証明書に基づいて認証トークンを作成して返します。 {function-app-uri}
は、関数にアクセスするために使用する URI です。
ラボのキー コンテナーから取得された関数キーを、要求ヘッダーで渡す必要があります。
関数のサンプルについては、CreateToken.cs を参照してください。
ネットワークの要件
ゲートウェイ マシンの TLS/SSL 証明書に関連付けられている FQDN の DNS は、ゲートウェイ マシンに、またはゲートウェイ マシン ファームのロード バランサーにトラフィックを送信する必要があります。
ラボの VM でプライベート IP を使用する場合は、ゲートウェイ マシンからラボ マシンへのネットワーク パスが存在しなければなりません。 2 台のマシンが同じ仮想ネットワークを共有するか、ピアリングされた仮想ネットワークを使用する必要があります。
リモート デスクトップ ゲートウェイを作成する
DevTest Labs のトークン認証とリモート デスクトップ ゲートウェイ リソースのセットアップに利用できる Azure Resource Manager (ARM) テンプレートが、Azure DevTest Labs GitHub リポジトリで提供されています。 ゲートウェイ マシンの作成、ラボの設定、関数アプリのテンプレートがあります。
注意
サンプルのテンプレートを使用して、リモート デスクトップ ゲートウェイのライセンス条項に同意します。
リモート デスクトップ ゲートウェイ ファームのサンプルをセットアップするには、これらの手順に従います。
署名証明書を作成します。
Create-SigningCertificate.ps1 を実行します。 作成した証明書の拇印、パスワード、Base64 エンコードは、後で使用できるよう記録しておいてください。
TLS/SSL 証明書を取得します。 TLS/SSL 証明書に関連付けられている FQDN は、管理するドメインのものでなくてはなりません。
TLS/SSL 証明書のパスワード、拇印、Base64 エンコーディングを後で使用するために記録します。
拇印を取得するには、次の PowerShell コマンドを使用します。
$cer = New-Object System.Security.Cryptography.X509Certificates.X509Certificate; $cer.Import('path-to-certificate'); $hash = $cer.GetCertHashString()
Base64 エンコードを取得するには、次の PowerShell コマンドを使用します。
[System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes('path-to-certificate'))
https://github.com/Azure/azure-devtestlab/tree/master/samples/DevTestLabs/GatewaySample/arm/gateway からすべてのファイルをダウンロードします。 すべてのファイルと RDGatewayFedAuth.msi をストレージ アカウントの BLOB コンテナーにコピーします。
https://github.com/Azure/azure-devtestlab/tree/master/samples/DevTestLabs/GatewaySample/arm/gateway の azuredeploy.json を開き、次のパラメーターを設定します。
パラメーター 必須 説明 adminUsername
必須 ゲートウェイ マシンの管理者ユーザー名。 adminPassword
必須 ゲートウェイ マシンの管理者アカウントのパスワード。 instanceCount
作成するゲートウェイ マシンの数。 alwaysOn
作成した Azure Functions アプリのウォームアップ (オン) のまま維持するかどうか。 アプリをオンのまま維持すると、ユーザーが最初にラボの VM に接続しようとしたときの待ち時間を回避できますが、コストの問題が生じます。 tokenLifetime
作成されたトークンが有効な期間 (HH:MM:SS 形式)。 sslCertificate
必須 ゲートウェイ マシン用の TLS/SSL 証明書の Base64 エンコード。 sslCertificatePassword
必須 ゲートウェイ マシン用の TLS/SSL 証明書のパスワード。 sslCertificateThumbprint
必須 署名証明書のローカル証明書ストアにある識別用の証明書の拇印。 signCertificate
必須 ゲートウェイ マシン用の署名証明書の Base64 エンコード。 signCertificatePassword
必須 ゲートウェイ マシン用の署名証明書のパスワード。 signCertificateThumbprint
必須 署名証明書のローカル証明書ストアにある識別用の証明書の拇印。 _artifactsLocation
必須 このテンプレートに必要な成果物の検索先の URI。 この値は、相対パスではなく、完全修飾 URI でなければなりません。 成果物には、たとえば他のテンプレートや PowerShell スクリプトのほか、トークン認証をサポートするリモート デスクトップ ゲートウェイのプラグ可能な認証モジュール (RDGatewayFedAuth.msi という名前になります) があります。 _artifactsLocationSasToken
必須 成果物にアクセスするためのShared Access Signature (SAS) トークン ( _artifactsLocation
が Azure ストレージ アカウントである場合)。次の Azure CLI コマンドを実行して azuredeploy.json をデプロイします。
az deployment group create --resource-group {resource-group} --template-file azuredeploy.json --parameters @azuredeploy.parameters.json -–parameters _artifactsLocation="{storage-account-endpoint}/{container-name}" -–parameters _artifactsLocationSasToken = "?{sas-token}"
az storage account show --name {storage-account-name} --query primaryEndpoints.blob
を実行して{storage-account-endpoint}
を取得します。az storage container generate-sas --name {container-name} --account-name {storage-account-name} --https-only –permissions drlw –expiry {utc-expiration-date}
を実行して{sas-token}
を取得します。{storage-account-name}
は、アップロードしたファイルを保持するストレージ アカウントの名前です。{container-name}
は、アップロードしたファイルを保持する{storage-account-name}
内のコンテナーです。{utc-expiration-date}
は、SAS トークンが期限切れになり、ストレージ アカウントへのアクセスに使えなくなる日付を UTC で表したものです。
テンプレートのデプロイ出力から
gatewayFQDN
とgatewayIP
の値を記録します。 また、新しく作成された関数のキーの値も保存してください。この値は、関数アプリの [アプリケーションの設定] タブで確認できます。TLS/SSL 証明書の FQDN が
gatewayIP
の IP アドレスを指すように DNS を構成します。
リモート デスクトップ ゲートウェイ ファームを作成して DNS を更新したら、そのゲートウェイを使うように Azure DevTest Labs を構成します。
トークン認証を使用するようにラボを構成する
ラボの設定を更新する前に、認証トークン関数のキーをラボのキー コンテナーに格納します。 関数キーの値は、Azure portal の関数の [関数キー] ページで取得できます。 ラボのキー コンテナーの ID を見つけるには、次の Azure CLI コマンドを実行します。
az resource show --name {lab-name} --resource-type 'Microsoft.DevTestLab/labs' --resource-group {lab-resource-group-name} --query properties.vaultName
シークレットをキー コンテナーに保存する方法については、記事「Key Vault にシークレットを追加する」を参照してください。 シークレット名は後で使用するので記録しておいてください。 この値は関数キー自体ではなく、関数キーを保持するキー コンテナーのシークレットの名前です。
ゲートウェイ マシンでトークン認証を使用するようにラボの [ゲートウェイ ホスト名] と [ゲートウェイ トークン シークレット] を構成するには、これらの手順に従います。
ラボの [概要] ページで、左側のナビゲーションから [構成とポリシー] を選択します。
[構成とポリシー] ページで、左側のナビゲーションの [設定] セクションにある [ラボの設定] を選択します。
[リモート デスクトップ] セクションで次の操作を行います。
[ゲートウェイ ホスト名] フィールドに、リモート デスクトップ サービス ゲートウェイ マシンまたはファームの FQDN または IP アドレスを入力します。 この値は、ゲートウェイ マシンで使用されている TLS/SSL 証明書の FQDN と一致する必要があります。
[Gateway token] (ゲートウェイ トークン) に、先ほど記録したシークレット名を入力します。 この値は関数キー自体ではなく、関数キーを保持するキー コンテナーのシークレットの名前です。
[保存] を選択します。
注意
[保存] を選択して、リモート デスクトップ ゲートウェイのライセンス条項に同意します。
ゲートウェイとラボの両方を構成すると、ラボのユーザーが [接続] を選択したときに作成される RDP 接続ファイルに、ゲートウェイに接続してトークン認証を使用するうえで必要な情報が追加されます。
ラボの構成を自動化する
PowerShell: Set-DevTestLabGateway.ps1 は、[ゲートウェイ ホスト名] と [ゲートウェイ トークン シークレット] の設定を自動的に行うサンプル PowerShell スクリプトです。
ARM: Azure DevTest Labs GitHub リポジトリのゲートウェイ サンプル ARM テンプレートを使って、[ゲートウェイ ホスト名] と [ゲートウェイ トークン シークレット] が設定されたラボを作成するか更新します。
ネットワーク セキュリティ グループを構成する
ラボのセキュリティをさらに強化するには、「ネットワーク セキュリティ グループの作成、変更、削除」で説明されているように、ラボの VM が使う仮想ネットワークにネットワーク セキュリティ グループ (NSG) を追加します。 たとえば、最初にゲートウェイを通過してラボの VMに到達するトラフィックのみを NSG で許可することが考えられます。 ゲートウェイ マシンまたはゲートウェイ ファームのロード バランサーの IP アドレスが、このルールのソースになります。