Secure Remote Desktop Connections with Certificates

Hallo zusammen,

Ich habe mich kürzlich mit den Remote Desktop Zertifikaten bschäftigt. Wenn man eine interne Certificate Authority (CA) hat, so ist der Empfohlene Weg in der CA ein neues Zertifikatstemplate anzulegen und dieses mit einer GPO beispielsweise an die Server zu verteilen.

Using certificates in Remote Desktop Services
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/dn781533(v=ws.11)

Eine gute Zusammenfassung der möglichen Szenarien gibt es hier

Remote Desktop Connection (RDP) - Certificate Warnings
https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/remote-desktop-connection-rdp-certificate-warnings/ba-p/259301

Ich gehe hier aber mal noch einen anderen weg. Schauen wir uns erstmal die Default Konfiguration an.

Grundlagen

Bei der Installation wird ein Self Signed Zertifikat angelegt und im Zertifikatsspeicher unter Local Computer\Remote Desktop\Certificates abgelegt.

Der Hash des SelfSigned Certificates ist auch unter dem folgenden Registry Key abgespeichert

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations

Das ganze kann man auch über WMI abfragen

Get-WmiObject -Class "Win32_TSGeneralSetting" -Namespace root\cimv2\terminalservices | select SSLCertificateSHA1Hash

Ich habe jedoch schon ein Server Certificate mit dem FQDN in meinem Local Computer Certification Store.

Schauen wir uns mal den Thumbprint genauer an

Auch mit PowerShell lassen sich die Zertifikate im Local Machine Zweig anschauen

Get-ChildItem -Path Cert:LocalMachine\MY

Nun nutzen wir den Thumbprint um dieses Zertifikat per WMI dem RDP Service zuzuweisen

$Thumbprint = "AE2A88F63D93F7963767673EBAFFF0A2DC5D7CF9"
$path = (Get-WmiObject -class "Win32_TSGeneralSetting" -Namespace root\cimv2\terminalservices -Filter "TerminalName='RDP-tcp'").__path
$Path
Set-WmiInstance -Path $path -argument @{SSLCertificateSHA1Hash="$Thumbprint"}

Das Zertifikat ist nun auch in der Registry hinterlegt

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp

Schaut man sich an, wer den Private Key lesen darf, ist danach auch der Network Service mit "Read" Berechtigung drin (das war vorher nicht der Fall - habe ich extra geprüft). Weil ja der Remote Desktop Service mit unter dem Network Service Account läuft.

Das ganze wird auch hier beschrieben

Remote Desktop listener certificate configurations
https://docs.microsoft.com/en-us/troubleshoot/windows-server/remote/remote-desktop-listener-certificate-configurations

In den Remote Desktop Settings

Sollte unbedingt Network Level Authentication (NLA) aktiviert sein.

Fügt man einen Benutzer zu den Remote Desktop Users hinzu

So landet der in der lokalen "Remote Desktop Users" Gruppe. Administratoren haben per Default RDP zugriff.

Nun muss noch der RDP Service neu gestartet werden. Aber Achtung: Das trennt die RDP Verbindung

Get-Service -Name TermService
Get-Service -Name TermService | Restart-Service -Force

RDP Client

Nun Verbinde ich mich mit dem RDP Client und dem FQDN auf den Server

Ach ja, in den Advanced Settings sollte die Server Authentication Warnung aktiviert sein

Man sieht nun mit dem Schloss, dass die Verbindung gesichert ist.

Klickt man auf das Schloss, so sieht man dass der Computer über Kerberos authentifiziert wurde.

Verbinde ich mich mit der IP

erhalte ich eine Zertifikatswarnung. Aber man sieht, dass das Zertifikat verwendet wird, welches ich ausgewählt und dem Service zugewiesen habe.

Verbinde ich mich trotzdem, so fehlt das Schloss in der Verbindung

Liebe Grüsse
Andres Bohren