PowerShell fjärrkommunikation via SSH

Översikt

PowerShell-fjärrkommunikation använder vanligtvis WinRM för anslutningsförhandling och dataöverföring. SSH är nu tillgängligt för Linux- och Windows-plattformar och tillåter äkta PowerShell-fjärrkommunikation med flera plattformar.

WinRM tillhandahåller en robust värdmodell för PowerShell-fjärrsessioner. SSH-baserad fjärrkommunikation stöder för närvarande inte fjärrslutpunktskonfiguration och JEA (Just Enough Administration).

Med SSH-fjärrkommunikation kan du använda grundläggande PowerShell-sessionskommunikation mellan Windows- och Linux-datorer. SSH-fjärrkommunikation skapar en PowerShell-värdprocess på måldatorn som ett SSH-undersystem. Så småningom implementerar vi en allmän värdmodell som liknar WinRM för att stödja slutpunktskonfiguration och JEA.

New-PSSession Enter-PSSession Cmdletarna , Invoke-Command och har nu en ny parameteruppsättning som stöder den nya fjärrkommunikationsanslutningen.

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

Om du vill skapa en fjärrsession anger du måldatorn med parametern HostName och anger användarnamnet med Användarnamn. När du kör cmdletarna interaktivt uppmanas du att ange ett lösenord. Du kan också använda SSH-nyckelautentisering med hjälp av en privat nyckelfil med parametern KeyFilePath. Hur du skapar nycklar för SSH-autentisering varierar beroende på plattform.

Allmän konfigurationsinformation

PowerShell 6 eller senare och SSH måste installeras på alla datorer. Installera både SSH-klienten ( ssh.exe ) och servern ( ) så att du kan sshd.exe fjärransluta till och från datorerna. OpenSSH för Windows är nu tillgängligt i Windows 10 version 1809 och Windows Server 2019. Mer information finns i Hantera Windows med OpenSSH. För Linux installerar du SSH, inklusive sshd-servern, som passar din plattform. Du måste också installera PowerShell från GitHub för att få SSH-fjärrkommunikationsfunktionen. SSH-servern måste konfigureras för att skapa ett SSH-undersystem som värd för en PowerShell-process på fjärrdatorn. Och du måste aktivera lösenords- eller nyckelbaserad autentisering.

Konfigurera på en Windows-dator

  1. Installera den senaste versionen av PowerShell. Mer information finns i Installera PowerShell Core i Windows.

    Du kan bekräfta att PowerShell har stöd för SSH-fjärrkommunikation genom att visa en lista över New-PSSession parameteruppsättningarna. Observera att det finns parameteruppsättningsnamn som börjar med SSH. Dessa parameteruppsättningar innehåller SSH-parametrar.

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. Installera den senaste Versionen av Win32 OpenSSH. Installationsanvisningar finns i Komma igång med OpenSSH.

    Anteckning

    Om du vill ange PowerShell som standardgränssnitt för OpenSSH, se Konfigurera Windows för OpenSSH.

  3. Redigera filen sshd_config som finns på $env:ProgramData\ssh .

    Kontrollera att lösenordsautentisering är aktiverat:

    PasswordAuthentication yes
    

    Skapa SSH-undersystemet som är värd för en PowerShell-process på fjärrdatorn:

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

    Anteckning

    Standardplatsen för den körbara PowerShell-filen är c:/progra~1/powershell/7/pwsh.exe . Platsen kan variera beroende på hur du installerade PowerShell.

    Du måste använda kortnamnet 8.3 för alla sökvägar som innehåller blanksteg. Det finns en bugg i OpenSSH för Windows som förhindrar att blanksteg fungerar i körbara sökvägar för undersystem. Mer information finns i det här GitHub-problemet.

    8.3-kortnamnet för Program Files mappen i Windows är vanligtvis Progra~1 . Du kan dock använda följande kommando för att kontrollera att:

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

    Du kan också aktivera nyckelautentisering:

    PubkeyAuthentication yes
    

    Mer information finns i Hantera OpenSSH-nycklar.

  4. Starta om sshd-tjänsten.

    Restart-Service sshd
    
  5. Lägg till sökvägen där OpenSSH är installerat i miljövariabeln Path. Till exempel C:\Program Files\OpenSSH\. Med den här posten ssh.exe kan du hitta .

Konfigurera på en Ubuntu 16.04 Linux-dator

  1. Installera den senaste versionen av PowerShell finns i Installera PowerShell Core på Linux.

  2. Installera Ubuntu OpenSSH Server.

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. Redigera filen sshd_config på platsen /etc/ssh .

    Kontrollera att lösenordsautentisering är aktiverat:

    PasswordAuthentication yes
    

    Du kan också aktivera nyckelautentisering:

    PubkeyAuthentication yes
    

    Mer information om hur du skapar SSH-nycklar i Ubuntu finns i manpage för ssh-keygen.

    Lägg till en post i PowerShell-undersystemet:

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

    Anteckning

    Standardplatsen för den körbara PowerShell-filen är /usr/bin/pwsh . Platsen kan variera beroende på hur du installerade PowerShell.

  4. Starta om ssh-tjänsten.

    sudo service ssh restart
    

Konfigurera på en macOS-dator

  1. Installera den senaste versionen av PowerShell. Mer information finns i Installera PowerShell Core på macOS.

    Kontrollera att SSH-fjärrkommunikation är aktiverat genom att följa dessa steg:

    1. Öppna System Preferences.
    2. Klicka på Sharing.
    3. Kontrollera Remote Login att du vill ange Remote Login: On .
    4. Tillåt åtkomst till lämpliga användare.
  2. Redigera filen sshd_config på platsen /private/etc/ssh/sshd_config .

    Använd en textredigerare, till exempel nano:

    sudo nano /private/etc/ssh/sshd_config
    

    Kontrollera att lösenordsautentisering är aktiverat:

    PasswordAuthentication yes
    

    Lägg till en post i PowerShell-undersystemet:

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

    Anteckning

    Standardplatsen för den körbara PowerShell-filen är /usr/local/bin/pwsh . Platsen kan variera beroende på hur du installerade PowerShell.

    Du kan också aktivera nyckelautentisering:

    PubkeyAuthentication yes
    
  3. Starta om sshd-tjänsten.

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

Autentisering

PowerShell-fjärrkommunikation via SSH förlitar sig på autentiseringsutbytet mellan SSH-klienten och SSH-tjänsten och implementerar inte några autentiseringsscheman i sig. Resultatet är att alla konfigurerade autentiseringsscheman, inklusive multifaktorautentisering, hanteras av SSH och oberoende av PowerShell. Du kan till exempel konfigurera SSH-tjänsten så att den kräver autentisering med offentlig nyckel och ett enda lösenord för ökad säkerhet. Konfigurationen av multifaktorautentisering ligger utanför omfånget för den här dokumentationen. Se dokumentationen för SSH om hur du konfigurerar multifaktorautentisering korrekt och validerar att det fungerar utanför PowerShell innan du försöker använda det med PowerShell-fjärrkommunikation.

Anteckning

Användarna behåller samma behörigheter i fjärrsessioner. Det innebär att administratörer har åtkomst till ett upphöjt gränssnitt, och normala användare kommer inte att göra det.

PowerShell-fjärrkommunikationsexempel

Det enklaste sättet att testa fjärrkommunikation är att prova den på en enda dator. I det här exemplet skapar vi en fjärrsession tillbaka till samma Linux-dator. Vi använder PowerShell-cmdlets interaktivt så vi ser uppmaningar från SSH som ber om att verifiera värddatorn och fråga efter ett lösenord. Du kan göra samma sak på en Windows-dator för att säkerställa att fjärrkommunikationen fungerar. Fjärranslut sedan mellan datorer genom att ändra värdnamnet.

# 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>

Begränsningar

  • Sudo-kommandot fungerar inte i en fjärrsession till en Linux-dator.

  • PSRemoting via SSH stöder inte profiler och har inte åtkomst till $PROFILE . När du är i en session kan du läsa in en profil genom att använda en punktkällor för profilen med den fullständiga filökvägen. Detta är inte relaterat till SSH-profiler. Du kan konfigurera SSH-servern att använda PowerShell som standardgränssnitt och läsa in en profil via SSH. Mer information finns i SSH-dokumentationen.

  • Före PowerShell 7.1 hade fjärrkommunikation via SSH inte stöd för fjärrsessioner med andra hopp. Den här funktionen begränsades till sessioner som använde WinRM. PowerShell 7.1 tillåter Enter-PSSession och Enter-PSHostProcess arbetar inifrån alla interaktiva fjärrsessioner.

Se även

Installera PowerShell Core på Linux

Installera PowerShell Core på macOS

Installera PowerShell Core i Windows

Hantera Windows med OpenSSH

Hantera OpenSSH-nycklar

Ubuntu SSH