Freigeben über


PowerShell-Remoting über SSH

Überblick

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

Mit SSH-Remoting können Sie einfache PowerShell-Sitzungsremoting zwischen Windows- und Linux-Computern durchführen. SSH-Remoting erstellt einen PowerShell-Hostprozess als SSH-Subsystem auf dem Zielcomputer. Schließlich implementieren wir ein allgemeines Hostingmodell, ähnlich wie WinRM, zur Unterstützung der Endpunktkonfiguration und JEA.

Die Cmdlets New-PSSession, Enter-PSSession und Invoke-Command verfügen jetzt über einen neuen Parametersatz, um diese neue Remotingverbindung zu unterstützen.

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

Zum Erstellen einer Remotesitzung geben Sie den Zielcomputer mit dem Parameter "HostName " an und geben den Benutzernamen mit "UserName" an. Wenn Sie die Cmdlets interaktiv ausführen, werden Sie aufgefordert, ein Kennwort einzugeben. Sie können auch die SSH-Schlüsselauthentifizierung mit einer privaten Schlüsseldatei mit dem KeyFilePath-Parameter verwenden. Das Erstellen von Schlüsseln für die SSH-Authentifizierung variiert je nach Plattform.

Allgemeine Einrichtungsinformationen

PowerShell 6 oder höher und SSH muss auf allen Computern installiert sein. Installieren Sie sowohl den SSH-Client (ssh.exe) als auch den Server (sshd.exe), damit Sie remote zu und von den Computern wechseln können. OpenSSH für Windows ist jetzt in Windows 10 Build 1809 und Windows Server 2019 verfügbar. Weitere Informationen finden Sie unter Verwalten von Windows mit OpenSSH. Installieren Sie für Linux SSH, einschließlich sshd-Server, das für Ihre Plattform geeignet ist. Außerdem müssen Sie PowerShell von GitHub installieren, um das SSH-Remoting-Feature zu erhalten. Der SSH-Server muss so konfiguriert sein, dass ein SSH-Subsystem zum Hosten eines PowerShell-Prozesses auf dem Remotecomputer erstellt wird. Außerdem müssen Sie die Kennwort - oder schlüsselbasierte Authentifizierung 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 über SSH-Remotingunterstützung verfügt, indem Sie die New-PSSession Parametersätze auflisten. Sie werden feststellen, dass Parametersatznamen vorhanden sind, die mit SSH beginnen. Diese Parametersätze enthalten SSH-Parameter .

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. Installieren Sie das neueste Win32 OpenSSH. Installationsanweisungen finden Sie unter "Erste Schritte mit OpenSSH".

    Hinweis

    Wenn Sie PowerShell als Standardshell für OpenSSH festlegen möchten, lesen Sie "Konfigurieren von Windows für OpenSSH".

  3. Bearbeiten Sie die sshd_config Datei unter $Env:ProgramData\ssh.

    • Stellen Sie sicher, dass die Kennwortauthentifizierung aktiviert ist:

      PasswordAuthentication yes
      
    • Erstellen Sie das SSH-Subsystem, das einen PowerShell-Prozess auf dem Remotecomputer hosten soll:

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

      Hinweis

      In OpenSSH für Windows gibt es einen Fehler, der verhindert, dass Sie einen Pfad mit Leerzeichen für die ausführbare Datei des Subsystems verwenden. Es gibt zwei Wege, dieses Problem zu umgehen:

      • Verwenden des Kurznamens im Windows 8.3-Stil für den ausführbaren PowerShell-Pfad
      • Erstellen einer symbolischen Verknüpfung mit der ausführbaren PowerShell-Datei, die zu einem Pfad ohne Leerzeichen führt

      Weitere Informationen finden Sie unter Problem Nr. 784 im PowerShell/Win32-OpenSSH-Repository.

      Sie müssen nur den Namen der 8.3-Formatvorlage für das Segment des Pfads abrufen, der das Leerzeichen enthält. PowerShell 7 ist standardmäßig in C:\Program Files\PowerShell\7\. Der Name Program Files der 8.3-Formatvorlage sollte sein progra~1. Sie können den folgenden Befehl verwenden, um den Namen zu überprüfen:

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

      Der Name 8.3 ist ein Legacyfeature des NTFS-Dateisystems, das deaktiviert werden kann. Dieses Feature muss für das Volume aktiviert sein, auf dem PowerShell installiert ist.

      Alternativ können Sie eine symbolische Verknüpfung mit der ausführbaren PowerShell-Datei erstellen, die zu einem Pfad ohne Leerzeichen führt. Diese Methode wird bevorzugt, da Sie den Link aktualisieren können, wenn sich der Pfad zur ausführbaren PowerShell-Datei ändert, ohne die Datei auch aktualisieren sshd_config zu müssen.

      Verwenden Sie den folgenden Befehl, um eine symbolische Verknüpfung mit der ausführbaren Datei zu erstellen:

      $newItemSplat = @{
           ItemType = 'SymbolicLink'
           Path = 'C:\ProgramData\ssh\'
           Name = 'pwsh.exe'
           Value = (Get-Command pwsh.exe).Source
      }
      New-Item @newItemSplat
      

      Dieser Befehl erstellt die symbolische Verknüpfung im selben Verzeichnis, das vom OpenSSH-Server verwendet wird, um die Hostschlüssel und andere Konfiguration zu speichern.

    • Optional können Sie die Schlüsselauthentifizierung aktivieren:

      PubkeyAuthentication yes
      

      Weitere Informationen finden Sie unter Verwalten von OpenSSH-Schlüsseln.

  4. Starten Sie den sshd-Dienst neu.

    Restart-Service sshd
    
  5. Fügen Sie den Pfad hinzu, in dem OpenSSH zu Ihrer PATH-Umgebungsvariable installiert ist. Beispiel: C:\Program Files\OpenSSH\. Dieser Eintrag ermöglicht das Auffinden von ssh.exe.

Installieren des SSH-Diensts auf einem Ubuntu Linux-Computer

  1. Installieren Sie die neueste Version von PowerShell, siehe Installieren von PowerShell auf Ubuntu.

  2. Installieren Sie Ubuntu OpenSSH Server.

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

    • Stellen Sie sicher, dass die Kennwortauthentifizierung aktiviert ist:

      PasswordAuthentication yes
      
    • Optional können Sie die Schlüsselauthentifizierung aktivieren:

      PubkeyAuthentication yes
      

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

    • Hinzufügen eines PowerShell-Subsystemeintrags:

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

      Hinweis

      Der Standardspeicherort der ausführbaren PowerShell-Datei ist /usr/bin/pwsh. Der Speicherort kann je nach Installation von PowerShell variieren.

  4. Starten Sie den SSH-Dienst neu.

    sudo systemctl restart sshd.service
    

Installieren des SSH-Diensts auf einem macOS-Computer

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

    Stellen Sie sicher, 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. Überprüfen Sie Remote Login, um Remote Login: On festzulegen.
    5. Zugriff auf die entsprechenden Benutzer zulassen.
  2. Bearbeiten Sie die sshd_config Datei am Speicherort /private/etc/ssh/sshd_config.

    Verwenden Sie einen Text-Editor wie Nano:

    sudo nano /private/etc/ssh/sshd_config
    
    • Stellen Sie sicher, dass die Kennwortauthentifizierung aktiviert ist:

      PasswordAuthentication yes
      
    • Hinzufügen eines PowerShell-Subsystemeintrags:

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

      Hinweis

      Der Standardspeicherort der ausführbaren PowerShell-Datei ist /usr/local/bin/pwsh. Der Speicherort kann je nach Installation von PowerShell variieren.

    • Optional können Sie die Schlüsselauthentifizierung aktivieren:

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

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

Hinweis

Wenn Sie ihr Betriebssystem aktualisieren, wird die SSH-Konfigurationsdatei möglicherweise überschrieben. Vergewissern Sie sich, dass Sie die Konfigurationsdatei nach einem Upgrade überprüfen.

Authentifizierung

PowerShell-Remoting über SSH basiert auf dem Authentifizierungsaustausch zwischen dem SSH-Client und dem SSH-Dienst und implementiert keine Authentifizierungsschemas selbst. Das Ergebnis ist, dass alle konfigurierten Authentifizierungsschemas, einschließlich der mehrstufigen Authentifizierung, von SSH und unabhängig von PowerShell behandelt werden. Sie können z. B. den SSH-Dienst so konfigurieren, dass eine Authentifizierung mit öffentlichem Schlüssel und ein einmaliges Kennwort für die zusätzliche Sicherheit erforderlich ist. Die Konfiguration der mehrstufigen Authentifizierung liegt außerhalb des Umfangs dieser Dokumentation. In der Dokumentation zu SSH finden Sie Informationen zum ordnungsgemäßen Konfigurieren der mehrstufigen Authentifizierung und zur Überprüfung der Funktion außerhalb von PowerShell, bevor Sie versuchen, sie mit PowerShell-Remoting zu verwenden.

Hinweis

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

Beispiel für PowerShell-Remoting

Die einfachste Möglichkeit zum Testen von Remoting besteht darin, es auf einem einzelnen Computer auszuprobieren. In diesem Beispiel erstellen wir eine Remotesitzung zurück auf denselben Linux-Computer. Wir verwenden PowerShell-Cmdlets interaktiv, sodass SSH-Prompts angezeigt werden und um Bestätigung des Hostcomputers sowie Eingabe eines Kennworts bitten. Sie können auf einem Windows-Computer dasselbe tun, um sicherzustellen, dass Remoting funktioniert. Verbinden Sie sich dann remote 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>

Einschränkungen

  • Der Befehl "sudo " funktioniert nicht in einer Remotesitzung auf einem Linux-Computer.

  • PSRemoting über SSH unterstützt keine Profile und hat keinen Zugriff auf $PROFILE. Einmal in einer Sitzung können Sie ein Profil laden, indem Sie das Profil mit dem vollständigen Dateipfad beschaffen. Dies bezieht sich nicht auf SSH-Profile. 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ützt Remoting über SSH keine Remotesitzungen für den zweiten Hop. Diese Funktion war auf Sitzungen mit WinRM beschränkt. PowerShell 7.1 ermöglicht, dass Enter-PSSession und Enter-PSHostProcess in jeder interaktiven Remotesitzung funktionieren.

Siehe auch