OpenSSH unter Windows 10 und Server 2016 aktivieren, PowerShell-Remoting nutzen


    Tags: , ,

    OpenSSH als optionales Feature in Windows 10 1709 installierenMit der Por­tierung von Power­Shell 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 Akti­vierung jedoch nicht einsatz­bereit und muss erst manuell konfi­guriert 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 Vergangen­heit musste man für SSH unter Windows auf Tools wie PuTTY zurückgreifen, weil das Betriebs­system dafür keine Unter­stü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.

    OpenSSH als optionales Feature in Windows 10 1709

    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 Konsolen­programm steht es unter der Eingabeauf­forderung oder Windows PowerShell zur Verfügung.

    Der SSH-Client zeigt beim Aufruf ohne Parameter den Hilfetext für die Syntax an.

    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.

    Nach der Aktivierung des OpenSSH Servers als optionales Feature lässt sich der sshd-Dienst nicht starten.

    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 FixHost­File­Permissions.ps1, OpenSSH­Utils.psm1 und OpenSSh­Utils.psd1 und kopiert sie in das OpenSSH-Verzeichnis unterhalb von %SystemRoot%\System32. Bei Server 2016 befinden sie sich schon im Programm­verzeichnis und können dort gestartet werden.

    Benötigte Dateien zur Beseitigung des Rechteproblems

    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

    OpenSSHUtils über das Package Management von PowerShell installieren

    In einer PowerShell mit administrativen Berechtigungen führt man dann den Befehl

    .\FixHostFilePermissions.ps1 -Confirm:$false

    aus.

    Ausführung der FixHostFilePermissions.ps1 zur Anpassung der Dateirechte.

    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 Schreib­rechte 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.

    Anpassung der Konfiguration für sshd

    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 Kommando­zeile tun. In diesem Fall landet man auf der Eingabeauf­forderung cmd.exe, wo man bei Bedarf auch Windows PowerShell starten kann.

    SSH-Verbindung von Ubuntu zu Windows 10 mit anschließendem Aufruf von Windows PowerShell.

    Interessanter ist indes die Möglichkeit, Remote-Sessions in PowerShell über SSH zu öffnen. Dies bleibt allerdings PowerShell Core vorbehalten, die man parallel zur mitge­lieferten 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 Parameter­satz.

    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

    Starten einer Remote-PowerShell-Session auf Ubuntu von Windows 10 aus.

    Dieses Kommando funktioniert über Plattform­grenzen 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

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Bild von Wolfgang Sommergut
    Wolfgang Sommergut hat lang­jährige Erfahrung als Fach­autor, Berater und Kon­ferenz­sprecher zu ver­schie­denen Themen der IT. Da­ne­ben war er als System­ad­mi­ni­stra­tor und Con­sultant tätig.
    // Kontakt: E-Mail, XING, LinkedIn //

    Ähnliche Beiträge

    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

    Bild von Wolfgang Sommergut

    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?

    Bild von Wolfgang Sommergut

    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."

    :(

    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 muss

    Habe 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?

    Bild von Wolfgang Sommergut

    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.