この記事では、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 から Connect>Connect via RDP を選択すると、 getRdpFileContents REST コマンドが呼び出されます。
POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DevTestLab/labs/{labName}/virtualmachines/{name}/getRdpFileContentsラボがゲートウェイで構成されている場合、
getRdpFileContentsアクションは認証トークンを要求するhttps://{gateway-hostname}/api/host/{lab-machine-name}/port/{port-number}を呼び出します。-
{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 に接続する必要があります。
構成要件
ゲートウェイ マシン、Azure Functions、およびネットワークを DevTest Labs RDP アクセスとトークン認証と連携させるには、いくつかの構成要件があります。
ゲートウェイ マシンの要件
ゲートウェイ マシンに必要な構成は次のとおりです。
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}への要求を処理する機能。
インターネット インフォメーション サービス (IIS) のアプリケーション ルーティング要求モジュールを使用して、https://{gateway-hostname}/api/host/{lab-machine-name}/port/{port-number}要求を関数アプリにリダイレクトできます。
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}"{storage-account-endpoint}を実行してaz storage account show --name {storage-account-name} --query primaryEndpoints.blobを取得します。{sas-token}を実行してaz storage container generate-sas --name {container-name} --account-name {storage-account-name} --https-only –permissions drlw –expiry {utc-expiration-date}を取得します。-
{storage-account-name}は、アップロードしたファイルを保持するストレージ アカウントの名前です。 -
{container-name}は、アップロードしたファイルを保持する{storage-account-name}内のコンテナーです。 -
{utc-expiration-date}は、SAS トークンが期限切れになり、ストレージ アカウントへのアクセスに使えなくなる日付を UTC で表したものです。
-
テンプレートのデプロイ出力から
gatewayFQDNとgatewayIPの値を記録します。 また、新しく作成された関数のキーの値も保存します。この値は、関数アプリの [ アプリ設定] タブで確認できます。TLS/SSL 証明書の FQDN が
gatewayIPの IP アドレスを指すように DNS を構成します。
リモート デスクトップ ゲートウェイ ファームを作成し、DNS を更新したら、ゲートウェイを使用するように 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 と一致する必要があります。
[ ゲートウェイ トークン シークレット ] ボックスに、前に記録したシークレット名を入力します。 この値は関数キー自体ではなく、関数キーを保持するキー コンテナーのシークレットの名前です。
[保存] を選択します。
注意
[保存] を選択すると、リモート デスクトップ ゲートウェイのライセンス条項に同意します。
ゲートウェイとラボの両方を構成した後、ラボ ユーザーが [接続 ] を選択したときに作成された RDP 接続ファイルには、ゲートウェイに接続してトークン認証を使用するために必要な情報が含まれます。
ラボの構成を自動化する
PowerShell: Set-DevTestLabGateway.ps1 は、 ゲートウェイ ホスト名 と ゲートウェイ トークン シークレット 設定を自動的に構成するサンプル PowerShell スクリプトです。
ARM: Azure DevTest Labs GitHub リポジトリのゲートウェイ サンプル ARM テンプレートを使って、[ゲートウェイ ホスト名] と [ゲートウェイ トークン シークレット] が設定されたラボを作成するか更新します。
ネットワーク セキュリティ グループを構成する
ラボをさらにセキュリティで保護するには、「ネットワーク セキュリティ グループの 作成、変更、または削除」の説明に従って、ラボ VM が使用する仮想ネットワークにネットワーク セキュリティ グループ (NSG) を追加します。 たとえば、最初にゲートウェイを通過してラボの VMに到達するトラフィックのみを NSG で許可することが考えられます。 ゲートウェイ マシンまたはゲートウェイ ファームのロード バランサーの IP アドレスが、このルールのソースになります。