你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
在 Azure 开发测试实验室中配置并使用远程桌面网关
本文介绍了如何在 Azure 开发测试实验室中设置并使用网关来对实验室虚拟机 (VM) 进行安全的远程桌面访问。 使用网关可以提高安全性,因为不会向 Internet 公开 VM 的远程桌面协议 (RDP) 端口。 此远程桌面网关解决方案还支持令牌身份验证。
开发测试实验室为实验室用户提供一个中心位置来查看和连接其 VM。 在实验室 VM 的“概述”页上选择“连接”>“RDP”,可以创建特定于计算机的 RDP 文件,并且用户可以打开该文件来连接到 VM。
使用远程桌面网关,实验室用户可以通过网关计算机连接到其 VM。 用户直接对网关计算机进行身份验证,并且可在加入域的计算机上使用公司提供的凭据。 令牌身份验证提供了额外的安全层。
在未公开端口或 IP 地址的情况下安全访问实验室 VM 的另一种方式是使用带有 Azure Bastion 的浏览器。 有关详情,请参阅使用 Azure Bastion 启用与开发测试实验室 VM 连接的浏览器。
体系结构
下图演示了远程桌面网关如何应用令牌身份验证并连接到开发测试实验室 VM。
从实验室 VM 选择“连接”>“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 函数会生成并返回令牌,该令牌用于在网关计算机上进行基于证书的身份验证。
然后,
getRdpFileContents
操作返回完整的 RDP 文件,其中包含身份验证令牌。
当 RDP 连接程序打开 RDP 文件时,远程桌面网关会对令牌进行身份验证,并且连接会转发到实验室 VM。
注意
并非所有 RDP 连接程序都支持令牌身份验证。
重要
Azure 函数会设置身份验证令牌的到期日期。 用户必须在令牌到期之前连接到 VM。
配置要求
网关计算机、Azure Functions 和网络有一些配置要求,以实现开发测试实验室 RDP 访问和令牌身份验证:
网关计算机要求
网关计算机必须具有以下配置:
用于处理 HTTPS 流量的 TLS/SSL 证书。 如果只有一台计算机,则证书必须与网关计算机的完全限定域名 (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}
的请求。
可使用适用于 Internet 信息服务器 (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 地址,则必须存在一条从网关计算机到实验室计算机的网络路径。 这两台计算机必须共享同一虚拟网络或使用对等互连的虚拟网络。
创建远程桌面网关
Azure 开发测试实验室 GitHub 存储库具有 Azure 资源管理器 (ARM) 模板,可帮助设置开发测试实验室令牌身份验证和远程桌面网关资源。 它们用于网关计算机创建、实验室设置和函数应用。
注意
使用示例模板即表示你同意远程桌面网关的许可条款。
请遵循以下步骤设置示例远程桌面网关场。
创建签名证书。
运行 Create-SigningCertificate.ps1。 记录创建的证书的指纹、密码和 Base64 编码,供稍后使用。
获取 TLS/SSL 证书。 与 TLS/SSL 证书关联的 FQDN 必须是你控制的域的 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
必需 如果 _artifactsLocation
为 Azure 存储帐户,则为用于访问项目的共享访问签名 (SAS) 令牌。运行以下 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),该日期过后,不能再使用该 SAS 令牌访问存储帐户。
请记下模板部署输出中的
gatewayFQDN
和gatewayIP
值。 此外,还要保存新创建的函数的密钥值,该值可以在函数应用的应用程序设置选项卡中找到。配置 DNS,以便 TLS/SSL 证书的 FQDN 定向到
gatewayIP
IP 地址。
创建远程桌面网关场并更新 DNS 后,可将 Azure 开发测试实验室配置为使用网关。
将实验室配置为使用令牌身份验证
在更新实验室设置之前,请在实验室的密钥保管库中存储身份验证令牌函数。 可在 Azure 门户中函数的“函数密钥”页上获取函数密钥值。 若要查找实验室密钥保管库的 ID,请运行以下 Azure CLI 命令:
az resource show --name {lab-name} --resource-type 'Microsoft.DevTestLab/labs' --resource-group {lab-resource-group-name} --query properties.vaultName
在将机密添加到密钥保管库文章中了解如何在密钥保管库中保存机密。 记录机密名称供稍后使用。 此值不是函数密钥本身,而是保存了函数密钥的密钥保管库机密的名称。
若要配置实验室的“网关主机名”和“网关令牌机密”配置,以在网关机器上使用令牌身份验证,请执行以下步骤:
在实验室的“概述”页上,从左侧导航栏中选择“配置和策略”。
在“配置和策略”页上,从左侧导航栏的“设置”部分中选择“实验室设置”。
在“远程桌面”部分中:
对于“网关主机名”字段,输入远程桌面服务网关计算机或场的 FQDN 或 IP 地址。 此值必须与网关计算机上使用的 TLS/SSL 证书的 FQDN 相匹配。
对于“网关令牌”,输入之前记录的密钥名称。 此值不是函数密钥本身,而是保存了函数密钥的密钥保管库机密的名称。
选择“保存”。
注意
选择“保存”即表示你同意远程桌面网关许可条款。
配置网关和实验室后,在实验室用户选择“连接”时创建的 RDP 连接文件将包含连接到网关和使用令牌身份验证的所需信息。
自动执行实验室配置
PowerShell:Set-DevTestLabGateway.ps1 是用于自动设置网关主机名和网关令牌机密设置的示例 PowerShell 脚本。
ARM:在 Azure 开发测试实验室 GitHub 存储库中使用网关示例 ARM 模板创建或更新具有网关主机名和网关令牌机密设置的实验室。
配置网络安全组
要进一步保护实验室,请将网络安全组 (NSG) 添加到实验室 VM 使用的虚拟网络,如创建、更改或删除网络安全组中所述。 例如,NSG 可能只允许最先通过网关的流量进入实验室 VM。 规则源是网关计算机的 IP 地址,或是网关场的负载均衡器的 IP 地址。