Wer einen Linux-Server fernsteuert, nutzt in den meisten Fällen SSH zur sicheren Kommunikation. Unter Windows war dies bis zuletzt nur durch Installation zusätzlicher Software möglich. Windows 10 und Windows Server 2019 bringen jedoch in der jeweils aktuellsten Ausgabe Unterstützung für SSH von Hause aus mit. Dieser Blog-Artikel zeigt Euch, wie Ihr SSH unter Windows nutzen könnt.
Einführung
Secure Shell (SSH) ist ein Netzwerkprotokoll zum sicheren Fernsteuern von Netzwerkdiensten über ein unsicheres Netzwerk (z.B. das Internet). Typische Applikationen, die SSH unterstützen, sind Kommandozeilenwerkzeuge (z.B. Putty) sowie spezielle Administrationswerkzeuge (z.B. pgAdmin). SSH ist für viele Administratoren der präferierte Weg zum Fernsteuern von Linux-Computern. Da ein Linux-Server in der Regel keine GUI besitzt, muss mit der Kommandozeile gearbeitet werden, SSH verlagert die Eingabe und Ausgabe dabei auf Deinen lokalen Rechner.
Seit dem April 2018-Update von Windows 10 (Version 1803) kann per Kommandozeile eine SSH-Verbindung zu einem entfernten SSH-Server aufgebaut werden. Parallel zu Windows 10 hat auch der Windows Server 2019 einen SSH-Serverdienst spendiert bekommen, so dass eine Fernwartung in einer modernen Windows-Umgebung komplett per SSH erfolgen kann.
Windows 10 bzw. 2019 nutzen eine spezielle Version von OpenSSH. OpenSSH ist eine Sammlung von Server- und Client-Komponenten zum Aufbau einer SSH-Infrastruktur.
OpenSSH hat seine Wurzeln in der Unix-Welt und war bis vor kurzem nicht kompatibel mit Windows. Microsoft entwickelt deshalb mit Portable OpenSSH eine an Windows angepasste Version von OpenSSH, die auf einem Fork des Originalquellcodes basiert. Das langfristige Ziel ist, den Code mit der offiziellen Version wieder zu vereinigen.
OpenSSH-Server unter Windows 2019
Standardmäßig ist der OpenSSH-Server unter Windows Server 2019 nicht installiert. Es gibt zwei Wege dies nachzuholen:
-
Eine Installation als Windows-Feature. Dieser vermeintlich einfache Weg ist nicht zu empfehlen, da die installierte Version von OpenSSH nicht die aktuellste ist (siehe dazu auch folgendes GitHub-Issue).
-
Eine manuelle Installation der aktuellsten Version direkt von GitHub. Diesen Weg werden wir im Folgenden ausführlich betrachten. Er funktioniert auch unter Windows 2016.
Und so geht’s:
-
Lade Dir das aktuellste Release von GitHub herunter.
-
Entpacke das Zip-Archiv nach
C:\Program Files\OpenSSH
. -
Öffne die PowerShell-Konsole als Administrator und wechsle in den OpenSSH-Ordner:
cd "C:\Program Files\OpenSSH"
-
Starte das Installationsskript:
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
-
Zum Konfigurieren der Windows-Firewall führe folgenden PowerShell-Befehl aus:
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
-
Damit der OpenSSH-Dienst nach jedem Neustart des Windows-Servers automatisch mit gestartet wird, führe folgenden PowerShell-Befehl aus:
Set-Service sshd -StartupType Automatic
-
Startet den OpenSSH-Dienst mit folgendem PowerShell-Befehl:
Start-Service sshd
Der OpenSSH-Server ist jetzt als Windows-Dienst unter Windows Server 2019 installiert. Dabei wurden automatisch unter c:\ProgramData\ssh
Host-Schlüssel und Konfigurationsdatei erzeugt.
Noch ein letzter PowerShell-Befehl:
Get-ChildItem c:\ProgramData\ssh\ssh_host_*_key | ForEach-Object { ssh-keygen -l -f $_ }
Dir werden jetzt alle öffentlichen Key Fingerprints (Schlüssel-Fingerabdrücke) des OpenSSH-Servers aufgelistet.
Beim Erstzugriff eines OpenSSH-Clients wird Dir ebenfalls ein Key Fingerprint angezeigt, und Du wirst gefragt, ob es sich beim angefragten Computer auch wirklich um den gewünschten SSH-Server handelt. Um diese Frage zu beantworten, muss der ausgewiesene Key Fingerprint mit einem der hier aufgelisteten Key Fingerprints übereinstimmen.
Dein Windows Server 2019 ist jetzt bereit und kann auf SSH-Anfragen antworten. Bitte achte darauf, dass bei Einsatz einer externen Firewall der TCP-Port 22
freigeschaltet ist.
Natürlich kann man SSH unter Windows 2019 weiter konfigurieren. Weitere Infos in der Manpage für sshd_config.
OpenSSH-Client unter Windows 10
Der OpenSSH-Client unter Windows 10 (ab Version 1803) ist standardmäßig installiert und kann sofort genutzt werden. Genau das machen wir jetzt auch und versuchen unseren soeben konfigurierten Windows Server per SSH zu erreichen.
Wir gehen dabei von folgender Konfiguration aus (alles nur Beispieldaten, die es real so nicht gibt):
Server:
- DNS-Name: myserver.beispiel.de
- Benutzername des Administrators: frank
Client:
- DNS-Name: myhost
- Benutzername: frank
Authentifizierung mit Kennwort
Öffne auf Deinem Windows 10-Rechner die Windows-Kommandozeile und tippe folgendes ein:
ssh frank@myserver.beispiel.de
Beim ersten Start wird der Key Fingerprint des Servers angezeigt, und Du wirst gefragt, ob Du dich wirklich mit diesem Server verbinden möchtest.
The authenticity of host 'myserver.beispiel.de (159.69.60.4)' can't be established.
ECDSA key fingerprint is SHA256:CxIuAEc3SZThY9XobrjJIHN61OTItAU0Emz0v/+15wY.
Are you sure you want to continue connecting (yes/no)?
Du solltest zunächst überprüfen, ob der angezeigte Key Fingerprint auch wirklich von Deinem Server stammt (siehe vorherigen Abschnitt). Bestätige anschließend mit yes
und der Server wird in die lokale Liste der bekannten Rechner eingetragen. Diese Abfrage siehst Du nur beim aller ersten Zugriff auf Deinen Windows Server.
Anschließend wirst Du nach dem Kennwort des Benutzers frank
auf dem Server myserver.beispiel.de
gefragt. Tippe es ein und Du hast Fernzugriff auf Deinen Server.
Der OpenSSH-Client speichert die Liste der bekannten Rechner (Known Hosts) in einer Textdatei. Du kannst Sie Dir mit folgendem Befehl anzeigen lassen:
notepad "%USERPROFILE%\.ssh\known_hosts"
Authentifizierung mit SSH-Schlüssel
Hierbei musst Du einmalig ein Schlüsselpaar mit einem privaten und einem öffentlichen Schlüssel generieren. Der öffentliche Schlüssel wird auf dem SSH-Server hinterlegt, der private Schlüssel bleibt auf Deinem lokalen Rechner. Die Authentifizierung erfolgt nun durch das Versenden eines mit dem öffentlichen Schlüssel kodierten Datenpakets vom SSH-Server zum SSH-Client, der dieses mit seinem privaten Schlüssel wieder dekodieren muss. Ist die Dekodierung erfolgreich, bist Du authentifiziert.
Ein Schlüsselpaar erzeugen
Öffne auf Deinem Windows 10-Rechner die Windows-Kommandozeile und tippe folgendes ein:
cd %USERPROFILE%\.ssh\
ssh-keygen -t ed25519
Du bekommst folgende Meldung angezeigt:
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\frank/.ssh/id_ed25519):
Bestätige mit der Eingabetaste
.
Jetzt wirst Du gefragt, ob Du ein Kennwort zum Absichern Deines privaten Schlüssels definieren möchtest. Dies ist dringend zu empfehlen.
Enter passphrase (empty for no passphrase):
Das einmal eingegebene Kennwort musst Du zur Sicherheit noch einmal wiederholen:
Enter same passphrase again:
Jetzt wird ein neues Schlüsselpaar generiert und eine Meldung wie diese erscheint in Deiner Kommandozeile:
Your identification has been saved in C:\Users\frank/.ssh/id_ed25519.
Your public key has been saved in C:\Users\frank/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:7KMZvJiITZ+HbOyqjNPV5AeC5As2GSZES5baxy1NIe4 myhost@Frank
The key's randomart image is:
+--[ED25519 256]--+
|E ..o=*o.+o |
|. .oo+oo... |
|.... o=.. |
| o+. o = |
|o .oo ooS. |
|* ...+o oo |
|oo.. o+o+o |
| . o+o+o |
| .o.. |
+----[SHA256]-----+
Die Meldung bedeutet, dass in der Datei C:\Users\frank\.ssh\id_ed25519
der private Schlüssel und in der Datei C:\Users\frank\.ssh\id_ed25519.pub
der öffentliche Schlüssel gespeichert wurde.
Den öffentlichen Schlüssel für Administratoren verteilen
Der private Schlüssel ist privat und darf unter keinen Umständen veröffentlicht werden. Der öffentliche Schlüssel muss jedoch dem Windows Server bekanntgemacht werden. Als Server-Administrator musst Du die Datei
%USERPROFILE%\.ssh\id_ed25519.pub
von Deinem lokalen Windows 10-Computer kopieren und auf dem Windows Server unter dem neuen Pfad
c:\ProgramData\ssh\administrators_authorized_keys
ablegen (Achtung: Zieldatei hat keine Dateiendung).
Ganz wichtig ist, der Datei administrators_authorized_keys
die passenden Zugriffsrechte zu erteilen. Dazu die PowerShell-Konsole als Administrator öffnen und folgende Befehlssequenz ausführen:
$acl = Get-Acl C:\ProgramData\ssh\administrators_authorized_keys
$acl.SetAccessRuleProtection($true, $false)
$administratorsRule = New-Object system.security.accesscontrol.filesystemaccessrule("Administrators","FullControl","Allow")
$systemRule = New-Object system.security.accesscontrol.filesystemaccessrule("SYSTEM","FullControl","Allow")
$acl.SetAccessRule($administratorsRule)
$acl.SetAccessRule($systemRule)
$acl | Set-Acl
Diese Befehle haben folgende Bedeutung: Zunächst werden die Zugriffsregeln der Datei vor Vererbung geschützt, anschließend werden der Administratoren-Gruppe sowie dem lokalen Systemkonto volles Zugriffsrecht auf die Datei gewährt. Standardbenutzer haben also keinen Zugriff (siehe nächsten Abschnitt).
Sollte die Datei administrators_authorized_keys
schon existieren, musst Du den Inhalt aus id_ed25519.pub
als neue Zeile in diese Datei anfügen
Bei einer Authentifizierung per SSH-Schlüssel sollte die Authentifizierung per Kennwort unterbunden werden. Andernfalls läuft der sicherheitstechnische Vorteil des SSH-Schlüssels ins Leere. Öffne dazu die folgende Datei in einem Texteditor Deiner Wahl:
C:\ProgramData\ssh\sshd_config
Dort ändere die Zeile
# PasswordAuthentication yes
ab in
PasswordAuthentication no
Speichere die Konfigurationsdatei und starte den OpenSSH-Serverdienst neu. Tippe dazu in der PowerShell-Konsole folgenden Befehl ein:
Restart-Service sshd
Den öffentlichen Schlüssel für Standardbenutzer verteilen
Für Standardbenutzer unter Windows 2019 gilt im Wesentlichen das gleiche wie für Mitglieder der Administratorengruppe, nur dass der öffentliche Schlüssel woanders abgelegt werden muss. Als Standardbenutzer musst Du die Datei
%USERPROFILE%\.ssh\id_ed25519.pub
von Deinem lokalen Windows 10-Computer kopieren und auf dem Windows Server unter dem neuen Pfad
%USERPROFILE%\.ssh\authorized_keys
ablegen (Achtung: Zieldatei hat keine Dateiendung). Existiert das Verzeichnis C:\Users\frank\.ssh
nicht, musst Du es zunächst anlegen:
New-Item -ItemType directory -Path %USERPROFILE%\.ssh
Testen
Öffne auf Deinem Windows 10-Rechner die Windows-Kommandozeile und tippe folgendes ein:
ssh frank@myserver.beispiel.de
Du wirst nun nach dem Kennwort Deines privaten Schlüssels gefragt.
Enter passphrase for key 'C:\Users\frank/.ssh/id_ed25519':
Tippe es ein, und Du hast Fernzugriff auf Deinen Server.
Kennwort oder SSH Schlüssel?
Die meisten Tutorials empfehlen den SSH-Schlüssel als sicherste Alternative. Bei dieser Methode verlässt der SSH-Schlüssel nicht Deinen Rechner, kann also weder abgefangen noch durch einen Brute-Force-Angriff erraten werden. Dies setzt allerdings voraus, dass Dein Client-Computer abgesichert ist und auch bei einem Diebstahl nicht sofort geknackt werden kann, denn der private SSH-Schlüssel ist dort dauerhaft gespeichert. Es wird daher dringend empfohlen, den privaten SSH-Schlüssel mit einem starken Kennwort zu schützen.
SFTP
Bei der Arbeit mittels SSH kommt man schnell zu dem Punkt, wo man sich einen grafischen Datei-Manager wünscht. Genau hier kommt ein weiteres Netzwerkprotokoll ins Spiel: Das Secure File Transfer Protocol (kurz SFTP).
SFTP dient zur sicheren Dateiübertragung über SSH und wird von den gängigen Datei-Managern unter Windows unterstützt. Zwei wunderbare Open-Source-Beispiele wären:
Eine Installation auf Serverseite ist nicht nötig. SFTP ist mit der Installation von OpenSSH unter Windows 2019 bereits freigeschaltet und kann sofort genutzt werden.
Wenn Du es genauer wissen möchtest, kannst Du noch einmal einen Blick in die SSH-Konfigurationsdatei C:\ProgramData\ssh\sshd_config
werfen. Dort findest Du folgenden Eintrag:
# override default of no subsystems
Subsystem sftp sftp-server.exe
Natürlich kann man auch SFTP unter Windows 2019 weiter konfigurieren. Weitere Infos in der Manpage für sshd_config.
Fazit
OpenSSH unter Windows 10 bzw. Windows Server 2019 ist eine prima Sache. Dieser Blog-Artikel hat hoffentlich Lust gemacht, mit OpenSSH unter Windows zu experimentieren. Er deckt aber bei weitem nicht alle Aspekte von OpenSSH ab. So kann beispielsweise auch mit PowerShell 7 über SSH kommuniziert werden. Auch habe ich die Nützlichkeit des Werkzeugs ssh-agent aus Gründen der Kompaktheit unterschlagen.
Artikelhistorie
- 12.11.2019
- Erstveröffentlichung
- 05.02.2021
- Komplette Überarbeitung