Externe communicatie van PowerShell via SSH

Overzicht

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

WinRM biedt een robuust hostingmodel voor externe PowerShell-sessies. Externe toegang op basis van SSH biedt momenteel geen ondersteuning voor de configuratie van externe eindpunten en Just Enough Administration (JEA).

Met SSH voor extern gebruik kunt u eenvoudige communicatie met PowerShell-sessies tussen Windows en Linux-computers. Met SSH-remoting 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-PSSession Enter-PSSession cmdlets , en Invoke-Command hebben nu een nieuwe parameter ingesteld ter ondersteuning van deze nieuwe verbinding voor remoting.

[-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 Gebruikersnaam. Wanneer u de cmdlets interactief wilt uitvoeren, wordt u gevraagd om een wachtwoord. U kunt ook SSH-sleutelverificatie gebruiken met behulp van een persoonlijk sleutelbestand met de parameter KeyFilePath. Het maken van sleutels voor SSH-verificatie varieert per platform.

Algemene installatie-informatie

PowerShell 6 of hoger en SSH moeten op alle computers zijn geïnstalleerd. Installeer zowel de SSH-client ( ) als de server ( ) zodat u extern van ssh.exe en naar de computers sshd.exe kunt. OpenSSH voor Windows is nu beschikbaar in Windows 10 build 1809 en Windows Server 2019. Zie Manage Windows with OpenSSH (Een Windows beheren met OpenSSH) voor meer informatie. Voor Linux installeert u SSH, inclusief de sshd-server, die geschikt is voor uw platform. U moet ook PowerShell installeren vanuit GitHub om de functie voor SSH-remoting op te halen. De SSH-server moet worden 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 wachtwoorden of sleutels inschakelen.

De SSH-service installeren op een Windows computer

  1. Installeer de nieuwste versie van PowerShell. Zie Installing PowerShell on Windows (PowerShell installeren op Windows.

    U kunt controleren of PowerShell ondersteuning biedt voor SSH voor remoting door de New-PSSession parametersets weer te geven. 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 meest recente Win32 OpenSSH. Zie Aan de slag met OpenSSH voor installatie-instructies.

    Notitie

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

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

    Zorg ervoor dat wachtwoordverificatie is ingeschakeld:

    PasswordAuthentication yes
    

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

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

    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 in uitvoerbare subsysteempaden werken. Zie dit probleem voor GitHub informatie.

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

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

    Schakel optioneel sleutelverificatie in:

    PubkeyAuthentication yes
    

    Zie Managing OpenSSH Keys (OpenSSH-sleutels beheren) voor meer informatie.

  4. Start de service sshd opnieuw.

    Restart-Service sshd
    
  5. Voeg het pad waar OpenSSH is geïnstalleerd toe aan de omgevingsvariabele Pad. Bijvoorbeeld C:\Program Files\OpenSSH\. Met deze vermelding kunt ssh.exe u de vinden.

De SSH-service installeren op een Ubuntu Linux computer

  1. Installeer de nieuwste versie van PowerShell. Zie Installing PowerShell on Ubuntu (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 optioneel sleutelverificatie in:

    PubkeyAuthentication yes
    

    Zie de pagina voor ssh-keygenvoor meer informatie over het maken van SSH-sleutels in Ubuntu.

    Voeg een PowerShell-subsysteeminvoer 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.

  4. Start de ssh-service opnieuw.

    sudo systemctl restart sshd.service
    

De SSH-service installeren op een macOS-computer

  1. Installeer de nieuwste versie van PowerShell. Voor meer informatie installeert u PowerShell op macOS.

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

    1. Open System Preferences.
    2. Klik op Sharing.
    3. Controleer Remote Login of u wilt Remote Login: On instellen.
    4. 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 PowerShell-subsysteeminvoer 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.

    Schakel optioneel sleutelverificatie in:

    PubkeyAuthentication yes
    
  3. Start de service sshd opnieuw.

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

Verificatie

PowerShell voor communicatie via SSH is afhankelijk van de verificatie-uitwisseling tussen de SSH-client en de SSH-service en implementeert zelf geen verificatieschema's. Het resultaat is dat alle geconfigureerde verificatieschema's, waaronder meervoudige verificatie, worden verwerkt door SSH en onafhankelijk van PowerShell. U kunt de SSH-service bijvoorbeeld zo configureren dat verificatie met een openbare sleutel en een een centraal wachtwoord is vereist 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 valideren dat deze werkt buiten PowerShell voordat u het gebruikt met externe externe powershell-gegevens.

Notitie

Gebruikers behouden dezelfde bevoegdheden in externe sessies. Dit betekent dat beheerders toegang hebben tot een shell met verhoogde toegang en normale gebruikers niet.

Voorbeeld van powershell voor remoting

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

# Linux to Linux
#
$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' cannot 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 powershell }
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName                    PSComputerName
-------  ------    -----      -----     ------     --  -- -----------                    --------------
      0       0        0         19       3.23  10635 635 powershell                     UbuntuVM1
      0       0        0         21       4.92  11033 017 powershell                     UbuntuVM1
      0       0        0         20       3.07  11076 076 powershell                     UbuntuVM1
#
# Linux to 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 to 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 een punt te gebruiken om het profiel met het volledige bestandspad te gebruiken. Dit is niet gerelateerd aan SSH-profielen. U kunt de SSH-server configureren voor het gebruik van PowerShell als de standaardshell en voor het laden van een profiel via SSH. Zie de SSH-documentatie voor meer informatie.

  • Vóór PowerShell 7.1 biedt externe externe sessies geen ondersteuning voor externe sessies via externe toegang via SSH. Deze mogelijkheid was beperkt tot sessies met WinRM. Met PowerShell 7.1 kunnen Enter-PSSession en vanuit elke interactieve externe sessie Enter-PSHostProcess werken.

Zie ook

PowerShell installeren in Linux

PowerShell installeren in macOS

PowerShell installeren in Windows

Windows beheren met OpenSSH

OpenSSH-sleutels beheren

Ubuntu SSH