PSRemoting für Linux und Windows: Anleitung

Eine der großartigen Veränderungen, die PowerShell in den letzten Jahren durchgemacht hat, besteht darin, dass sie viele Möglichkeiten bietet, um mit Nicht-Windows-Maschinen zu interagieren. Eine dieser Veränderungen war die Unterstützung von PSRemoting über SSH. PSRemoting über SSH bedeutet auch, PSRemoting unter Linux zu haben!

Obwohl die Einrichtung von PSRemoting für die Zusammenarbeit mit SSH und Linux etwas Vorbereitung erfordert, ermöglicht dies die Verwendung von PowerShell zur nativen Interaktion mit Linux-Maschinen.

In diesem Tutorial lernen Sie, wie Sie einen Windows-Client einrichten, um eine Verbindung zu einem Linux-Computer (CentOS) mit Hilfe von PSRemoting über SSH herzustellen und umgekehrt. Sie lernen, wie Sie sich sowohl mit einem Passwort als auch mit einem Zertifikat authentifizieren können.

Verwandt: PowerShell Remoting: Der ultimative Leitfaden

Voraussetzungen

In diesem Tutorial wird Schritt für Schritt vorgegangen. Wenn Sie mitmachen möchten, stellen Sie bitte sicher, dass Sie im Voraus über folgende Dinge verfügen:

  • A Windows 10 build 1809 or greater machine. The tutorial will use Windows Server 2019 Standard as the remote server.
  • A Linux machine that supports PowerShell 7. The tutorial will use CentOS 8.
  • Sudo-Rechte auf der Linux-Maschine und lokale Administratorrechte auf der Windows-Maschine. Nach der anfänglichen Einrichtung können einige der Rechte entzogen werden.

Einrichten von Windows (Client) für PSRemoting über SSH

Zunächst müssen Sie den PSRemoting-Client (PowerShell) auf Ihrem Windows-Client konfigurieren. Dazu müssen Sie sowohl PowerShell 7+ als auch OpenSSH einrichten und konfigurieren.

Installieren von PowerShell 7+

Installieren Sie zunächst PowerShell 7+. In diesem Tutorial wird nicht erläutert, wie dies durchgeführt wird. Informationen dazu finden Sie im untenstehenden Link.

Installieren von OpenSSH

Sie müssen auch OpenSSH installieren. OpenSSH ist das Paket, das PSRemoting verwenden wird, um eine Verbindung zum entfernten Linux-Computer herzustellen. Sie können OpenSSH über PowerShell mit dem Befehl Get-WindowsCapability wie unten gezeigt installieren.

Je nachdem, ob Ihr Windows-Host als Client und/oder Server fungieren soll, hängt davon ab, welche Windows-Funktion Sie installieren sollten. Wenn Sie von Ihrem Windows-Server zu Linux verbinden, benötigen Sie nur den OpenSSH-Client. Wenn Sie von Linux zum Windows-Server verbinden, benötigen Sie nur den OpenSSH-Server.

Der folgende Befehl findet alle Windows-Funktionen mit einem Namen, der mit OpenSSH beginnt, und installiert sie. Dadurch werden sowohl der Client als auch der Server installiert.

Get-WindowsCapability -Online | Where-Object {$_.Name -like 'OpenSSH*'} | Add-WindowsCapability -Online

Wenn Sie nur den Client installieren möchten, ändern Sie den Filter im Where-Object-Skriptblock in OpenSSH.Client* und für den Server sollte der Filter OpenSSH.Server* sein.

Verwandt: Erste Schritte mit SSH und PowerShell

Starten des SSH-Servers

Nach der Installation von OpenSSH öffnet es die Windows-Firewall für den Port 22, startet aber den OpenSSH-Serverdienst nicht, um auf dem Port zu lauschen. Um den OpenSSH-Server auf Windows Server zu starten, führen Sie den folgenden PowerShell-Befehl aus, um den OpenSSH-Server zu starten und den Dienst so einzurichten, dass er beim Hochfahren gestartet wird.

Start-Service sshd
Set-Service sshd -StartupType Automatic

Konfigurieren der OpenSSH-Konfiguration

Der nächste Schritt besteht darin, die Konfigurationsdatei des sshd_config-Daemons zu ändern. In dieser Datei müssen Sie zunächst bestätigen, dass die Passwortauthentifizierung aktiviert ist, und außerdem das PowerShell-Subsystem hinzufügen.

In diesem Teil des Tutorials wird die einfachste Methode zur Verwendung von Passwörtern eingerichtet. Später in diesem Tutorial lernen Sie, wie Sie die SSH-Authentifizierung mit Zertifikaten einrichten können.

  1. Öffnen Sie die Konfigurationsdatei in Ihrem bevorzugten Texteditor unter C:\ProgramData\ssh\sshd_config.

2. Bestätigen Sie, dass die Passwortauthentifizierung aktiviert ist, indem entweder die Zeile PasswordAuthentication mit einem # am Anfang auskommentiert ist oder auf yes gesetzt ist.

Password Authentication

3. Fügen Sie das PowerShell-Subsystem hinzu. Für PowerShell 7 fügen Sie die Zeile hinzu: Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo.

  • Die Option -sshs wird verwendet, um PowerShell 7 als Subsystem innerhalb von SSH auszuführen.
  • Die Option -NoLogo bewirkt, dass PowerShell beim Starten die Urheberrechtsinformationen ausblendet, um sicherzustellen, dass beim Starten der SSH-Sitzung keine unerwarteten Ausgaben auftreten.

4. Speichern und schließen Sie die Konfigurationsdatei.

5. Starten Sie den sshd-Windows-Dienst neu. Sie können dies mit PowerShell durch Ausführen von Restart-Service sshd tun.

Jetzt sollten alle erforderlichen Konfigurationen vorgenommen sein, um sich mit diesem Windows Server über PSRemoting über SSH zu verbinden.

Einrichten von Linux (Server) für PSRemoting über SSH

Als nächstes kommt Linux mit einer ähnlichen Einrichtung; Installation von PowerShell und Konfiguration von OpenSSH.

Beachten Sie, dass einige der Befehle für CentOS möglicherweise unterschiedlich sind, wenn Sie eine andere Distribution verwenden.

Installation von PowerShell 7+

Zuerst installieren Sie PowerShell 7. In diesem Tutorial wird nicht erklärt, wie dies gemacht wird. Stattdessen sollten Sie den folgenden Link überprüfen.

Verwandt: Wie man PowerShell 7 unter Windows, macOS und Linux herunterlädt und installiert

Konfiguration von OpenSSH

Wie beim Windows Server benötigen Sie OpenSSH. Im Gegensatz zu Windows ist OpenSSH wahrscheinlich bereits installiert. Bei diesem Tutorial mit CentOS 8 ist die Linux-Maschine standardmäßig mit sowohl dem Client als auch dem Server installiert, aber Sie können dies mit dem folgenden Befehl überprüfen:

rpm -qa openssh*

Wenn der Client und der Server installiert sind, sollten Sie eine ähnliche Ausgabe wie unten erhalten.

Configuring OpenSSH

Konfigurieren Sie die SSH-Konfigurationsdatei, indem Sie:

  1. Öffnen Sie die Datei sshd_config, indem Sie den Befehl sudo vi /etc/ssh/sshd_config ausführen.

2. Fügen Sie die PowerShell-Subsystemzeile genau wie beim Hinzufügen zum Windows Server in die Konfigurationsdatei ein.

Subsystem powershell /usr/bin/pwsh -sshs -NoLogo

3. Beenden Sie vi und speichern Sie die Datei.

4. Starten Sie den SSH-Daemon neu, um die Änderungen anzuwenden, indem Sie den Befehl sudo systemctl restart sshd ausführen.

Standardmäßig sind in den meisten Fällen die Authentifizierung mit Passwort und Public Key aktiviert, einschließlich CentOS 8. Sie müssen diese hier nicht hinzufügen.

Eine Verbindung von Windows zu Linux und umgekehrt mit Passwortauthentifizierung herstellen

Nachdem Sie alles sowohl auf den Linux- als auch auf den Windows-Maschinen eingerichtet haben, ist es an der Zeit, die Arbeit, die Sie geleistet haben, sinnvoll einzusetzen. Versuchen wir nun, von Windows zu Linux und umgekehrt mit Passwortauthentifizierung eine Verbindung herzustellen.

Die passwortbasierte Authentifizierung sieht aus und fühlt sich an wie die Verwendung von SSH mit Benutzername und Passwort.

Verbindungsbefehle

Um die Verbindung mit PSRemoting über SSH von Windows zu Linux oder von Linux zu Windows zu testen, verwenden wir sowohl eine „ad-hoc“-Sitzung mit dem Befehl Invoke-Command als auch eine persistente Sitzung mit dem Befehl New-PSSession.

Verwandt: Invoke-Command: Der beste Weg, um Remote-Code auszuführen

Testen Sie die PSRemoting-Verbindung mit Invoke-Command, indem Sie:

  1. Ihre PowerShell 7-Konsole öffnen.

2. Parameter für den Befehl Invoke-Command festlegen. In diesem Fall stellen die unten aufgeführten Parameter eine Verbindung zu einem Computer namens SRV1 unter Verwendung eines lokalen Benutzerkontos auf SRV1 namens User her.

$SessionParams = @{
     HostName = SRV1
     UserName = user
     SSHTransport = $true
 }

3. Invoke-Command ausführen, indem Sie die oben genannten Parameter splitten und einen Befehl ausführen (in diesem Fall Get-Process innerhalb eines Skriptblocks ausführen.

Verwandt: PowerShell Splatting: Was ist das und wie funktioniert es?

Invoke-Command @SessionParams -ScriptBlock {Get-Process}

Dann sollten Sie eine Liste aller laufenden Prozesse auf dem Computer SRV1 sehen.

Sie können auch eine dauerhafte Verbindung herstellen, die es Ihnen ermöglicht, interaktiv Befehle auszuführen, indem Sie:

  1. die oben genannten Parameter bereitstellen und sie an das Cmdlet New-PSSession übergeben.

2. Interaktiv mit der Sitzung verbinden, indem Sie das Cmdlet Enter-PSSession verwenden.

Create a persistent session
 $session = New-PSSession @SessionParams
 Connect interactively
 Enter-PSSession -Session $session

3. Nach Ausführung des Befehls Enter-PSSession würden Sie zur Eingabe des Passworts für den Benutzer aufgefordert werden. Nach der Authentifizierung wären Sie mit der anderen Maschine innerhalb von PowerShell verbunden.

Beachten Sie, dass keiner der oben genannten Befehle den gängigen Parameter Credential benötigt, um Benutzername und Passwort für die Verbindung anzugeben. Stattdessen haben wir den Parameter SSHTransport verwendet. SSH verwendet nicht den gleichen Authentifizierungsprozess wie Windows, um von einem Windows-Computer zu einem anderen zu wechseln, daher kann es PSCredential-Objekte nicht interpretieren.

Verwandt: Verwendung des PowerShell-Befehls Get-Credential und alles zum Thema Anmeldeinformationen.

Mit diesem Ansatz können Sie auch getrennte Sitzungen nutzen.

Einrichten der Authentifizierung über Public Key

Die Passwort-basierte Authentifizierung ist einfach einzurichten und einfach zu verwenden, hat jedoch zwei Probleme.

  • Es gibt keine Möglichkeit, sich ohne manuelle Ausführung der Befehle sicher zu authentifizieren.
  • Ein Passwort wird über das Netzwerk gesendet.

Obwohl das Passwort in diesem Fall innerhalb der SSH-Verbindung verschlüsselt ist, erhält der Server das Passwort im Klartext. Wenn der Server auf irgendeine Weise kompromittiert wird, kann dies zu einem Sicherheitsproblem werden.

Generieren von öffentlichen/privaten Schlüsseln

Bei der Verwendung von öffentlicher Schlüssel-Authentifizierung jeglicher Art müssen Sie zuerst einen öffentlichen Schlüssel vom Client generieren. Diese Anforderung gilt sowohl für Linux als auch für Windows.

Auf dem Linux- oder Windows-Server:

  1. Führen Sie ssh-keygen aus, um das Schlüsselpaar zu generieren.

Wenn Sie ssh-keygen auf Linux ausführen, generiert es standardmäßig ein RSA-Schlüsselpaar. Viele neue Linux-Betriebssysteme erlauben standardmäßig keine RSA-Schlüsselpaare zur Authentifizierung. Um dies zu korrigieren, verwenden Sie ssh-keygen -t ed25519.

2. Sie werden nach einem Pfad zur Speicherung des privaten Schlüssels und nach einer Passphrase zur Verschlüsselung des privaten Schlüssels aufgefordert. Wenn Sie während der Authentifizierung kein Passwort angeben möchten, können Sie die Passphrase leer lassen.

3. Nur für Windows: Führen Sie die folgenden Befehle in PowerShell aus, wobei <ProfilePath> der Pfad zu Ihrem Profil ist (wahrscheinlich C:\Benutzer\Benutzername).

Set-Service ssh-agent -StartupType Automatic
 Start-Service ssh-agent
 ssh-add .ssh\id_ed25519
 Remove-Item ~.ssh\id_ed25519

Die Implementierung von OpenSSH in Windows verfügt über einen ssh-agent-Dienst, mit dem Sie private Schlüssel im Windows Security Context des angemeldeten Benutzers speichern können. Dadurch können Sie Ihren SSH-Privatschlüssel in den ssh-agent importieren und den Schlüssel anschließend vom Dateisystem löschen, um ihn weiter zu sichern.

4. Kopieren Sie nun den generierten öffentlichen Schlüssel (<Benutzer-Home-Verzeichnis>\.ssh\id_ed25519.pub) auf den Server, mit dem Sie eine Verbindung herstellen möchten. Windows bietet kein Tool zum Kopieren an, daher kann dies mit SCP durchgeführt werden. Führen Sie den unten stehenden Befehl aus, um den öffentlichen Schlüssel auf die Linux-Maschine zu kopieren.

scp C:\Users\Username.ssh\id_ed25519.pub username@ServerB:~/.ssh/authorized_keys

Um von Linux nach Windows zu kopieren:

scp ~/.ssh/id_ed25519.pub administrator@ServerA:.ssh/authorized_keys

5. Geben Sie das Passwort des angemeldeten Benutzers ein. Sobald Sie es eingegeben haben, kopiert PowerShell/Bash den Schlüssel und Sie werden von der Remote-Maschine getrennt.

Verbinden von/nach Windows/Linux mit öffentlicher Schlüsselauthentifizierung

Sobald Sie die öffentlichen und privaten Schlüssel eingerichtet haben, sollte das Verbinden von/nach Windows und Linux einfach sein. Es ist nahezu identisch mit der passwortbasierten Authentifizierung.

Um mit einem öffentlichen Schlüssel unter Windows eine Verbindung herzustellen, verwenden Sie die identischen Befehle wie in Verbindungsbefehlen gezeigt. Sie werden nur einen Unterschied feststellen: Es wird nicht nach Anmeldeinformationen gefragt.

Im Folgenden finden Sie ein Beispiel für eine Verbindung von Linux nach Windows unter Verwendung des Schalters -v, um während der Verbindung zu sehen, was passiert.

Example of connecting from Linux to Windows using the -v switch

Source:
https://adamtheautomator.com/psremoting-linux/