Tags: SSH, Windows 10, PowerShell
Mit der Portierung von PowerShell Core auf Linux und MacOS stellt Microsoft für das Remoting auf SSH um. Windows 10 1709 enthält bereits Client und Server von OpenSSH als optionales Feature. Der SSH-Server ist nach seiner Aktivierung jedoch nicht einsatzbereit und muss erst manuell konfiguriert werden.
Update: Die hier beschriebene manuelle Konfiguration des SSH-Servers gilt noch für Windows 10 bis 1709 und Server 2016. Das Vorgehen bei Windows 10 ab 1803 und Server 2019 zeigt diese neue Anleitung.
In der Vergangenheit musste man für SSH unter Windows auf Tools wie PuTTY zurückgreifen, weil das Betriebssystem dafür keine Unterstützung bot. Aber im Zuge der neuen Multiplattform-Strategie portierte Microsoft nicht nur PowerShell auf andere Systeme, sondern umgekehrt auch OpenSSH auf Windows.
OpenSSH als optionales Feature in Windows 10
In Windows 10 1709 ist es bereits als Feature enthalten, wenn auch als Beta.
Zuständig ist dafür die App Einstellungen, wo man unter Apps dem Link Optionale Features verwalten folgt. Dort klickt man auf Features hinzufügen und wählt hier je nach Bedarf OpenSSH Client bzw. OpenSSH Server aus. Auch wenn Windows anschließend nach keinem Neustart verlangt, so ist man gut beraten, den Rechner trotzdem neu zu booten.
Zieht man PowerShell vor, dann installiert man das Feature folgendermaßen:
Add-WindowsCapability -Online -Name OpenSSH*
Möchte man nur den Client hinzufügen, dann gibt man OpenSSH.Client* für den Parameter Name an, und OpenSSH.Server*, falls es nur der Server sein soll.
Unkomplizierter Client
Der SSH-Client sollte sich nun problemlos nutzen lassen. Die Syntax entspricht jener der Linux-Version und lässt sich über den Aufruf von ssh.exe ohne Parameter anzeigen. Als normales Konsolenprogramm steht es unter der Eingabeaufforderung oder Windows PowerShell zur Verfügung.
Ganz und gar nicht so unkompliziert gestaltet sich die Inbetriebnahme des SSH-Servers. Dieser läuft als Service, dessen Starttyp als automatisch konfiguriert ist. Sieht man in services.msc nach, dann wird man schnell feststellen, dass sshd nicht läuft.
Startet man ihn manuell, dann erhält man Meldungen wie Fehler 1607: Der Prozess wurde unerwartet beendet. Der Grund dafür liegt schlicht darin, dass der OpenSSH-Server erst konfiguriert werden muss.
sshd konfigurieren
Im ersten Schritt lädt man das aktuelle OpenSSH für Windows in der x86- oder x64-Version von Github herunter, weil es die von uns jetzt benötigten OpenSSHUtils enthält.
Diesen Download braucht man in jedem Fall, wenn man OpenSSH unter Windows Server 2016 einrichten will, weil es dort nicht über Add-WindowsCapability hinzugefügt werden kann. Vielmehr entpackt man am Server das ZIP-Archiv in das Zielverzeichnis und führt das PowerShell-Script install-sshd.ps1 aus. Dieses registriert die beiden Services für SSH. Den Client ssh.exe kann man direkt nutzen.
Unter Windows 10 entnimmt man aus dem ZIP-Archiv die Dateien FixHostFilePermissions.ps1, OpenSSHUtils.psm1 und OpenSShUtils.psd1 und kopiert sie in das OpenSSH-Verzeichnis unterhalb von %SystemRoot%\System32. Bei Server 2016 befinden sie sich schon im Programmverzeichnis und können dort gestartet werden.
Update: Alternativ kann man die OpenSSHUtils mittlerweile auch über das Package Management von PowerShell hinzufügen. Dazu gibt man erst
Install-Module OpenSSHUtils
ein und importiert das Modul anschließend mit
Import-Module OpenSSHUtils
In einer PowerShell mit administrativen Berechtigungen führt man dann den Befehl
.\FixHostFilePermissions.ps1 -Confirm:$false
aus.
Bevor man den SSH-Dienst startet, sind noch ein paar weitere Dinge zu erledigen. Dazu gehört die Anpassung der Datei sshd_config, die sich ebenfalls in diesem Verzeichnis befindet. Für sie muss man sich als Administrator erst die erforderlichen Schreibrechte einräumen, bevor man folgende Schritte ausführt:
Entfernen des Kommentarzeichens '#' am Beginn der Zeilen
PubkeyAuthentication yes
PasswordAuthentication yes
und Hinzufügen des Eintrags
Subsystem powershell c:/program files/powershell/6.0.0-rc/pwsh.exe -sshs -NoLogo -NoProfile
Der Pfad muss natürlich auf das Verzeichnis verweisen, in dem man PowerShell Core tatsächlich installiert hat.
Abschließend generiert man die Schlüssel für die Authentifizierung mit
.\ssh-keygen.exe -A
und öffnet den Port 22 in der Firewall:
netsh advfirewall firewall add rule name=SSH dir=in action=allow protocol=TCP localport=22
Nun sollte sich der SSH-Daemon mit
net start sshd
erfolgreich starten lassen.
PowerShell-Remoting über SSH
Möchte man sich nun von einem anderen Rechner mit diesem Host verbinden, dann kann man dies wie oben beschrieben über den Aufruf von ssh auf der Kommandozeile tun. In diesem Fall landet man auf der Eingabeaufforderung cmd.exe, wo man bei Bedarf auch Windows PowerShell starten kann.
Interessanter ist indes die Möglichkeit, Remote-Sessions in PowerShell über SSH zu öffnen. Dies bleibt allerdings PowerShell Core vorbehalten, die man parallel zur mitgelieferten Windows PowerShell installieren kann (Download von Github).
Zuständig dafür sind die Cmdlets New-PSSession und Enter-PSSession, welche bisher Remote-Sessions nur über WinRM aufbauen konnten. Unter PowerShell Core erhielten sie für SSH einen neuen Parametersatz.
Anstatt mit ComputerName spezifiziert man den entfernten Rechner mit HostName, den Benutzernamen übergibt man nicht mit dem Parameter Credential, sondern mit UserName. Zusätzlich kann man den Schalter SSHTransport hinzufügen:
Enter-PSSession -HostName WS2016-L1 -UserName contoso\hmeier -SSHTransport
Dieses Kommando funktioniert über Plattformgrenzen hinweg, so dass man auf diese Weise zum Beispiel einen Windows Server von einem Mac aus mittels PowerShell Core verwalten kann.
Täglich Know-how für IT-Pros mit unserem Newsletter
Ähnliche Beiträge
- PowerShell 7.3: JEA über SSH, Cmdlet für Setup, erweiterte ARM-Unterstützung
- PowerShell 7 Release Candidate inklusive Support freigegeben
- SSH-Remoting in PowerShell Core mit Public-Key-Authentifizierung nutzen
- Semi-Annual Channel (Targeted): Service-Branch für Windows 10 konfigurieren und auslesen
- Windows 10 1803 kommt mit cURL und tar
Weitere Links
16 Kommentare
Leider funktioniert das Erstellen von key pairs mit ssh-keygen nicht. Es gibt immer eine Fehlermeldung mit Hinweis auf ein "invalid argument". Keine Ahnung, was damit gemeint ist. Wenn ich unter Linux ein key pair erstelle, wird dieser key unter Windows nicht korrekt erkannt. Hat das schon mal jemand ausprobiert?
Gruß
Wolfgang Gandre
Das ist ein bekannter Bug, der aber offenbar noch nicht behoben wurde (https://github.com/PowerShell...). Er tritt nur auf, wenn die Passphrase nicht leer ist. Workaround ist momentan dann wohl, diese leer zu lassen.
Leider findet mein Windows OpenSSH nicht unter zusätzliche Features. Installiert ist Build 1709.
Sie müssen auf das +(Plus) "Feature hinzufügen" klicken und warten bis alle neuen Features aufgelistet werden. OpenSSH Client und Server befinden sich ziemlich oben in der Liste.
Nachdem jeweils auf "installieren" geklickt wurde kann der Installationsprozess auf der Startseite "Apps und Features" verfolgt werden
Ich kann die FixHostPermissions nicht ausführen.
.\FixHostFilePermissions.psl : Die Benennung ".\FixHostFilePermissions.psl" wurde nicht als Name eines Cmdlet, einer
Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens,
oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:1
+ .\FixHostFilePermissions.psl -Confirm:$false
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (.\FixHostFilePermissions.psl:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Kennt wer das Problem?
Sind Sie sicher, dass Sie die OpenSSHUtils installiert haben?
Jap der Ordner ist vorhanden und wenn ich den Befehl "Get-Command -Module OpenSSHUtils" ausführe, bekomme ich die gleiche Ansicht wie auf dem Screenshot
Problem gefunden. Es fehlten zwei Dateien. Neues Problem aber auf getaucht.
PS C:\Windows\System32\OpenSSH> .\FixHostFilePermissions.ps1 -Confirm:$false
Sicherheitswarnung
Führen Sie ausschließlich vertrauenswürdige Skripts aus. Skripts aus dem Internet können zwar nützlich sein, stellen
jedoch auch eine potenzielle Gefahr für Ihren Computer dar. Wenn Sie diesem Skript vertrauen, lassen Sie mit dem Cmdlet
"Unblock-File" die Ausführung des Skripts ohne die Warnmeldung zu. Möchten Sie
"C:\Windows\System32\OpenSSH\FixHostFilePermissions.ps1" ausführen?
[N] Nicht ausführen [M] Einmal ausführen [H] Anhalten [?] Hilfe (Standard ist "N"): m
Sicherheitswarnung
Führen Sie ausschließlich vertrauenswürdige Skripts aus. Skripts aus dem Internet können zwar nützlich sein, stellen
jedoch auch eine potenzielle Gefahr für Ihren Computer dar. Wenn Sie diesem Skript vertrauen, lassen Sie mit dem Cmdlet
"Unblock-File" die Ausführung des Skripts ohne die Warnmeldung zu. Möchten Sie
"C:\Windows\System32\OpenSSH\OpenSSHUtils.psm1" ausführen?
[N] Nicht ausführen [M] Einmal ausführen [H] Anhalten [?] Hilfe (Standard ist "N"): m
C:\ProgramData\ssh\sshd_config does not exist
Done.
PS C:\Windows\System32\OpenSSH>
Entsprechend lässt sich der Dienst nicht starten. Eine Idee?
Hallo,
ich bekomme nach dem Befehl
".\FixHostFilePermissions.ps1 -Confirm:$false"
die Fehlermeldung:
"C:\ProgramData\ssh\sshd_config does not exist
Done."
:(
Ok, das hat sich erledigt (habe die ganzen Dateien aus C:\Windows\System32\OpenSSH in das Verzeichnis C:\ProgramData\ssh kopiert, das Verzeichnis musste ich selbst zuerst erstellen).
Dafür kommt nun nach dem Befehl:
"PS C:\WINDOWS\system32\OpenSSH> net start sshd"
Nur die Meldung:
"Systemfehler 1297 aufgetreten.
In der Dienstkontokonfiguration fehlt eine Berechtigung, die für die ordnungsgemäße Funktion des Dienstes erforderlich ist.
Sie können das Snap-In "Dienste" in der Microsoft Management Console (MMC) (services.msc) und das Snap-In "Lokale Sicherheitseinstellungen" in der MMC (secpol.msc) verwenden, um die Dienstkonfiguration und die Kontokonfiguration anzuzeigen."
:(
Dafür gibt es hier eine Lösung:
https://github.com/PowerShell/Win32-OpenSSH/issues/770
Ich bekommen das ebenfalls nicht zum laufen...
Habe zuerst Unter Einstelllungen/Apps die beiden installiert.
Dann Powershell (Mit adminrechte) geöffnet:
--------------------------------------------------------------------------------
PS C:\WINDOWS\system32> Install-Module OpenSSHUtils
Nicht vertrauenswürdiges Repository
Sie installieren die Module aus einem nicht vertrauenswürdigen Repository. Wenn Sie diesem Repository vertrauen, ändern
Sie dessen InstallationPolicy-Wert, indem Sie das Set-PSRepository-Cmdlet ausführen. Möchten Sie die Module von
'PSGallery' wirklich installieren?
[J] Ja [A] Ja, alle [N] Nein [K] Nein, keine [H] Anhalten [?] Hilfe (Standard ist "N"): a
PS C:\WINDOWS\system32> Import-Module OpenSSHUtils
PS C:\WINDOWS\system32\OpenSSH> Get-Command -Module OpenSSHUtils
CommandType Name Version Source
----------- ---- ------- ------
Function Enable-Privilege 1.0.0.1 OpenSSHUtils
Function Get-UserAccount 1.0.0.1 OpenSSHUtils
Function Get-UserSID 1.0.0.1 OpenSSHUtils
Function Repair-AuthorizedKeyPermission 1.0.0.1 OpenSSHUtils
Function Repair-FilePermission 1.0.0.1 OpenSSHUtils
Function Repair-SshdConfigPermission 1.0.0.1 OpenSSHUtils
Function Repair-SshdHostKeyPermission 1.0.0.1 OpenSSHUtils
Function Repair-UserKeyPermission 1.0.0.1 OpenSSHUtils
Function Repair-UserSshConfigPermission 1.0.0.1 OpenSSHUtils
PS C:\WINDOWS\system32> cd .\OpenSSH\
(Die Dateien aus dem Archiv ins Verzeichnis kopiert)
PS C:\WINDOWS\system32\OpenSSH> .\FixHostFilePermissions.ps1 -Confirm:$false
C:\ProgramData\ssh\sshd_config does not exist
Done.
------------------------------------------------------------------
Zudem fehlt ein Hinweis das man für
.\FixHostFilePermissions.ps1 -Confirm:$false
ins OpenSSh Verzeichnis wechseln mussHabe jetzt auch nicht manuell Dateien nach C:\ProgramData\ssh\ kopiert, weil es in der Anleitung nicht hervorgeht.
Musste am Anfang auch
Set-ExecutionPolicy RemoteSigned
ausführen, weil Fehlermeldung kam dass das ausführen von Skripte nicht erlaubt sei oder so ähnlich.Nachdem ich die mitgelieferte ssdh_config_default in sshd_config umbenannt habe ging`s.
Hat wer das mit private / public Keys zum laufen gebracht?
- Ich erstelle ein Keypair (mit dem mitgelieferten Generator oder mit Putty),
- füge den public Key zu .ssh/authorized_keys hinzu
- Füge den private Key in Putty ein (per Pfad oder per Pageant)
- Stelle in der Config sshd_config auf PubkeyAuthentication yes
- Trotzdem kann ich mich nach wie vor per Passwort einloggen
Weiss da jemand weiter?
Vielleicht hilft Ihnen dabei dieser Beitrag weiter?
Vielen Dank. jedoch.. Jein.
Der private Schlüssel muss offensichtlich auf dem Server nicht hinterlegt werden, nur der public in authorized_keys. Soweit so gut. Da ich als Client putty verwende und nicht powershell, kann ich nicht den mitgelieferten Generator verwenden, da dieser .pem Schlüssel macht, hier reklamiert putty später.
Jedoch sollten doch auch durch putty key generator generierte keys verwendet werden können? ich generiere damit ein 4096 bit RSA Keypair.. der Public Key lässt sich ohne Probleme auf dem SSH Server adden.
Ich tippe jedoch eher auf ein Konfigurationsproblem da der Verbindungsaufbau trotzdem vonstatten geht und dann einfach das password abgefragt wird.