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-PSSession
cmdlets 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.exe
sshd.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
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
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.
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 meestalProgra~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.
Start de service sshd opnieuw.
Restart-Service sshd
Voeg het pad toe waarop OpenSSH is geïnstalleerd in de omgevingsvariabele Path. Bijvoorbeeld:
C:\Program Files\OpenSSH\
. Met deze vermelding kan dessh.exe
vermelding worden gevonden.
De SSH-service installeren op een Ubuntu Linux-computer
Installeer de nieuwste versie van PowerShell, zie PowerShell installeren op Ubuntu.
Installeer Ubuntu OpenSSH Server.
sudo apt install openssh-client sudo apt install openssh-server
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.Start de ssh-service opnieuw op.
sudo systemctl restart sshd.service
De SSH-service installeren op een macOS-computer
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:
System Settings
openen.- Klik op
General
- Klik op
Sharing
. - Controleer
Remote Login
of u wilt instellenRemote Login: On
. - Toegang tot de juiste gebruikers toestaan.
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
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
uEnter-PSHostProcess
werken vanuit een interactieve externe sessie.