Externe communicatie van PowerShell via SSH

Overzicht

Externe communicatie van PowerShell maakt normaal gesproken gebruik van WinRM voor verbindingsonderhandeling en gegevenstransport. SSH is nu beschikbaar voor Linux- en Windows-platforms en maakt echte externe communicatie met PowerShell met meerdere platforms mogelijk.

WinRM biedt een robuust hostingmodel voor externe PowerShell-sessies. Externe communicatie op basis van SSH biedt momenteel geen ondersteuning voor externe eindpuntconfiguratie en Just Enough Beheer istration (JEA).

Met externe SSH-communicatie kunt u eenvoudige externe Communicatie tussen Windows- en Linux-computers uitvoeren in PowerShell-sessies. Met SSH voor externe toegang wordt een PowerShell-hostproces op de doelcomputer gemaakt als een SSH-subsysteem. Uiteindelijk implementeren we een algemeen hostingmodel, vergelijkbaar met WinRM, ter ondersteuning van eindpuntconfiguratie en JEA.

De New-PSSessioncmdlets Enter-PSSession, en Invoke-Command cmdlets hebben nu een nieuwe parameter ingesteld ter ondersteuning van deze nieuwe externe verbinding.

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

Als u een externe sessie wilt maken, geeft u de doelcomputer op met de parameter HostName en geeft u de gebruikersnaam op met UserName. Wanneer u de cmdlets interactief uitvoert, wordt u gevraagd om een wachtwoord. U kunt ook SSH-sleutelverificatie gebruiken met behulp van een bestand met een persoonlijke sleutel met de parameter KeyFilePath . Het maken van sleutels voor SSH-verificatie verschilt per platform.

Algemene informatie over de installatie

PowerShell 6 of hoger en SSH moet op alle computers zijn geïnstalleerd. Installeer zowel de SSH-client () als de server (ssh.exesshd.exe) zodat u op afstand van en naar de computers kunt. OpenSSH voor Windows is nu beschikbaar in Windows 10 build 1809 en Windows Server 2019. Zie Windows beheren met OpenSSH voor meer informatie. Voor Linux installeert u SSH, inclusief sshd-server, die geschikt is voor uw platform. U moet ook PowerShell installeren vanuit GitHub om de functie voor externe toegang van SSH op te halen. De SSH-server moet zijn geconfigureerd om een SSH-subsysteem te maken voor het hosten van een PowerShell-proces op de externe computer. En u moet verificatie op basis van een wachtwoord of sleutel inschakelen.

De SSH-service installeren op een Windows-computer

  1. Installeer de nieuwste versie van PowerShell. Zie PowerShell installeren in Windows voor meer informatie.

    U kunt bevestigen dat PowerShell externe ondersteuning voor SSH heeft door de New-PSSession parametersets weer te gegeven. U ziet dat er namen van parametersets zijn die beginnen met SSH. Deze parametersets bevatten SSH-parameters .

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. Installeer de nieuwste Win32 OpenSSH. Zie Aan de slag met OpenSSH voor installatie-instructies.

    Notitie

    Als u PowerShell wilt instellen als de standaardshell voor OpenSSH, raadpleegt u Windows configureren voor OpenSSH.

  3. Bewerk het sshd_config bestand op $env:ProgramData\ssh.

    Zorg ervoor dat wachtwoordverificatie is ingeschakeld:

    PasswordAuthentication yes
    

    Maak het SSH-subsysteem dat als host fungeert voor een PowerShell-proces op de externe computer:

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

    Notitie

    Vanaf PowerShell 7.4 hoeft u de parameter niet meer te gebruiken bij het uitvoeren van PowerShell in de -nologo SSH-servermodus.

    Notitie

    De standaardlocatie van het uitvoerbare PowerShell-bestand is c:/progra~1/powershell/7/pwsh.exe. De locatie kan variëren, afhankelijk van hoe u PowerShell hebt geïnstalleerd.

    U moet de korte naam 8.3 gebruiken voor bestandspaden die spaties bevatten. Er is een fout in OpenSSH voor Windows die voorkomt dat spaties werken in uitvoerbare subsysteempaden. Zie dit GitHub-probleem voor meer informatie.

    De korte naam 8.3 voor de Program Files map in Windows is meestal Progra~1. U kunt echter de volgende opdracht gebruiken om er zeker van te zijn:

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

    Schakel desgewenst sleutelverificatie in:

    PubkeyAuthentication yes
    

    Zie OpenSSH-sleutels beheren voor meer informatie.

  4. Start de service sshd opnieuw.

    Restart-Service sshd
    
  5. Voeg het pad toe waarop OpenSSH is geïnstalleerd in de omgevingsvariabele Path. Bijvoorbeeld: C:\Program Files\OpenSSH\. Met deze vermelding kan de ssh.exe vermelding worden gevonden.

De SSH-service installeren op een Ubuntu Linux-computer

  1. Installeer de nieuwste versie van PowerShell, zie PowerShell installeren op Ubuntu.

  2. Installeer Ubuntu OpenSSH Server.

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. Bewerk het sshd_config bestand op locatie /etc/ssh.

    Zorg ervoor dat wachtwoordverificatie is ingeschakeld:

    PasswordAuthentication yes
    

    Schakel desgewenst sleutelverificatie in:

    PubkeyAuthentication yes
    

    Zie de manpage voor ssh-keygen voor meer informatie over het maken van SSH-sleutels op Ubuntu.

    Voeg een Vermelding van een PowerShell-subsysteem toe:

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

    Notitie

    De standaardlocatie van het uitvoerbare PowerShell-bestand is /usr/bin/pwsh. De locatie kan variëren, afhankelijk van hoe u PowerShell hebt geïnstalleerd.

    Notitie

    Vanaf PowerShell 7.4 hoeft u de parameter niet meer te gebruiken bij het uitvoeren van PowerShell in de -nologo SSH-servermodus.

  4. Start de ssh-service opnieuw op.

    sudo systemctl restart sshd.service
    

De SSH-service installeren op een macOS-computer

  1. Installeer de nieuwste versie van PowerShell. Installeer PowerShell in macOS voor meer informatie.

    Zorg ervoor dat externe SSH-communicatie is ingeschakeld door de volgende stappen uit te voeren:

    1. System Settings openen.
    2. Klik op General
    3. Klik op Sharing.
    4. Controleer Remote Login of u wilt instellen Remote Login: On.
    5. Toegang tot de juiste gebruikers toestaan.
  2. Bewerk het sshd_config bestand op locatie /private/etc/ssh/sshd_config.

    Gebruik een teksteditor zoals nano:

    sudo nano /private/etc/ssh/sshd_config
    

    Zorg ervoor dat wachtwoordverificatie is ingeschakeld:

    PasswordAuthentication yes
    

    Voeg een Vermelding van een PowerShell-subsysteem toe:

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

    Notitie

    De standaardlocatie van het uitvoerbare PowerShell-bestand is /usr/local/bin/pwsh. De locatie kan variëren, afhankelijk van hoe u PowerShell hebt geïnstalleerd.

    Notitie

    Vanaf PowerShell 7.4 hoeft u de parameter niet meer te gebruiken bij het uitvoeren van PowerShell in de -nologo SSH-servermodus.

    Schakel desgewenst sleutelverificatie in:

    PubkeyAuthentication yes
    
  3. Start de service sshd opnieuw.

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

Notitie

Wanneer u uw besturingssysteem bijwerken, kan het SSH-configuratiebestand worden overschreven. Controleer het configuratiebestand na een upgrade.

Verificatie

Externe communicatie van PowerShell via SSH is afhankelijk van de verificatie-uitwisseling tussen de SSH-client en de SSH-service en implementeert geen verificatieschema's zelf. Het resultaat is dat geconfigureerde verificatieschema's, waaronder meervoudige verificatie, worden verwerkt door SSH en onafhankelijk van PowerShell. U kunt bijvoorbeeld de SSH-service configureren om verificatie van openbare sleutels en een eenmalig wachtwoord te vereisen voor extra beveiliging. De configuratie van meervoudige verificatie valt buiten het bereik van deze documentatie. Raadpleeg de documentatie voor SSH over het correct configureren van meervoudige verificatie en het valideren dat deze werkt buiten PowerShell voordat u probeert deze te gebruiken met externe communicatie met PowerShell.

Notitie

Gebruikers behouden dezelfde bevoegdheden in externe sessies. Wat betekent dat Beheer istrators toegang hebben tot een shell met verhoogde bevoegdheid en normale gebruikers niet.

Voorbeeld van externe communicatie in PowerShell

De eenvoudigste manier om externe communicatie te testen, is door het te proberen op één computer. In dit voorbeeld maken we een externe sessie terug naar dezelfde Linux-computer. We gebruiken Interactief PowerShell-cmdlets, zodat we vragen van SSH zien waarin wordt gevraagd om de hostcomputer te verifiëren en om een wachtwoord te vragen. U kunt hetzelfde doen op een Windows-computer om ervoor te zorgen dat externe communicatie werkt. Vervolgens kunt u op afstand tussen computers de hostnaam wijzigen.

Linux naar 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 naar 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 naar 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>

Beperkingen

  • De sudo-opdracht werkt niet in een externe sessie naar een Linux-computer.

  • PSRemoting via SSH biedt geen ondersteuning voor profielen en heeft geen toegang tot $PROFILE. Eenmaal in een sessie kunt u een profiel laden door dot sourcing van het profiel met het volledige bestandspad. Dit is niet gerelateerd aan SSH-profielen. U kunt de SSH-server configureren voor het gebruik van PowerShell als de standaardshell en het laden van een profiel via SSH. Zie de SSH-documentatie voor meer informatie.

  • Voorafgaand aan PowerShell 7.1 biedt externe communicatie via SSH geen ondersteuning voor externe sessies van de tweede hop. Deze mogelijkheid is beperkt tot sessies met Behulp van WinRM. Met PowerShell 7.1 kunt Enter-PSSession u Enter-PSHostProcess werken vanuit een interactieve externe sessie.

Zie ook