Lär dig att konfigurera och använda PowerShell SSH remoting

När Microsoft sa att PowerShell skulle bli ett open source-projekt som skulle köras på Windows, Linux och macOS i augusti 2016 fanns det en intressant rynka relaterad till PowerShell remoting.

Microsoft sa att denna PowerShell-kärna skulle stödja remoting över Secure Shell (SSH) samt Web Services-Management (WS-man). Du kan alltid använda PowerShell SSH-binärer, men meddelandet indikerade att SSH-stöd skulle vara en integrerad del av PowerShell. Detta öppnade möjligheten att utföra fjärradministration av Windows och Linux-system enkelt med samma teknik.

en kort historia av PowerShell remoting

Microsoft introducerade remoting i PowerShell version 2.0 i Windows 7 och Windows Server 2008 R2, vilket dramatiskt förändrade landskapet för Windows-administratörer. De kunde skapa fjärrskrivbordssessioner till servrar, men PowerShell remoting gjorde det möjligt att hantera ett stort antal servrar samtidigt.

Remoting i Windows PowerShell är baserad på WS-man, en öppen standard från Distributed Management Task Force. Men eftersom WS-MAN-baserad remoting är Windows-orienterad, behövde du använda en annan teknik, vanligtvis SSH, för att administrera Linux-system.

introduktion av SSH på PowerShell Core

vi har blivit vana vid att installera programvara på Windows med hjälp av guiderna, men installationen av OpenSSH kräver mer bakgrundsinformation och mer arbete från administratören.

SSH är ett protokoll för hantering av system över ett eventuellt osäkert nätverk. SSH fungerar i ett klient-serverläge och är de facto-standarden för fjärradministration i Linux-miljöer.

PowerShell Core använder OpenSSH, en gaffel från SSH 1.2.12 som släpptes under en öppen källkodslicens. OpenSSH är förmodligen den mest populära SSH-implementeringen.

koden som krävs för att använda ws-MAN-remoting installeras som en del av Windows-operativsystemet. Du måste installera OpenSSH manuellt.

installera OpenSSH

Vi har blivit vana vid att installera programvara på Windows med hjälp av guiderna, men installationen av OpenSSH kräver mer bakgrundsinformation och mer arbete från administratören. Utan några manuella ingrepp kan många problem uppstå.

installationsprocessen för OpenSSH på Windows har förbättrats med tiden, men det är fortfarande inte så enkelt som det borde vara. Att arbeta med konfigurationsfilen lämnar mycket att önska.

det finns två alternativ när du installerar PowerShell SSH:

  1. på Windows 10 1809, Windows Server 1809, Windows Server 2019 och senare är OpenSSH tillgängligt som en valfri funktion.
  2. på tidigare versioner av Windows kan du ladda ner och installera OpenSSH från GitHub.

se till att ditt system har de senaste korrigeringarna innan du installerar OpenSSH.

installera OpenSSH-tillvalsfunktionen

Du kan installera OpenSSH-tillvalsfunktionen med PowerShell. Kontrollera först ditt system med följande kommando:

Get-WindowsCapability -Online | where Name -like '*SSH*'
OpenSSH-komponenter
Figur 1. Hitta OpenSSH-komponenterna i ditt system.

Figur 1 visar att OpenSSH-klientprogramvaran är förinstallerad.

Du måste använda Windows PowerShell för installationen om du inte laddar ner WindowsCompatibility module för PowerShell Core. Sedan kan du importera Deployment Image Service and Management-modulen från Windows PowerShell och köra kommandona i PowerShell Core.

Installera serverfunktionen:

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

SSH-filerna installeras i C:\Windows\System32\OpenSSH mapp.

ladda ner OpenSSH från GitHub

börja med att ladda ner den senaste versionen från GitHub. Den senaste versionen av installationsanvisningarna finns på den här länken.

När nedladdningen är klar, extrahera zip-filen till C:\Program filer \ OpenSSH mapp. Ändra plats till C:\Program Files \ OpenSSH för att installera SSH-tjänsterna:

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

konfigurera OpenSSH

Efter OpenSSH-installationer, utför några ytterligare konfigurationssteg.

se till att OpenSSH-mappen ingår i miljövariabeln system path:

  • C:\Windows\System32\OpenSSH \ om installerat som Windows valfri funktion
  • C:\Program filer \ OpenSSH \ om de installeras via OpenSSH-nedladdningen

Ställ in de två tjänsterna för att starta automatiskt:

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

om du installerade OpenSSH med den valfria funktionen skapar Windows en ny brandväggsregel för att tillåta inkommande åtkomst till SSH över port 22. Om du installerade OpenSSH från nedladdningen skapar du brandväggsregeln med det här kommandot:

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

Starta sshd-tjänsten för att generera SSH-tangenterna:

Start-Service sshd

SSH-tangenterna och konfigurationsfilen finns i C:\ProgramData\ssh, som är en dold mapp. Standardskalet som används av SSH är Windows-kommandoskalet. Detta måste ändras till PowerShell:

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

Nu, när du ansluter till systemet via SSH, startar PowerShell Core och blir standardskalet. Du kan också göra standardskalet Windows PowerShell om så önskas.

det finns ett fel i OpenSSH på Windows. Det fungerar inte med banor med ett mellanslag, till exempel sökvägen till PowerShell Core körbar! Lösningen är att skapa en symbolisk länk som skapar en sökväg som OpenSSH kan använda:

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

i sshd_config-filen, kommentera följande rader:

PubkeyAuthentication yes
PasswordAuthentication yes

Lägg till den här raden före andra delsystemlinjer:

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

detta säger att OpenSSH ska köra PowerShell Core.

kommentera raden:

AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

När du har sparat ändringarna i sshd_config-filen, starta om tjänsterna:

Restart-Service sshd
Start-Service ssh-agent

Du måste starta om sshd-tjänsten efter eventuella ändringar i konfigurationsfilen.

använda PowerShell SSH remoting

använda remoting över SSH är mycket lik remoting över WS-MAN. Du kan komma åt fjärrsystemet direkt med Invoke-Command:

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

du får en fråga om lösenordet, som inte visas när du skriver det.

om det är första gången du ansluter till fjärrsystemet via SSH ser du ett meddelande som liknar detta:

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)?

skriv ja och tryck på Enter.

Du kan skapa en remoting-session:

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

och sedan använda den:

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

Du kan ange en OpenSSH-remoting-session med Enter-PSSession på samma sätt som en WS-man-session. Du kan ange en befintlig session eller använda Värdnamnsparametern på Enter-PSSession för att skapa den interaktiva sessionen.

Du kan inte koppla bort en ssh-baserad session; Det är en ws-man-teknik.

Du kan använda ws-MAN-och SSH-sessioner för att hantera flera datorer som visas i Figur 2.

sessionsinformationen visar den olika transportmekanismen-WS-MAN respektive SSH-och slutpunkten som används av varje session.

fjärrstyrningssessioner
Figur 2. Använd ws-MAN och SSH sessioner tillsammans för att hantera fjärrmaskiner.

om du tittar noga på Figur 2 kommer du att märka att det inte fanns någon prompt för lösenordet på SSH-sessionen eftersom systemet inrättades med SSH-nyckelbaserad autentisering.

använda SSH-nyckelbaserad autentisering

öppna en förhöjd PowerShell-session. Ändra platsen till .SSH-mapp i ditt användarområde:

Set-Location -Path ~\.ssh

generera nyckelparet:

ssh-keygen -t ed25519

Lägg till nyckelfilen i SSH-agenten på den lokala datorn:

ssh-add id_ed25519

När du har lagt till den privata nyckeln i SSH-agent, säkerhetskopiera den privata nyckeln till en säker plats och ta bort nyckeln från den lokala maskinen.

kopiera id_ed25519.pub fil i .SSH-mapp för det matchande användarkontot på fjärrservern. Du kan skapa ett sådant konto om det behövs:

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

på fjärrmaskinen kopierar du innehållet i nyckelfilen till filen authorized_keys:

scp id_ed25519.pub authorized_keys

filen authorized_keys behöver dess behörigheter ändras:

  • Öppna File Explorer, högerklicka authorized_keys och navigera till Properties – Security – Advanced
  • Klicka på Inaktivera arv.
  • välj Konvertera ärvda behörigheter till uttryckliga behörigheter för det här objektet.
  • ta bort alla behörigheter förutom systemet och ditt användarkonto. Båda måste ha full kontroll.
introduktion till SSH med PowerShell kärna.

du ser referenser till att använda OpenSSHUtils-modulen för att ställa in behörigheterna, men det finns ett fel i versionen från PowerShell-galleriet som gör authorized_keys-filen oanvändbar.

Starta om sshd-tjänsten på fjärrdatorn.

Du kan nu ansluta till fjärrmaskinen utan att använda ett lösenord som visas i Figur 2.

om du ansluter till en maskin som inte är domän från en maskin i domänen måste du använda Användarnamnsparametern efter att ha aktiverat nyckelparautentisering:

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

du behöver användarnamnet på fjärrmaskinen för att matcha ditt domännamn. Du kommer inte att bli ombedd att ange ett lösenord.

WS-MAN eller SSH remoting?

ska du använda WS – MAN eller SSH baserad remoting? Ws-MAN remoting är tillgängligt på alla Windows-system och är aktiverat som standard på Windows Server 2012 och senare serverversioner. WS-MAN remoting har några problem, särskilt double hop-frågan. WS-MAN behöver också extra arbete för att avlägsna till icke-domänsystem.

SSH remoting är endast tillgängligt i PowerShell Core; Windows PowerShell är begränsat till ws-MAN remoting. Det tar en betydande mängd arbete att installera och konfigurera SSH remoting. Dokumentationen är inte så bra som den behöver vara. Fördelarna med SSH remoting är att du enkelt kan komma åt icke-domänmaskiner och icke-Windows-system där SSH är standarden för fjärråtkomst.

Lämna ett svar

Din e-postadress kommer inte publiceras.