Azure DevTest Labs에서 원격 데스크톱 게이트웨이 구성 및 사용
이 문서에서는 Azure DevTest Labs에서 랩 VM(가상 머신)의 안전한 원격 데스크톱에 액세스하기 위해 게이트웨이를 설정하고 사용하는 방법을 설명합니다. 게이트웨이를 사용하면 VM의 RDP(원격 데스크톱 프로토콜) 포트를 인터넷에 노출하지 않아 보안 성능이 향상됩니다. 이 원격 데스크톱 게이트웨이 솔루션은 토큰 인증도 지원합니다.
DevTest Labs는 랩 사용자가 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
랩에 게이트웨이가 구성되어 있으면
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 연결 프로그램이 토큰 인증을 지원하는 것은 아닙니다.
Important
Azure 함수는 인증 토큰의 만료 날짜를 설정합니다. 토큰이 만료되기 전에 사용자가 VM에 연결해야 합니다.
구성 요구 사항
게이트웨이 컴퓨터, Azure Functions, 네트워크에서 DevTest Labs RDP 액세스 및 토큰 인증을 사용하기 위한 몇 가지 구성 요구 사항이 있습니다.
게이트웨이 컴퓨터 요구 사항
게이트웨이 컴퓨터에는 다음과 같은 구성이 있어야 합니다.
HTTPS 트래픽을 처리하는 TLS/SSL 인증서. 인증서는 컴퓨터가 한 대뿐인 경우 게이트웨이 컴퓨터의 FQDN(정규화된 도메인 이름) 또는 게이트웨이 팜의 부하 분산 장치와 일치해야 합니다. 와일드카드 TLS/SSL 인증서가 작동하지 않습니다.
서명 인증서. Create-SigningCertificate.ps1 PowerShell 스크립트를 사용하여 서명 인증서를 만들 수 있습니다.
토큰 인증을 지원하는 플러그형 인증 모듈. 한 가지 예로 System Center VMM(Virtual Machine Manager) 이미지와 함께 제공되는 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 주소를 사용하는 경우 게이트웨이 컴퓨터에서 랩 머신으로 연결되는 네트워크 경로가 있어야 합니다. 두 컴퓨터는 동일한 가상 네트워크를 공유하거나 피어링된 가상 네트워크를 사용해야 합니다.
원격 데스크톱 게이트웨이 만들기
Azure DevTest Labs GitHub 리포지토리에는 DevTest Labs 토큰 인증 및 원격 데스크톱 게이트웨이 리소스를 설정하는 데 도움이 되는 ARM(Azure Resource Manager) 템플릿이 있습니다. 게이트웨이 컴퓨터 만들기, 랩 설정 및 함수 앱에 대한 템플릿이 있습니다.
참고 항목
샘플 템플릿을 사용하여 원격 데스크톱 게이트웨이 사용 조건에 동의합니다.
다음 단계에 따라 샘플 원격 데스크톱 게이트웨이 팜을 설정합니다.
서명 인증서를 만듭니다.
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
Required 게이트웨이 컴퓨터에 대한 관리자 계정의 암호입니다. instanceCount
만들 게이트웨이 머신의 수입니다. alwaysOn
만든 Azure Functions 앱을 웜(켜짐)으로 유지할지 여부입니다. 앱을 켜진 상태로 유지하면 사용자가 랩 VM에 처음 연결하려고 할 때 지연을 방지할 수 있지만, 비용에 영향을 줍니다. tokenLifetime
만들어진 토큰이 유효한 HH:MM:SS 형식의 시간입니다. sslCertificate
Required 게이트웨이 컴퓨터용 TLS/SSL 인증서의 Base64 인코딩입니다. sslCertificatePassword
Required 게이트웨이 컴퓨터용 TLS/SSL 인증서의 암호입니다. sslCertificateThumbprint
Required 서명 인증서의 로컬 인증서 저장소에서 식별하기 위한 인증서 지문입니다. signCertificate
Required 게이트웨이 컴퓨터용 서명 인증서의 Base64 인코딩입니다. signCertificatePassword
Required 게이트웨이 컴퓨터용 서명 인증서의 암호입니다. signCertificateThumbprint
Required 서명 인증서의 로컬 인증서 저장소에서 식별하기 위한 인증서 지문입니다. _artifactsLocation
Required 이 템플릿에서 필요한 아티팩트 찾기 위한 URI 위치입니다. 이 값은 상대 경로가 아니라 정규화된 URI여야 합니다. 아티팩트에는 토큰 인증을 지원하는, 이름이 RDGatewayFedAuth.msi일 것으로 예상되는 기타 템플릿과 PowerShell 스크립트 및 원격 데스크톱 게이트웨이 플러그형 인증 모듈이 포함됩니다. _artifactsLocationSasToken
Required _artifactsLocation
이 Azure Storage 계정인 경우 아티팩트에 액세스하기 위한 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)입니다.
템플릿 배포 출력에서
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과 일치해야 합니다.
게이트웨이 토큰에서 이전에 기록한 비밀 이름을 입력합니다. 이 값은 함수 키 자체가 아니라 함수 키를 보유하고 있는 키 자격 증명 모음의 비밀 이름입니다.
저장을 선택합니다.
참고 항목
저장을 선택하면 원격 데스크톱 게이트웨이 사용 조건에 동의하는 것입니다.
게이트웨이와 랩을 모두 구성하면 랩 사용자가 연결을 선택할 때 만들어진 RDP 연결 파일에는 게이트웨이에 연결하고 토큰 인증을 사용하는 데 필요한 정보가 포함됩니다.
랩 구성 자동화
PowerShell: Set-DevTestLabGateway.ps1은 게이트웨이 호스트 이름 및 게이트웨이 토큰 비밀 설정을 자동으로 지정하는 샘플 PowerShell 스크립트입니다.
ARM: Azure DevTest Labs GitHub 리포지토리에서 게이트웨이 샘플 ARM 템플릿을 사용하여 Gateway 호스트 이름 및 게이트웨이 토큰 비밀 설정으로 랩을 만들거나 업데이트합니다.
네트워크 보안 그룹 구성
랩의 보안을 강화하려면 네트워크 보안 그룹 만들기, 변경 또는 삭제에 설명된 대로 랩 VM에서 사용하는 가상 네트워크에 NSG(네트워크 보안 그룹)를 추가합니다. 예를 들어 NSG에서는 게이트웨이를 먼저 통과하는 트래픽만 랩 VM에 도달하도록 허용할 수 있습니다. 규칙 원본은 게이트웨이 팜에 대한 게이트웨이 컴퓨터 또는 부하 분산 장치의 IP 주소입니다.