윈도우 10 + 리눅스 서브시스템(WSL) + Let’s Encrypt 조합으로 원격 데스크톱(RDP) 인증서 적용하기

윈도우 10의 원격 데스크톱, 흔히 RDP(Remote Desktop Protocol)라고 부르는 서비스는 원격에서 윈도우를 관리하기에 딱 좋은 도구입니다.

이 RDP에는 기본적으로 RDP 보안이 지원된다고 합니다만, 인증서 없이는 보안이 완벽치 않은 것은 물론, 매번 원격 데스크톱에 접속하려고 하면 뜨는 찜찜한 화면이 늘 우리를 거슬리게 합니다.

[ 화면은 다를 수 있으나 대략 이런 느낌…ㅠㅠ ]

인증서를 이용한 TLS 보안을 이용하기 위해서는 유효하다고 판단되는 인증서가 있어야 합니다만, 그저 RDP 보안을 위해서 인증서를 발급받는 것은 불필요한 일입니다.

비교적 SSL 인증서 값이 저렴한 PositiveSSL도 무려 1년에 8달러, 만원의 비용을 내야 합니다. ㅠㅠ

하지만 무료로 SSL 인증서를 제공해주는 Let’s Encrypt를 활용하면, 적합한 인증서를 사용하여 RDP를 이용하는 것도 꿈만은 아닙니다. 다만 Let’s Encrypt를 RDP에 이용하기 위해서는 몇 가지 제약이 있습니다.

  1. Let’s Encrypt의 인증서는 발급받고 유효기간이 3개월(90일)입니다. 따라서 90일마다 새로운 인증서로 갱신해 줘야 하는데,
  2. Let’s Encrypt 사용의 자동화를 위해 사용되는 certbot은 윈도우용 버전이 존재하지 않습니다.

따라서 우리는 다소의 불편함을 겪으면서도 RDP에서 인증서를 이용하여 보안을 이용하기 위해서는, 조금 복잡한 과정을 거쳐야 함을 알 수 있습니다.

본 글에서는 윈도우 10과 최근 지원되기 시작한 리눅스 서브시스템(WSL; Windows Subsystem for Linux), 그리고 우분투와 certbot을 활용하여 이 과정을 최대한 자동화 해 보려고 합니다.

이것이 완벽한 해결책은 되지는 못하겠지만, 여러분들의 새로운 생각에 도움이 되기를 바랍니다.

<준비물>

  • 윈도우 10이 설치된 컴퓨터, 물론 RDP 사용을 위해서는 Windows 10 Pro 또는 그에 준하는 등급이 필요합니다.
  • 개인 소유의 도메인(IP만 가지고 있는 분들은 SSL 인증서 발급이 불가합니다.)
  • 도메인이 연결되어 있는 DNS 서비스(예: CloudFlare, Route 53 등등…), DNS 서비스에서 TXT 레코드 추가가 필요합니다.

(과정 1) 리눅스 서브시스템 설치

리눅스 서브시스템은 Microsoft Store에서 설치가 가능합니다.

Microsoft Store에 접속하여 “linux”로 검색을 해보면, WSL을 설치할 수 있는 화면이 나타납니다.

저는 제 작업의 편의를 위해 Ubuntu를 설치하겠습니다. 여러분들도 만약에 저의 스크립트를 사용하시기 위해서는 Ubuntu를 설치하셔야 합니다.

설치를 하면 Ubuntu가 시작 메뉴에 나타나는데, 실행을 하게 되면 아래와 같은 에러가 나타날 수도 있습니다.

만약에 아래와 같은 에러가 발생한다면, 다음과 같이 조치해 주세요.

  1. 왼쪽 하단의 시작 버튼을 Shift 키를 누른 채로 오른쪽 클릭하여, 파워쉘을 관리자 권한으로 실행합니다.
  2. 다음과 같이 명령어를 입력합니다.
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

# (출처) https://aka.ms/wslinstall
[ Shift 키를 누른 채 시작 버튼을 오른쪽 클릭하면, PowerShell을 관리자로 실행할 수 있습니다. ]

재부팅을 하시면 성공적으로 리눅스 서브시스템을 만나보실 수 있습니다.

(과정 2) 리눅스에 certbot 설치 후 Let’s Encrypt 인증서 발급받기

Certbot 설치를 위하여 다음과 같은 단계를 밟아주세요.
현재 2019년 10월 26일, Ubuntu 18.04 LTS 기준으로 글을 작성하였으나, 설치 방법이 바뀌는 경우 다음 링크를 통해 확인해 주세요.
https://certbot.eff.org/lets-encrypt/ubuntubionic-other

다음과 같은 순서대로 설치해 주세요.

sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install software-properties-common
# (위 명령은 실행하여도 이미 설치되어 있다고 할 수 있으나,
# 뒤 명령에 필수적으로 필요하여 일단 추가합니다.)
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update

위의 과정이 끝나면 아래와 같이 certbot을 설치합니다.

sudo apt-get install certbot

설치를 하였다면 이제 도메인의 인증서 발급을 받아봅시다.
자신이 RDP 사용을 위해 사용하고자 하는 도메인을 정확히 해 주세요.
(예: 여기에서는 rdp.mydomain.net 으로 하겠습니다.)

아래 명령어에서 도메인 이름(rdp.mydomain.net)을 변경하여 명령어를 실행합니다.

certbot certonly --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory -d rdp.mydomain.net

몇 가지 질문이 아래처럼 나올 수 있으므로 적절하게 응답하여 주세요.

질문이 끝나면 아래처럼 지정된 도메인의 TXT 레코드에 아래 해시 코드를 추가하라는 알림을 볼 수 있습니다.

DNS에 TXT 레코드 추가를 위하여 각자 도메인 관리를 위해 사용하는 시스템에 들어갑니다. 저는 AWS의 Route 53를 활용중이므로 Route 53을 기준으로 설명하겠습니다. 다른 도메인 관리 시스템도 거의 비슷합니다.

도메인 관리 시스템에 들어가서 새로운 레코드 생성을 추가하여,
도메인을 _acme-challenge.rdp.mydomain.net (자신의 도메인이 들어갑니다.)으로,
타입은 TXT로, 값은 certbot에서 지정해 준 값으로 입력합니다.

나머지는 기본값으로 저장하시고, 5분 정도 기다리시면(기다리실 동안 리눅스 창을 절대 끄지 마세요.) 보통은 DNS TXT값이 설정이 됩니다.

설정이 된 것 같으면(DNS가 정상적으로 적용되었나 확인을 위해서 nslookup을 이용하셔도 됩니다.) certbot에서 엔터를 입력합니다. 정상적으로 되었다면 아래와 같은 화면을 보실 수 있습니다.

정상적으로 완료되었다면 다음 단계로 넘어갑니다.

(과정 3) Renew(유효기간 만료 전 갱신) + 윈도우 시스템으로 인증서 가져오는 스크립트 만들기

이제 만들어진 인증서를 윈도우에서 이용하기 위해 쉘 스크립트를 하나 만들려고 합니다. 일단 홈 유저 디렉토리로 이동합니다.

cd ~

이동 후, 아래 명령어를 입력하여(nano 편집기를 이용합니다만 개인 취향에 따라 자유롭게 편집기를 이용하세요.) renew.sh 를 만듭니다.

nano renew.sh

아래와 같은 내용을 자신의 상황에 맞게 편집하고 Ctrl + X를 누르고, y를 눌러 저장해 주세요.

#!/bin/bash

# certbot 인증서 갱신 스크립트입니다.
certbot renew

# 아래 도메인을 자신의 도메인으로 바꿔주세요.
Domain="rdp.mydomain.net"
# 아래 유저네임은 윈도우 사용자 폴더의 이름입니다.
# 예를 들어, C:\Users\gomgom 이 내 사용자 폴더라면, 아래에 gomgom을 입력해 주세요.
UserName="gomgom"
Directory="/mnt/c/Users/${UserName}"
# 비밀번호는 본인이 원하는 것으로 수정하신 뒤 사용하시면 됩니다.
PassCode="abcd^1234"

# Change working directory.
cd /etc/letsencrypt/live/$Domain

# Make pfx certificate.
openssl rsa -in privkey.pem -text > RDP.key
openssl x509 -inform PEM -in fullchain.pem -out RDP.crt
openssl pkcs12 -export -in RDP.crt -inkey RDP.key -out RDP.pfx -passout pass:$PassCode
rm -rf RDP.key
rm -rf RDP.crt
mv /etc/letsencrypt/live/$Domain/RDP.pfx $Directory

# (참고 출처) https://www.dazzii.com/windows-원격데스크톱-ssl-적용/

편집을 하고 아래와 같이 스크립트를 실행하여 잘 실행되는지 확인합니다. 실행이 올바르게 이루어 졌다면 자신의 사용자 폴더에 RDP.pfx 파일이 생성되 있을 것입니다.

sudo bash renew.sh
[ 다음과 같이 RDP 파일이 생성되어 있다면 스크립트가 잘 작동한 것입니다. ]

이 스크립트는 앞으로 매번 이용하게 될 스크립트이므로 삭제하지 말아주세요.

(과정4) 사용자 폴더에 리눅스 스크립트를 실행한 뒤 RDP에 인증서를 적용해주는 PowerShell 스크립트 만들기

이제 마지막 단계입니다. 처음에 RDP에 이번에 만든 SSL 인증서도 적용해주고, 3개월마다 갱신이 필요할 때마다 실행하면 자동으로 인증서로 갈아 치워주는 파워쉘 스크립트를 만듭니다. 이 스크립트는 아까 만든 pfx 파일이 있는 폴더에 있어야 하며, 늘 관리자 권한으로 실행하셔야 합니다.

메모장을 실행한 뒤에 아래 스크립트를 주석을 확인하며 수정하고 붙여넣어 줍니다. 그 다음 Renew.ps1로 파일을 사용자 폴더에 저장해 주세요.

# 여기에는 우분투 시스템을 처음 설정하실 때 만든,
# 관리자 아이디와 비밀번호를 넣어 주세요. (인증서 비밀번호가 아닙니다!)
$UbuntuID = "ubuntu"
$UbuntuPassword = "my@ubuntu@pass"

wsl echo $UbuntuPassword `| sudo -S bash /home/$UbuntuID/renew.sh

# 여기에는 리눅스에서 인증서 비밀번호로 사용하시기로 한 비밀번호 입력해주세요.
$Passcode = "abcd^1234"
# 여기에는 사용하시는 도메인을 넣어주세요.
$Domain = "rdp.mydomain.net"
# 아래 유저네임은 윈도우 사용자 폴더의 이름입니다.
# 예를 들어, C:\Users\gomgom 이 내 사용자 폴더라면, 아래에 gomgom을 입력해 주세요.
$UserName="gomgom"

# Delete certificate of any other
$DeleteCommand = "certutil -delstore MY `"$Domain`""
Invoke-Expression $DeleteCommand

# Install pfx file in computer.
certutil -p $passcode -importPFX C:\Users\$UserName\RDP.pfx

# Get fingerprint of certificate.
$NameValue = "CN=$Domain"

$GotFingerprint = Get-ChildItem -path cert:\LocalMachine\My | Where-Object -Property Subject -eq -Value "$NameValue" | Select -ExpandProperty Thumbprint -first 1

$RDPCommand = "wmic /namespace:\\root\cimv2\TerminalServices PATH Win32_TSGeneralSetting Set SSLCertificateSHA1Hash=`"$GotFingerprint`""
Invoke-Expression $RDPCommand
[ 잘 저장하셨다면 이렇게 저장이 되어 있습니다. ]

이제 이 파일을 관리자 권한으로 실행하는 간단한 배치파일을 만들어야 합니다. (관리자 권한으로 PowerScript를 실행할 수 있는 다른 방법을 아시는 분은 댓글 남겨주시면 수정하겠습니다.) 메모장을 열고 아래와 같이 입력합니다.

:: 아래 "gomgom"이라고 되어 있는 부분을, 자신의 사용자 이름으로 바꿔주세요.
Powershell.exe -noprofile -executionpolicy bypass -File "C:\Users\yeong\ReNew.ps1"

@echo off
:: (이하 스크립트 참고 출처)
:: http://mwultong.blogspot.com/2006/09/yes-no-choice-dos-windows-batch-file.html
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:LOOP
echo.
set /p YN=RDP 인증서 적용을 위해 시스템 재부팅이 필요합니다. 재부팅 하시겠습니까(Y/N)?

if /i "%YN%" == "y" goto YES
if /i "%YN%" == "n" goto NO

goto LOOP
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:YES
shutdown /r /t 0
goto QUIT

:NO
echo NO
goto QUIT

:QUIT

이 파일은 역시 같은 경로에 ReNewStarter.bat(예시입니다. 확장자는 bat여야 합니다.)로 저장합니다. 저장한 배치파일을 오른쪽을 눌러 관리자 권한으로 실행을 하시면 스크립트가 잘 작동하는 것을 확인할 수 있습니다.

이제 갱신이 필요하실 때마다 스크립트를 실행하시면 됩니다. 여기까지 따라오시느라 고생 많으셨습니다. 실제 RDP로 접속해보면, 다음과 같이 자물쇠가 걸려있는 것을 볼 수 있습니다.

마치며…

긴 글 과정 따라오시느라 고생 많으셨습니다. 앞으로는 3개월에 한 번 씩 이 스크립트를 관리자 권한으로 실행시켜 주시면 됩니다.

혹시 스크립트를 수정하여 배포하시고 싶으신 분들은 출처만 꼭 밝혀서(^^;) 자유롭게 수정하시고 사용해 주시면 감사하겠습니다.
궁금하신 점도 댓글로 남겨주시면 자주 확인하겠습니다. ^^

< 기타 추가 사항 >

  1. 혹시 인증서 적용 후 RDP 접속이 불가능해진 경우, 시스템(컴퓨터 오른쪽 – 속성) -> 고급 시스템 설정 -> 원격 -> 원격 데스크톱에서 네트워크 수준 인증을 사용하여 원격 데스크톱을 실행하는 컴퓨터에서만 연결 허용(권장) 체크를 해제해 주세요. 이유는 모르겠으나 체크 해제 후 재부팅 한 뒤, 다시 체크를 하면 연결이 되는 것 같습니다.

gomgom

무엇을 하든 곰곰히 생각하는 곰곰입니다.

You may also like...

1 Response

  1. 이윤찬 댓글:

    최근에 설정한 원격 데스크탑 이용하다가 보안 인증서 유효하지 않다고 계속 떠서 신경쓰였는데 이 포스트 보고 완벽히 구축했습니다. 고맙다는 말씀 전합니다. 꼼꼼하게 잘 쓰셨는데 우분투 renew.sh 파일 적용하는 과정에서 제 윈도우즈10 로그인 계정 이름을 앞뒤로 도치해 잘못 기입하는 바람에 버그 찾느라 이삼일간 테스트하고 아주 생쇼를 했습니다. ^^;

    어떻게 이런 글을 작성하셨는지 그저 놀라울 따름이고 다른 많은 분들한테 굉장한 도움이 될 것 같습니다. 정말 수고 많이 하셨습니다. 흔하지 않은 정보라 다시한번 감사의 말씀 전합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다