PowerShell-Remoting über SSH

Übersicht

In der Regel wird beim PowerShell-Remoting für die Aushandlung der Verbindung und den Datentransport WinRM verwendet. SSH ist jetzt für Linux- und Windows-Plattformen verfügbar und ermöglicht echtes PowerShell-Remoting für mehrere Plattformen.

WinRM bietet ein stabiles Hostingmodell für PowerShell-Remotesitzungen. SSH-basiertes Remoting unterstützt derzeit nicht die Remotekonfiguration von Endpunkten und JEA (Just Enough Administration, minimale Verwaltung).

Mithilfe von SSH-Remoting können Sie grundlegendes PowerShell-Remoting von Sitzungen zwischen Windows- und Linux-Computern ausführen. SSH-Remoting erstellt einen PowerShell-Hostprozess als SSH-Subsystem auf dem Zielcomputer. Schließlich implementieren wir ein allgemeines mit WinRM vergleichbares Hostingmodell, um die Endpunktkonfiguration und JEA zu unterstützen.

Die Cmdlets New-PSSession, Enter-PSSession und Invoke-Command verfügen nun über einen neuen Parameter, der diese neue Remotingverbindung unterstützt.

[-HostName <string>]  [-UserName <string>]  [-KeyFilePath <string>]

Um eine Remotesitzung zu erstellen, geben Sie den Zielcomputer mit dem Parameter HostName an und fügen mit UserName den Benutzernamen hinzu. Wenn Sie die Cmdlets interaktiv ausführen, werden Sie zur Kennworteingabe aufgefordert. Sie können die SSH-Schlüsselauthentifizierung auch mithilfe einer privaten Schlüsseldatei und des Parameters KeyFilePath einrichten. Das Erstellen von Schlüsseln für die SSH-Authentifizierung unterscheidet sich je nach Plattform.

Allgemeine Setupinformationen

PowerShell 6 oder höher und SSH müssen auf allen Computern installiert sein. Installieren Sie den SSH-Client (ssh.exe) und -Server (sshd.exe), damit Sie Remoting zwischen den Computern nutzen können. OpenSSH für Windows ist jetzt im Windows 10-Build 1809 sowie in Windows Server 2019 verfügbar. Weitere Informationen finden Sie unter Installation von OpenSSH für Windows Server 2019 und Windows 10. Installieren Sie für Linux SSH, einschließlich SSHD-Server, entsprechend Ihrer Plattform. Sie müssen auch PowerShell über GitHub installieren, um das SSH-Remotingfeature zu erhalten. Der SSH-Server muss konfiguriert werden, um ein SSH-Subsystem zum Hosten eines PowerShell-Prozesses auf dem Remotecomputer zu erstellen. Sie müssen auch eine kennwort- oder schlüsselbasierte Authentifizierung konfigurieren und aktivieren.

Installieren des SSH-Diensts auf einem Windows-Computer

  1. Installieren Sie die neueste Version von PowerShell. Weitere Informationen finden Sie unter Installieren von PowerShell unter Windows.

    Sie können bestätigen, dass PowerShell SSH-Remoting unterstützt, indem Sie die New-PSSession-Parametersätze auflisten. Sie werden sehen, dass die Namen einiger Parametersätze mit SSH beginnen. Diese Parametersätze enthalten SSH-Parameter.

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. Installieren Sie die neueste Win32-OpenSSH. Weitere Installationsanweisungen finden Sie unter Getting started with OpenSSH (Erste Schritte mit OpenSSH).

    Hinweis

    Wenn Sie PowerShell als Standardshell für OpenSSH festlegen möchten, finden Sie weitere Informationen unter Konfigurieren der Standardshell für OpenSSH in Windows.

  3. Bearbeiten Sie die sshd_config-Datei, die sich hier befindet: $env:ProgramData\ssh.

    Vergewissern Sie sich, dass die Kennwortauthentifizierung aktiviert ist:

    PasswordAuthentication yes
    

    Erstellen Sie das SSH-Subsystem, das einen PowerShell-Prozess auf dem Remotecomputer hostet:

    Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -nologo
    

    Hinweis

    Ab PowerShell 7.4 müssen Sie den Parameter -nologo nicht mehr verwenden, wenn Sie PowerShell im SSH-Servermodus ausführen.

    Hinweis

    Der Standardspeicherort der ausführbaren PowerShell-Datei ist c:/progra~1/powershell/7/pwsh.exe. Der Speicherort kann abhängig von der installierten PowerShell-Instanz variieren.

    Sie müssen den kurzen Namen von Version 8.3 für alle Dateipfade verwenden, die Leerzeichen enthalten. Es besteht ein Fehler in OpenSSH für Windows, der verhindert, dass Leerzeichen in ausführbaren Pfaden zu Subsystemen funktionieren. Weitere Informationen finden Sie in diesem GitHub-Issue.

    Der kurze Name von Version 8.3 für den Ordner Program Files unter Windows lautet üblicherweise Progra~1. Sie können jedoch den folgenden Befehl verwenden, um dies sicherzustellen:

    Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' |
      Select-Object EightDotThreeFileName
    
    EightDotThreeFileName
    ---------------------
    c:\progra~1
    

    Aktivieren Sie ggf. die Schlüsselauthentifizierung:

    PubkeyAuthentication yes
    

    Weitere Informationen finden Sie unter OpenSSH-Schlüsselverwaltung.

  4. Starten Sie den sshd-Dienst neu.

    Restart-Service sshd
    
  5. Fügen Sie den Pfad der OpenSSH-Installation der Umgebungsvariablen „Path“ hinzu. Beispiel: C:\Program Files\OpenSSH\. Durch diesen Eintrag kann die Datei ssh.exe gefunden werden.

Installieren des SSH-Diensts auf einem Ubuntu Linux-Computer

  1. Informationen zur Installation der neuesten PowerShell-Version finden Sie unter Installieren von PowerShell unter Ubuntu.

  2. Installieren Sie Ubuntu OpenSSH Server.

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. Bearbeiten Sie die Datei sshd_config unter /etc/ssh.

    Vergewissern Sie sich, dass die Kennwortauthentifizierung aktiviert ist:

    PasswordAuthentication yes
    

    Aktivieren Sie ggf. die Schlüsselauthentifizierung:

    PubkeyAuthentication yes
    

    Weitere Informationen zum Erstellen von SSH-Schlüsseln unter Ubuntu finden Sie auf der manpage für ssh-keygen.

    Fügen Sie einen Eintrag für das PowerShell-Subsystem hinzu:

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

    Hinweis

    Der Standardspeicherort der ausführbaren PowerShell-Datei ist /usr/bin/pwsh. Der Speicherort kann abhängig von der installierten PowerShell-Instanz variieren.

    Hinweis

    Ab PowerShell 7.4 müssen Sie den Parameter -nologo nicht mehr verwenden, wenn Sie PowerShell im SSH-Servermodus ausführen.

  4. Führen Sie einen Neustart des SSH-Diensts aus.

    sudo systemctl restart sshd.service
    

Installieren des SSH-Diensts auf einem macOS-Computer

  1. Installieren Sie die neueste Version von PowerShell. Weitere Informationen finden Sie unter Installieren von PowerShell unter macOS.

    Vergewissern Sie sich, dass SSH-Remoting aktiviert ist, indem Sie die folgenden Schritte ausführen:

    1. Öffnen Sie System Settings.
    2. Klicken Sie auf General
    3. Klicken Sie auf Sharing.
    4. Aktivieren Sie Remote Login, um Remote Login: On festzulegen.
    5. Erteilen Sie den entsprechenden Benutzern Zugriff.
  2. Bearbeiten Sie die Datei sshd_config unter /private/etc/ssh/sshd_config.

    Verwenden Sie einen Text-Editor, z.B. nano:

    sudo nano /private/etc/ssh/sshd_config
    

    Vergewissern Sie sich, dass die Kennwortauthentifizierung aktiviert ist:

    PasswordAuthentication yes
    

    Fügen Sie einen Eintrag für das PowerShell-Subsystem hinzu:

    Subsystem powershell /usr/local/bin/pwsh -sshs -nologo
    

    Hinweis

    Der Standardspeicherort der ausführbaren PowerShell-Datei ist /usr/local/bin/pwsh. Der Speicherort kann abhängig von der installierten PowerShell-Instanz variieren.

    Hinweis

    Ab PowerShell 7.4 müssen Sie den Parameter -nologo nicht mehr verwenden, wenn Sie PowerShell im SSH-Servermodus ausführen.

    Aktivieren Sie ggf. die Schlüsselauthentifizierung:

    PubkeyAuthentication yes
    
  3. Starten Sie den sshd-Dienst neu.

    sudo launchctl stop com.openssh.sshd
    sudo launchctl start com.openssh.sshd
    

Hinweis

Wenn Sie das Betriebssystem aktualisieren, wird die SSH-Konfigurationsdatei möglicherweise überschrieben. Überprüfen Sie unbedingt die Konfigurationsdatei nach einem Upgrade.

Authentifizierung

PowerShell-Remoting über SSH basiert auf dem Authentifizierungsaustausch zwischen dem SSH-Client und dem SSH-Dienst und implementiert selbst keine Authentifizierungsschemas. Infolgedessen werden alle konfigurierten Authentifizierungsschemas, einschließlich der mehrstufigen Authentifizierung, von SSH und unabhängig von PowerShell verarbeitet. Sie können den SSH-Dienst beispielsweise für die Authentifizierung mit öffentlichen Schlüsseln oder die Verwendung eines Einmalkennworts zur Erhöhung der Sicherheit konfigurieren. Die Konfiguration einer mehrstufigen Authentifizierung wird in dieser Dokumentation nicht beschrieben. Bevor Sie versuchen, eine mehrstufige Authentifizierung mit PowerShell-Remoting zu verwenden, informieren Sie sich in der Dokumentation für SSH, wie Sie eine mehrstufige Authentifizierung richtig konfigurieren, und testen Sie, ob diese außerhalb von PowerShell funktioniert.

Hinweis

Benutzer behalten dieselben Berechtigungen in Remotesitzungen bei. Das bedeutet, dass Administratoren Zugriff auf eine Shell mit erhöhten Rechten haben und normale Benutzer nicht.

Beispiel für das PowerShell-Remoting

Sie können das Remoting am einfachsten auf einem einzelnen Computer testen. In diesem Beispiel haben wir eine Remotesitzung mit demselben Linux-Computer erstellt. Wir verwenden PowerShell-Cmdlets interaktiv, damit wir Eingabeaufforderungen von SSH sehen, die zum Überprüfen des Hostcomputers und zur Kennworteingabe auffordern. Sie können dies auch auf einem Windows-Computer durchführen, um sicherzustellen, dass das Remoting funktioniert. Verwenden Sie dann Remoting zwischen Computern, indem Sie den Hostnamen ändern.

Linux zu Linux

$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' can't be established.
ECDSA key fingerprint is SHA256:2kCbnhT2dUE6WCGgVJ8Hyfu1z2wE4lifaJXLO7QJy0Y.
Are you sure you want to continue connecting (yes/no)?
TestUser@UbuntuVM1s password:
$session
 Id Name   ComputerName    ComputerType    State    ConfigurationName     Availability
 -- ----   ------------    ------------    -----    -----------------     ------------
  1 SSH1   UbuntuVM1       RemoteMachine   Opened   DefaultShell             Available
Enter-PSSession $session
[UbuntuVM1]: PS /home/TestUser> uname -a
Linux TestUser-UbuntuVM1 4.2.0-42-generic 49~16.04.1-Ubuntu SMP Wed Jun 29 20:22:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

[UbuntuVM1]: PS /home/TestUser> Exit-PSSession
Invoke-Command $session -ScriptBlock { Get-Process pwsh }
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName    PSComputerName
-------  ------    -----      -----     ------     --  -- -----------    --------------
      0       0        0         19       3.23  10635 635 pwsh           UbuntuVM1
      0       0        0         21       4.92  11033 017 pwsh           UbuntuVM1
      0       0        0         20       3.07  11076 076 pwsh           UbuntuVM1

Linux zu Windows

Enter-PSSession -HostName WinVM1 -UserName PTestName
PTestName@WinVM1s password:
[WinVM1]: PS C:\Users\PTestName\Documents> cmd /c ver
Microsoft Windows [Version 10.0.10586]

Windows zu Windows

C:\Users\PSUser\Documents>pwsh.exe
PowerShell
Copyright (c) Microsoft Corporation. All rights reserved.
$session = New-PSSession -HostName WinVM2 -UserName PSRemoteUser
The authenticity of host 'WinVM2 (10.13.37.3)' can't be established.
ECDSA key fingerprint is SHA256:kSU6slAROyQVMEynVIXAdxSiZpwDBigpAF/TXjjWjmw.
Are you sure you want to continue connecting (yes/no)?
Warning: Permanently added 'WinVM2,10.13.37.3' (ECDSA) to the list of known hosts.
PSRemoteUser@WinVM2's password:
$session
 Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
 -- ----            ------------    ------------    -----         -----------------     ------------
  1 SSH1            WinVM2          RemoteMachine   Opened        DefaultShell             Available
Enter-PSSession -Session $session
[WinVM2]: PS C:\Users\PSRemoteUser\Documents> $PSVersionTable

Name                           Value
----                           -----
PSEdition                      Core
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
SerializationVersion           1.1.0.1
BuildVersion                   3.0.0.0
CLRVersion
PSVersion                      6.0.0-alpha
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
GitCommitId                    v6.0.0-alpha.17


[WinVM2]: PS C:\Users\PSRemoteUser\Documents>

Begrenzungen

  • Der Befehl sudo funktioniert bei Remotesitzungen auf Linux-Computern nicht.

  • PSRemoting über SSH unterstützt keine Profile und hat keinen Zugriff auf $PROFILE. In einer aktiven Sitzung können Sie ein Profil laden, indem Sie das Profil mit dem vollständigen Dateipfad per „dot-source“ angeben. Dies steht nicht im Zusammenhang mit SSH-Profilen. Sie können den SSH-Server so konfigurieren, dass PowerShell als Standardshell verwendet und ein Profil über SSH geladen wird. Weitere Informationen finden Sie in der SSH-Dokumentation.

  • Vor PowerShell 7.1 unterstützte das Remoting über SSH keine Remotesitzungen über einen zweiten Hop. Diese Funktion war auf Sitzungen beschränkt, die WinRM verwendeten. PowerShell 7.1 ermöglicht, dass Enter-PSSession und Enter-PSHostProcess in jeder interaktiven Remotesitzung funktionieren.

Weitere Informationen