Externe communicatie van PowerShell via SSHPowerShell Remoting Over SSH

OverzichtOverview

Externe communicatie van PowerShell gebruikt normaal gesproken WinRM voor verbinding onderhandeling en data-transport.PowerShell remoting normally uses WinRM for connection negotiation and data transport. SSH is gekozen voor deze implementatie van externe toegang, omdat deze nu beschikbaar voor Linux- en Windows-platforms is en waar meerdere platforms PowerShell voor externe toegang kunt.SSH was chosen for this remoting implementation since it is now available for both Linux and Windows platforms and allows true multiplatform PowerShell remoting. WinRM bevat echter ook een robuuste hostingmodel voor externe PowerShell-sessies die deze implementatie wordt nog niet.However, WinRM also provides a robust hosting model for PowerShell remote sessions which this implementation does not yet do. En dit betekent dat externe PowerShell-eindpuntconfiguratie en JEA (net genoeg beheer) wordt nog niet ondersteund in deze implementatie.And this means that PowerShell remote endpoint configuration and JEA (Just Enough Administration) is not yet supported in this implementation.

PowerShell SSH remoting kunt u doen basic PowerShell-sessie op afstand tussen Windows en Linux-machines.PowerShell SSH remoting lets you do basic PowerShell session remoting between Windows and Linux machines. Dit wordt gedaan door het maken van een PowerShell-proces op de doelcomputer als een SSH-subsysteem hosten.This is done by creating a PowerShell hosting process on the target machine as an SSH subsystem. Dit wordt uiteindelijk gewijzigd in een meer algemene hostingmodel die vergelijkbaar is met de werking van WinRM ter ondersteuning van endpoint-configuratie en JEA.Eventually this will be changed to a more general hosting model similar to how WinRM works in order to support endpoint configuration and JEA.

De cmdlets New-PSSession, Enter-PSSession en Invoke-Command hebt nu een nieuwe parameterset ter bevordering van deze nieuwe verbinding voor externe toegangThe New-PSSession, Enter-PSSession and Invoke-Command cmdlets now have a new parameter set to facilitate this new remoting connection

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

Deze nieuwe parameterset zullen waarschijnlijk veranderen, maar nu kunt u voor het maken van SSH PSSessions communiceren met vanaf de opdrachtregel of opdrachten en scripts op worden aangeroepen.This new parameter set will likely change but for now allows you to create SSH PSSessions that you can interact with from the command line or invoke commands and scripts on. U de doelmachine opgeven met de parameter hostnaam en geef de gebruikersnaam op die met gebruikersnaam.You specify the target machine with the HostName parameter and provide the user name with UserName. Wanneer de cmdlets interactief wordt uitgevoerd op de PowerShell-opdrachtregel wordt u gevraagd om een wachtwoord.When running the cmdlets interactively at the PowerShell command line you will be prompted for a password. Maar u hebt ook de optie voor het gebruik van SSH-sleutelverificatie en geef een pad op persoonlijke sleutelbestand met de parameter KeyFilePath.But you also have the option to use SSH key authentication and provide a private key file path with the KeyFilePath parameter.

Informatie over algemene instellingenGeneral setup information

SSH is vereist om te worden geïnstalleerd op alle machines.SSH is required to be installed on all machines. U moet zowel de client (ssh.exe) als de server (sshd.exe) installeren zodat u met externe toegang naar en van de machines experimenteren kunt.You should install both client (ssh.exe) and server (sshd.exe) so that you can experiment with remoting to and from the machines. Voor Windows moet u installeren Win32 OpenSSH vanuit GitHub.For Windows you will need to install Win32 OpenSSH from GitHub. Voor Linux moet u geschikt is voor uw platform SSH (inclusief sshd server) installeren.For Linux you will need to install SSH (including sshd server) appropriate to your platform. U moet ook een recente PowerShell build of een pakket vanuit de externecommunicatiefunctie van SSH met GitHub.You will also need a recent PowerShell build or package from GitHub having the SSH remoting feature. SSH subsystemen wordt gebruikt voor het opzetten van een PowerShell-proces op de externe computer en de SSH-server moet worden geconfigureerd voor die.SSH subsystems is used to establish a PowerShell process on the remote machine and the SSH server will need to be configured for that. Bovendien moet u wachtwoordverificatie en eventueel sleutel gebaseerde authenticatie inschakelen.In addition you will need to enable password authentication and optionally key based authentication.

Setup op Windows-computerSetup on Windows Machine

  1. [De nieuwste versie van Core voor Windows PowerShell installeren] [][Install the latest version of PowerShell Core for Windows][]
    • U kunt zien dat als de SSH-ondersteuning voor externe communicatie door te kijken heeft de parameter wordt ingesteld voor New-PSSessionYou can tell if it has the SSH remoting support by looking at the parameter sets for New-PSSession powershell PS> Get-Command New-PSSession -syntax New-PSSession [-HostName] <string[]> [-Name <string[]>] [-UserName <string>] [-KeyFilePath <string>] [-SSHTransport] [<CommonParameters>]
  2. Installeer de meest recente Win32 OpenSSH opbouwen vanuit GitHub met de installatie instructiesInstall the latest Win32 OpenSSH build from GitHub using the [installation] instructions
  3. Bewerk het bestand sshd_config op de locatie waar u de Win32-OpenSSH geïnstalleerdEdit the sshd_config file at the location where you installed Win32 OpenSSH
    • Zorg ervoor dat de wachtwoordverificatie is ingeschakeldMake sure password authentication is enabled none PasswordAuthentication yes
    • De vermelding voor een PowerShell-subsysteem toevoegen, vervangen door c:/program files/powershell/6.0.0/pwsh.exe met het juiste pad naar de versie die u wilt gebruikenAdd a PowerShell subsystem entry, replace c:/program files/powershell/6.0.0/pwsh.exe with the correct path to the version you want to use none Subsystem powershell c:/program files/powershell/6.0.0/pwsh.exe -sshs -NoLogo -NoProfile
    • Verificatie met sleutel (optioneel) inschakelenOptionally enable key authentication none PubkeyAuthentication yes
  4. Start de service sshdRestart the sshd service powershell Restart-Service sshd
  5. Het pad waar OpenSSH is geïnstalleerd op uw pad Env variabele toevoegenAdd the path where OpenSSH is installed to your Path Env Variable
    • Dit moet langs de lijnen vanC:\Program Files\OpenSSH\This should be along the lines of C:\Program Files\OpenSSH\
    • Hiermee kunt u de ssh.exe die u wilt zoekenThis allows for the ssh.exe to be found

Setup op de Machine met Linux (Ubuntu 14.04)Setup on Linux (Ubuntu 14.04) Machine

  1. Installeer de meest recente PowerShell voor Linux opbouwen vanuit GitHubInstall the latest [PowerShell for Linux] build from GitHub
  2. Installeer Ubuntu SSH indien nodigInstall Ubuntu SSH as needed bash sudo apt install openssh-client sudo apt install openssh-server
  3. Bewerk het bestand sshd_config op locatie /etc/sshEdit the sshd_config file at location /etc/ssh
    • Zorg ervoor dat de wachtwoordverificatie is ingeschakeldMake sure password authentication is enabled none PasswordAuthentication yes
    • Een PowerShell-subsysteem vermelding toevoegenAdd a PowerShell subsystem entry none Subsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile
    • Verificatie met sleutel (optioneel) inschakelenOptionally enable key authentication none PubkeyAuthentication yes
  4. Start de service sshdRestart the sshd service bash sudo service sshd restart

Setup op Mac OS-MachineSetup on MacOS Machine

  1. Installeer de meest recente PowerShell voor Mac OS bouwenInstall the latest [PowerShell for MacOS] build
    • Controleer of dat de SSH-externe toegang is ingeschakeld met de volgende stappen:Make sure SSH Remoting is enabled by following these steps:
      • OpenSystem PreferencesOpen System Preferences
      • Klik opSharingClick on Sharing
      • Controleer Remote Login -meldingRemote Login: OnCheck Remote Login - Should say Remote Login: On
      • Toegang tot de juiste gebruikers toestaanAllow access to appropriate users
  2. Bewerk de sshd_config bestand op locatie/private/etc/ssh/sshd_configEdit the sshd_config file at location /private/etc/ssh/sshd_config
    • Uw favoriete editor gebruiken ofUse your favorite editor or bash sudo nano /private/etc/ssh/sshd_config
    • Zorg ervoor dat de wachtwoordverificatie is ingeschakeldMake sure password authentication is enabled none PasswordAuthentication yes
    • Een PowerShell-subsysteem vermelding toevoegenAdd a PowerShell subsystem entry none Subsystem powershell /usr/local/bin/powershell -sshs -NoLogo -NoProfile
    • Verificatie met sleutel (optioneel) inschakelenOptionally enable key authentication none PubkeyAuthentication yes
  3. Start de service sshdRestart the sshd service bash sudo launchctl stop com.openssh.sshd sudo launchctl start com.openssh.sshd

Voorbeeld van een externe communicatie van PowerShellPowerShell Remoting Example

De eenvoudigste manier om te testen voor externe toegang is zojuist probeer op een enkele computer.The easiest way to test remoting is to just try it on a single machine. Ik maak hier een externe sessie naar dezelfde machine op een Linux-vak.Here I will create a remote session back to the same machine on a Linux box. U ziet dat ik gebruik PowerShell-cmdlets uit vanaf de opdrachtprompt zodat we zien prompts van SSH waarin wordt gevraagd om te controleren of de hostcomputer evenals een wachtwoord wordt gevraagd.Notice that I am using PowerShell cmdlets from a command prompt so we see prompts from SSH asking to verify the host computer as well as password prompts. Hetzelfde geldt voor een Windows-computer om ervoor te zorgen voor externe toegang er werkt en vervolgens de afstand tussen machines door gewoon de hostnaam van de te wijzigen, kunt u doen.You can do the same thing on a Windows machine to ensure remoting is working there and then remote between machines by simply changing the host name.

#
# Linux to Linux
#
PS /home/TestUser> $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:

PS /home/TestUser> $session

 Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
 -- ----            ------------    ------------    -----         -----------------     ------------
  1 SSH1            UbuntuVM1       RemoteMachine   Opened        DefaultShell             Available

PS /home/TestUser> Enter-PSSession $session

[UbuntuVM1]: PS /home/TestUser> uname -a
Linux TestUser-UbuntuVM1 4.2.0-42-generic 49~14.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

PS /home/TestUser> 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
#
PS /home/TestUser> Enter-PSSession -HostName WinVM1 -UserName PTestName
PTestName@WinVM1s password:

[WinVM1]: PS C:\Users\PTestName\Documents> cmd /c ver

Microsoft Windows [Version 10.0.10586]

[WinVM1]: PS C:\Users\PTestName\Documents>

#
# Windows to Windows
#
C:\Users\PSUser\Documents>pwsh.exe
PowerShell
Copyright (c) Microsoft Corporation. All rights reserved.

PS C:\Users\PSUser\Documents> $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:
PS C:\Users\PSUser\Documents> $session

 Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
 -- ----            ------------    ------------    -----         -----------------     ------------
  1 SSH1            WinVM2          RemoteMachine   Opened        DefaultShell             Available


PS C:\Users\PSUser\Documents> 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>

Bekende problemenKnown Issues

  1. sudo-opdracht werkt niet in de externe sessie op Linux-machine.sudo command does not work in remote session to Linux machine.