SSH-Remoting in PowerShell Core mit Public-Key-Authentifizierung nutzen

    OpenSSHEin Vor­teil von PowerShell-Remoting via SSH be­steht darin, dass man anders als bei WinRM dafür eine Public-Key-Authenti­fizierung nutzen kann. Das verein­facht die Fern­wartung von Rechnern, die nicht Mit­glied in einer AD-Domäne sind, und er­höht die Sicher­heit. Diese An­leitung zeigt, wie man dabei vorgeht.

    Wenn man WinRM in einer Umgebung ohne Active Directory verwenden möchte, dann wird die Sache meistens recht umständlich, wenn Sicherheit von Bedeutung ist. Für eine verschlüsselte Verbindung müssen Sie vom standard­mäßigen HTTP zu HTTPS wechseln, sich mit SSL-Zertifikaten herumschlagen und die Liste mit Trusted Hosts pflegen.

    Remoting über SSH, das mit PowerShell Core 6 eingeführt wurde, erfordert nicht unbedingt den Einsatz von Public-Key-Authenti­fizierung. Vielmehr lässt auch eine Anmeldung über Passwort zu (siehe dazu: OpenSSH unter Windows 10 aktivieren, PowerShell-Remoting nutzen).

    Der größte Nachteil besteht aber dann darin, dass man jedes Mal das Windows-Passwort eingeben muss, wenn man sich mit einem Remote-PC verbindet. Das mag zwar für interaktive Sitzungen über Enter-PSsession funktionieren. Aber wenn Sie Scripts remote über Invoke-Command ausführen möchten, dann könnte das zu Problemen führen.

    Die Public-Key-Authentifizierung erhöht die Sicherheit und den Benutzer­komfort, weil sie keine Eingabe von Passwörtern verlangt. Daher ist es sinnvoll, ein bisschen Zeit zu investieren, um PowerShell-Remoting für diese Form der Authenti­fizierung zu konfigurieren. Ich gehe in der folgenden Anleitung davon aus, dass Sie OpenSSH bereits installiert haben, wie hier beschrieben.

    Konfiguration auf dem lokalen Rechner

    Der erste Schritt besteht darin, den privaten und den öffentlichen Schlüssel zu erzeugen. Dies lässt sich einfach durch das Ausführen des Befehls ssh-keygen bewerkstelligen. Standardmäßig speichert dieses Kommando das Schlüsselpaar im .ssh-Ordner des Benutzerprofils. id_rsa ist der private Schlüssel und id_rsa.pub der öffentliche.

    Wenn Sie auf ein Passwort verzichten möchten, dann betätigen Sie einfach die Enter-Taste zweimal. Ich empfehle jedoch, ein Passwort zu verwenden. Sonst sind alle Ihre Remote-Rechner gefährdet, wenn jemand Zugriff auf Ihren privaten Schlüssel erhält.

    Dank des ssh-agent müssen Sie das Passwort nicht jedes Mal eingeben, wenn Sie eine Verbindung mit einem Remote-Host herstellen. Er läuft als Windows-Dienst und speichert den privaten Schlüssel auf sichere Weise. In einer PowerShell-Konsole können sie ihn so starten:

    Start-Service ssh-agent

    Wenn Sie möchten, dass ssh-agent beim Booten des Rechners automatisch startet, dann hilft dieses Kommando:

    Set-Service ssh-agent -StartupType Automatic

    Um nun Ihren privaten Schlüssel zu ssh-agent hinzuzufügen, setzen Sie diesen Befehl ab:

    ssh-add <Pfad zum Private Key>

    Nun müssen Sie das Passwort einmal eingeben. Danach können Sie den privaten Schlüssel aus dem .ssh-Verzeichnis entfernen und an einem sicheren Ort aufbewahren.

    Schlüsselpaar für SSH generieren und Private Key zu ssh-agent zuweisen

    Wenn Sie später den Private Key wieder aus dem ssh-agent entfernen wollen, dann können Sie das nach diesem Muster tun:

    ssh-add -d ida_rsa

    Dies erfordert jedoch, dass Sie den privaten Schlüssel bereitstellen. Falls Sie ihn verloren haben, können Sie alle Ihre privaten Schlüssel so aus ssh-agent löschen:

    ssh-add -D

    Konfiguration auf dem Remote-Host

    Im nächsten Schritt müssen Sie den Inhalt der Public-Key-Datei id_rsa.pub auf den Remote-Host kopieren. Dort fügen Sie ihn in die Datei authorized_keys unter %USERPROFILE%\.ssh ein.

    Public Key für SSH (Inhalt der Datei id_rsa.pub)

    Die Public-Key-Authentifizierung ist in OpenSSH standarmäßig aktiviert. Ich empfehle dagegen, die Authentifizierung via Passwort aus Sicherheits­gründen abzuschalten. Wenn nämlich ein Angreifer in den Besitz des Windows-Passworts gelangt, dann kann er sich ohne Private Key und dessen Passwort mit den Remote-Hosts verbinden.

    Passwort-Authentifizierung für SSH deaktiveren

    Um die Passwort-Authentifizierung zu deaktivieren, öffnen Sie Notepad mit administrativen Rechten (Befehl Als Administrator ausführen im Kontextmenü des Editors) und laden Sie die Datei sshd_config aus dem Verzeichnis %ProgramData%\ssh. Fügen Sie dort den Eintrag

    PasswordAuthentication no

    hinzu und speichern Sie die Datei. Damit die Änderung wirksam wird, starten Sie den SSH-Service neu. In PowerShell lässt sich das folgender­maßen erledigen:

    Restart-Service sshd

    Verbindung aufbauen mit Public-Key-Authentifizierung

    Um sich mit einem Host zu verbinden, geben Sie in der Konsole von PowerShell 6 des lokalen Rechners folgenden Befehl ein:

    Enter-PSession -HostName <Remote-Host> -UserName <user name auf dem Remote-Computer>

    Der Parameter HostName (anstatt ComputerName) stellt sicher, dass PowerShell eine Verbindung über SSH und nicht über WinRM aufbaut. Wenn der Benutzername auf dem entfernten Rechner nicht identisch ist mit jenem auf der lokalen Maschine, dann gibt man ihn über den Parameter UserName mit. Andernfalls verwendet PowerShell den Namen des lokal angemeldeten Benutzers.

    Beachten Sie, dass Sie weder Ihr Passwort für Windows noch jenes für den Private Key eingeben müssen.

    Invoke-Command funktioniert nach dem gleichen Muster:

    Invoke-Command -HostName <Remote-Hosts> -UserName <Benutzername auf dem Remote-Computer> -ScriptBlock {get-process}

    Aufbau einer Remote-Verbindung mit PowerShell Core und Public-Key-Authentifizierung.

    Eine Verbindung lässt sich nicht bloß über PowerShell herstellen, sondern mit jedem SSH-Client. OpenSSH enthält einen einfachen Client, den man von der Kommandozeile aufrufen kann:

    ssh <Benutzername auf dem Remote-Computer>@<Remote-Host>

    Wenn Sie den privaten Schlüssel nicht zum ssh-agent hinzugefügt haben, können Sie trotzdem die Public-Key-Authentifizierung nutzen, solange sich der Private Key im .ssh-Ordner Ihres Profils befindet. OpenSSH findet ihn dort automatisch. Wenn er sich aber an einem anderen Ort befindet, muss man den Schlüssel über den Parameter -i angeben.

    ssh -i <Pfad zu Private Key>id_rsa <Benutzername auf dem Remote-Host>@<remote host>

    Die Cmdlets Enter-PSsession und Invoke-Command unterstützen für diesen Zweck den Parameter IdentityFilePath:

    Enter-PSession -HostName <Remote-Host> -UserName <Benutzername auf dem Remote-Host> `
    -IdentityFilePath <Pfad zum Private Key>id_rsa

    Wie oben erwähnt, empfehle ich aber nicht, auf diese Weise zu arbeiten, weil sie erfordert, dass Sie Ihren Private Key im Klartext auf dem lokalen Rechner ablegen. Selbst wenn Sie ein Passwort verwenden, ist es sicherer, ssh-agent zu verwenden, weil sie damit vor einem Keylogger der anderen Methoden des Passwortdiebstahls geschützt sind.

    Keine Kommentare