你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文介绍了如何在 Azure 开发测试实验室中设置并使用网关来对实验室虚拟机 (VM) 进行安全的远程桌面访问。 使用网关可提高安全性,因为不会向 Internet 公开 VM 的远程桌面协议 (RDP) 端口。 此远程桌面网关解决方案还支持令牌身份验证。
开发测试实验室为实验室用户提供一个中心位置来查看和连接其 VM。 在实验室虚拟机(VM)的“概述”页面上,选择“连接”>或“通过 RDP 连接”,将生成特定于机器的 RDP 文件,用户可以打开该文件以连接到 VM。
使用远程桌面网关,实验室用户可以通过网关计算机连接到其 VM。 用户可以直接在网关计算机上进行身份验证,并在加入域的计算机上使用公司提供的凭据。 令牌身份验证提供了额外的安全层。
在未公开端口或 IP 地址的情况下安全访问实验室 VM 的另一种方式是使用带有 Azure Bastion 的浏览器。 有关详情,请参阅使用 Azure Bastion 启用与开发测试实验室 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 Information Services 的应用程序路由请求模块(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)必须属于您控制的域。
记录 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}"通过运行
{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),该日期过后,不能再使用该 SAS 令牌访问存储帐户。
-
请记下模板部署输出中的
gatewayFQDN和gatewayIP值。 此外,保存新创建的函数的键值,可在函数应用的 “应用设置”选项卡中找到该值。配置 DNS,以便 TLS/SSL 证书的 FQDN 定向到
gatewayIPIP 地址。
创建远程桌面网关集群并更新 DNS 后,请配置 DevTest 实验室以使用该网关。
将实验室配置为使用令牌身份验证
在更新实验室设置之前,请在实验室的密钥保管库中存储身份验证令牌函数。 可以在 Azure 门户中函数的 “函数密钥 ”页上获取函数键值。 若要查找实验室密钥保管库的 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 相匹配。
在 “网关令牌机密 ”框中,输入前面记录的机密名称。 此值不是函数密钥本身,而是保存了函数密钥的密钥保管库机密的名称。
选择“保存”。
注意
选择 “保存 ”表示你同意 远程桌面网关许可条款。
配置网关和实验室后,在实验室用户选择 Connect 时创建的 RDP 连接文件包括连接到网关并使用令牌身份验证所需的信息。
自动执行实验室配置
PowerShell: Set-DevTestLabGateway.ps1 是一个示例 PowerShell 脚本,用于自动配置 网关主机名 和 网关令牌机密 设置。
ARM:在 Azure 开发测试实验室 GitHub 存储库中使用网关示例 ARM 模板创建或更新具有网关主机名和网关令牌机密设置的实验室。
配置网络安全组
若要进一步保护实验室,请将网络安全组(NSG)添加到实验室 VM 使用的虚拟网络,如 创建、更改或删除网络安全组中所述。 例如,NSG 可能只允许最先通过网关的流量进入实验室 VM。 规则源是网关计算机的 IP 地址,或是网关场的负载均衡器的 IP 地址。