Leren instellen en gebruiken PowerShell SSH remoting

toen Microsoft zei PowerShell zou een open source project dat zou draaien op Windows, Linux en macOS in augustus 2016, was er een interessante rimpel in verband met PowerShell remoting.

Microsoft zei dat deze PowerShell Core zou ondersteunen remoting over Secure Shell (SSH) evenals Web Services-Management (WS-MAN). Je kunt altijd de PowerShell SSH binaries gebruiken, maar de aankondiging gaf aan dat SSH ondersteuning een integraal onderdeel zou zijn van PowerShell. Dit opende de mogelijkheid om het beheer op afstand van Windows en Linux-systemen eenvoudig uit te voeren met behulp van dezelfde technologieën.

een korte geschiedenis van PowerShell remoting

Microsoft introduceerde remoting in PowerShell versie 2.0 in Windows 7 en Windows Server 2008 R2, wat het landschap voor Windows-beheerders drastisch veranderde. Ze konden remote desktop sessies maken naar servers, maar PowerShell remoting maakte het mogelijk om grote aantallen servers tegelijkertijd te beheren.

Remoting in Windows PowerShell is gebaseerd op WS-MAN, een open standaard van de Distributed Management Task Force. Maar omdat ws-MAN-gebaseerde remoting Windows georiënteerd is, moest je een andere technologie gebruiken, meestal SSH, om Linux-systemen te beheren.

introductie van SSH op PowerShell Core

we zijn gewend geraakt aan het installeren van software op Windows met behulp van de wizards, maar de installatie van OpenSSH vereist meer achtergrondinformatie en meer werk van de beheerder.

SSH is een protocol voor het beheren van systemen over een mogelijk onbeveiligd netwerk. SSH werkt in een client-server modus en is de de facto standaard voor beheer op afstand in Linux-omgevingen.

PowerShell Core gebruikt OpenSSH, een fork van SSH 1.2.12 die werd uitgebracht onder een open source licentie. OpenSSH is waarschijnlijk de meest populaire SSH implementatie.

de code die nodig is om ws-MAN remoting te gebruiken, is geïnstalleerd als onderdeel van het Windows-besturingssysteem. U moet OpenSSH handmatig installeren.

het installeren van OpenSSH

we zijn gewend geraakt aan het installeren van software op Windows met behulp van de wizards, maar de installatie van OpenSSH vereist meer achtergrondinformatie en meer werk van de beheerder. Zonder enige handmatige interventie kunnen veel problemen ontstaan.

het installatieproces voor OpenSSH op Windows is in de loop der tijd verbeterd, maar het is nog steeds niet zo eenvoudig als het zou moeten zijn. Werken met het configuratiebestand laat veel te wensen over.

Er zijn twee opties bij het installeren van PowerShell SSH:

  1. op Windows 10 1809, Windows Server 1809, Windows Server 2019 en hoger is OpenSSH beschikbaar als een optionele functie.
  2. op eerdere versies van Windows kunt u OpenSSH downloaden en installeren vanaf GitHub.

zorg ervoor dat uw systeem de laatste patches heeft voordat u OpenSSH installeert.

de optionele functie van OpenSSH installeren

u kunt de optionele functie van OpenSSH installeren met PowerShell. Controleer eerst je systeem met het volgende commando:

Get-WindowsCapability -Online | where Name -like '*SSH*'
OpenSSH componenten
figuur 1. Vind de OpenSSH componenten in uw systeem.

figuur 1 laat zien dat de OpenSSH client software voorgeïnstalleerd is.

u moet Windows PowerShell gebruiken voor de installatie, tenzij u de WindowsCompatibility module voor PowerShell Core downloadt. Vervolgens kunt u de Deployment Image Service en Management module importeren vanuit Windows PowerShell en de opdrachten uitvoeren in PowerShell Core.

Installeer de serverfunctie:

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Path :
Online : True
RestartNeeded : False

de SSH-bestanden installeren in de C:\Windows\System32\OpenSSH map.

Download OpenSSH van GitHub

begin met het downloaden van de nieuwste versie van GitHub. De laatste versie van de installatie-instructies vindt u op deze link.

nadat het downloaden is voltooid, pak het zip-bestand uit in de C:\Program bestanden\OpenSSH map. Locatie wijzigen naar C:\Program bestanden\OpenSSH om de SSH-services te installeren:

.\install-sshd.ps1
SetServiceObjectSecurity SUCCESS
ChangeServiceConfig2 SUCCESS
ChangeServiceConfig2 SUCCESS

OpenSSH configureren

na de installatie van OpenSSH voert u enkele extra configuratiestappen uit.

zorg ervoor dat de OpenSSH-map is opgenomen in de systeempad-omgevingsvariabele:

  • C:\Windows\System32\OpenSSH\ indien geïnstalleerd als de Windows optionele functie
  • C:\Program bestanden\OpenSSH \ indien geïnstalleerd via de OpenSSH download

Stel de twee services in om automatisch te starten:

Set-Service sshd -StartupType Automatic
Set-Service ssh-agent -StartupType Automatic

Als u OpenSSH hebt geïnstalleerd met de optionele functie, dan maakt Windows een nieuwe firewallregel om binnenkomende toegang van SSH via poort 22 toe te staan. Als u OpenSSH hebt geïnstalleerd vanaf de download, maak dan de firewallregel met dit commando:

New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' `
-Enabled True -Direction Inbound -Protocol TCP `
-Action Allow -LocalPort 22

Start de SSHD-service om de SSH-sleutels te genereren:

Start-Service sshd

de SSH-sleutels en het configuratiebestand bevinden zich in C:\ProgramData\ssh, dat is een verborgen map. De standaard shell gebruikt door SSH is de windows command shell. Dit moet veranderen in PowerShell:

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell `
-Value "C:\Program Files\PowerShell\6\pwsh.exe" -PropertyType String -Force

nu, wanneer u verbinding maakt met het systeem via SSH, zal PowerShell Core starten en zal de standaard shell zijn. U kunt ook de standaard shell Windows PowerShell indien gewenst.

Er is een bug in OpenSSH op Windows. Het werkt niet met paden met een spatie, zoals het pad naar de PowerShell Core executable! De oplossing is om een symbolische link aan te maken die een pad maakt dat OpenSSH kan gebruiken:

New-Item -ItemType SymbolicLink -Path C:\pwsh -Target 'C:\Program Files\PowerShell\6'

in het sshd_config-bestand, verwijder de commentaar van de volgende regels:

PubkeyAuthentication yes
PasswordAuthentication yes

voeg deze regel toe voor andere subsysteemregels:

Subsystem powershell C:\pwsh\pwsh.exe -sshs -NoLogo -NoProfile

Dit vertelt OpenSSH om PowerShell Core uit te voeren.

commentaar op de regel:

AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

na het opslaan van de wijzigingen in het sshd_config-bestand, Herstart de services:

Restart-Service sshd
Start-Service ssh-agent

u moet de SSHD-service herstarten na elke wijziging in het configuratiebestand.

gebruik maken van PowerShell SSH remoting

gebruik maken van remoting over SSH is zeer vergelijkbaar met remoting over WS-MAN. U kunt direct toegang krijgen tot het systeem op afstand met Invoke-Command:

Invoke-Command -HostName W19DC01 -ScriptBlock {Get-Process}
richard@MANTICORE@w19dc01's password:

u krijgt een prompt voor het wachtwoord, dat niet wordt weergegeven als u het typt.

als het de eerste keer is dat u verbinding maakt met het systeem op afstand via SSH, dan zult u een bericht zien dat vergelijkbaar is met dit:

The authenticity of host 'servername (10.00.00.001)' can't be established.
ECDSA key fingerprint is SHA256:(<a large string>).
Are you sure you want to continue connecting (yes/no)?

Typ yes en druk op Enter.

u kunt een remoting sessie aanmaken:

$sshs = New-PSSession -HostName W19FS01
richard@MANTICORE@w19fs01's password:

en deze vervolgens gebruiken:

Invoke-Command -Session $sshs -ScriptBlock {$env:COMPUTERNAME}
W19FS01

u kunt een OpenSSH remoting sessie openen met Enter-PSSession op dezelfde manier als een WS-MAN sessie. U kunt een bestaande sessie invoeren of de hostname parameter op Enter-PSSession gebruiken om de interactieve sessie aan te maken.

u kunt een op SSH gebaseerde sessie niet verbreken; dat is een ws-MAN techniek.

U kunt ws-MAN-en SSH-sessies gebruiken om meerdere computers te beheren, zoals weergegeven in Figuur 2.

De sessieinformatie toont het verschillende transportmechanisme — respectievelijk WS-MAN en SSH — en het eindpunt dat door elke sessie wordt gebruikt.

remote management sessions
Figuur 2. Gebruik WS-MAN en SSH sessies samen om externe machines te beheren.

als je goed kijkt naar figuur 2, zul je merken dat er geen prompt was voor het wachtwoord op de SSH sessie omdat het systeem was ingesteld met SSH sleutel-gebaseerde authenticatie.

met SSH-sleutelgebaseerde authenticatie

Open een verhoogde PowerShell-sessie. Verander de locatie naar de .SSH-map in uw gebruikersgebied:

Set-Location -Path ~\.ssh

Genereer het sleutelpaar:

ssh-keygen -t ed25519

voeg het sleutelbestand toe aan de SSH-agent op de lokale machine:

ssh-add id_ed25519

zodra u de private sleutel aan SSH-agent hebt toegevoegd, maakt u een back-up van de private sleutel naar een veilige locatie en verwijdert u de sleutel van de lokale machine.

kopieer id_ed25519.pub bestand in de .ssh-map voor het overeenkomende gebruikersaccount op de externe server. U kunt zo ’n account aanmaken indien nodig:

$pwd = Read-Host -Prompt 'Password' -AsSecureString
Password: ********
New-LocalUser -Name Richard -Password $pwd -PasswordNeverExpires
Add-LocalGroupMember -Group Administrators -Member Richard

kopieer de inhoud van het sleutelbestand naar het authorized_keys-bestand:

scp id_ed25519.pub authorized_keys

het authorized_keys-bestand moet zijn rechten wijzigen:

  • Open File Explorer, klik met de rechtermuisknop op authorized_keys en navigeer naar Properties-Security-Advanced
  • klik op overerving uitschakelen.
  • Selecteer overgenomen machtigingen converteren naar expliciete machtigingen voor dit object.
  • Verwijder alle rechten behalve voor het systeem en uw gebruikersaccount. Beide moeten de volledige controle hebben.
Inleiding tot SSH met PowerShell-kern.

u zult verwijzingen zien naar het gebruik van de opensshutils module om de rechten in te stellen, maar er is een bug in de versie van de PowerShell galerij die het authorized_keys bestand onbruikbaar maakt.

Herstart de SSHD-service op de machine op afstand.

u kunt nu verbinding maken met de machine op afstand zonder een wachtwoord te gebruiken zoals weergegeven in Figuur 2.

Als u verbinding maakt met een niet-domein machine vanaf een machine in het domein, dan moet u de gebruikersnaam parameter gebruiken na het inschakelen van key-pair authenticatie:

$ss = New-PSSession -HostName W19ND01 -UserName Richard

u hebt de gebruikersnaam op de externe machine nodig om overeen te komen met uw domein gebruikersnaam. U wordt niet gevraagd om een wachtwoord.

WS-MAN of SSH remoting?

moet u ws-MAN of SSH-gebaseerde remoting gebruiken? WS-MAN remoting is beschikbaar op alle Windows-systemen en is standaard ingeschakeld op Windows Server 2012 en latere serverversies. WS-MAN remoting heeft een aantal problemen, met name de double hop kwestie. WS-MAN heeft ook extra werk nodig om niet-domeinsystemen op afstand te houden.

SSH remoting is alleen beschikbaar in PowerShell Core; Windows PowerShell is beperkt tot ws-MAN remoting. Het kost een aanzienlijke hoeveelheid werk om SSH remoting te installeren en te configureren. De documentatie is niet zo goed als nodig is. De voordelen van SSH remoting zijn dat u gemakkelijk toegang tot niet-domein machines en niet-Windows-systemen waar SSH is de standaard voor toegang op afstand.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.