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
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
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.
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 meestalProgra~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.
Start de service sshd opnieuw.
Restart-Service sshd
Voeg het pad waar OpenSSH is geïnstalleerd toe aan de omgevingsvariabele Pad. Bijvoorbeeld
C:\Program Files\OpenSSH\
. Met deze vermelding kuntssh.exe
u de vinden.
De SSH-service installeren op een Ubuntu Linux computer
Installeer de nieuwste versie van PowerShell. Zie Installing PowerShell on Ubuntu (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 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.Start de ssh-service opnieuw.
sudo systemctl restart sshd.service
De SSH-service installeren op een macOS-computer
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:
- Open
System Preferences
. - Klik op
Sharing
. - Controleer
Remote Login
of u wiltRemote Login: On
instellen. - Toegang tot de juiste gebruikers toestaan.
- Open
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
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 sessieEnter-PSHostProcess
werken.
Zie ook
PowerShell installeren in Linux
PowerShell installeren in macOS
Feedback
Feedback verzenden en weergeven voor