원격 데스크톱의 기본 세션 설정은 다음 키에 있다.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
접속이 안 될 때 이 키의 SecurityLayer 와 UserAuthentication 을 낮춰 두고 그대로 운영하는 사례가 많아 두 값의 의미를 정리한다.
서버와 클라이언트가 어떤 방식으로 연결을 보호할지 정한다.
| 값 | 의미 |
|---|---|
| 0 | RDP 보안 계층. 연결 자체를 RDP 프로토콜 수준에서만 보호하며 서버 인증이 없다 |
| 1 | 협상(Negotiate). 클라이언트가 TLS 를 지원하면 TLS 를, 아니면 RDP 보안 계층을 쓴다 |
| 2 | TLS 전용. 인증서로 서버를 검증하며 지원하지 않는 클라이언트는 연결되지 않는다 |
네트워크 수준 인증(Network Level Authentication)을 쓸지 정한다.
| 값 | 의미 |
|---|---|
| 1 | NLA 사용. 세션을 만들기 전에 자격 증명을 검증한다 |
| 0 | NLA 미사용. 먼저 세션을 만들고 그 안에서 로그온 화면을 보여 준다 |
NLA 는 CredSSP 를 쓰므로 SecurityLayer 가 2(또는 협상 결과 TLS)여야 정상 동작한다. UserAuthentication=1 인데 SecurityLayer=0 인 조합은 성립하지 않는다.
접속 오류를 피하려고 흔히 쓰는 조합이지만 결과는 다음과 같다.
TLS 를 지원하지 않는 오래된 클라이언트도 붙을 수 있게 된다. 이 경우 서버 인증이 없으므로 중간자 공격을 막지 못하고, 암호화도 RDP 자체 방식으로 내려간다.
NLA 를 끄면 인증 전에 세션이 만들어진다. 인증되지 않은 연결이 서버 자원을 쓰게 되므로 무차별 대입과 서비스 거부에 노출되고, 인증 전 단계의 취약점(대표적으로 BlueKeep, CVE-2019-0708)에 그대로 노출된다.
이벤트 로그에도 인증 이전 세션 생성 기록이 늘어 추적이 어려워진다.
SecurityLayer = 2
UserAuthentication = 1
PowerShell 로 조회하고 변경한다. 변경 후에는 원격 데스크톱 서비스를 다시 시작하거나 재부팅한다.
$k = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'
Get-ItemProperty -Path $k | Select-Object SecurityLayer, UserAuthentication
Set-ItemProperty -Path $k -Name SecurityLayer -Value 2
Set-ItemProperty -Path $k -Name UserAuthentication -Value 1
도메인 환경이라면 레지스트리를 직접 고치는 대신 그룹 정책을 쓴다. 정책이 우선하므로 레지스트리만 바꿔 놓으면 정책 갱신 때 되돌아간다.
컴퓨터 구성 → 관리 템플릿 → Windows 구성 요소 → 원격 데스크톱 서비스
→ 원격 데스크톱 세션 호스트 → 보안
NLA 를 끄기 전에 원인을 확인한다. 대부분은 CredSSP 버전 불일치, 클라이언트의 TLS 설정, 만료된 서버 인증서, 시간 차이 때문이다. 원인을 고치면 보안 설정을 낮추지 않아도 된다.