Kiedy Microsoft powiedział, że PowerShell stanie się projektem open source, który będzie działał w systemach Windows, Linux i macOS w sierpniu 2016 r., pojawiła się interesująca zmarszczka związana z remotingiem PowerShell.
Microsoft powiedział, że ten rdzeń PowerShell będzie obsługiwał remoting przez Secure Shell (SSH), a także zarządzanie usługami sieciowymi (ws-MAN). Zawsze możesz użyć plików binarnych PowerShell SSH, ale ogłoszenie wskazywało, że obsługa SSH będzie integralną częścią PowerShell. Otworzyło to możliwość zdalnego administrowania systemami Windows i Linux z łatwością przy użyciu tych samych technologii.
krótka historia remotowania PowerShell
Microsoft wprowadził remotowanie w wersji PowerShell 2.0 W Windows 7 i Windows Server 2008 R2, co radykalnie zmieniło krajobraz dla administratorów Windows. Mogli tworzyć zdalne sesje pulpitu na serwerach, ale remoting PowerShell umożliwił jednoczesne zarządzanie dużą liczbą serwerów.
Remoting w Windows PowerShell jest oparty na WS-MAN, otwartym standardzie z grupy zadań zarządzania rozproszonego. Ale ponieważ ws-MAN-based remoting jest zorientowany na Windows, trzeba było użyć innej technologii, Zwykle SSH, do administrowania systemami Linux.
wprowadzenie SSH na rdzeń PowerShell
SSH jest protokołem do zarządzania systemami w potencjalnie niezabezpieczonej sieci. SSH działa w trybie klient-serwer i jest de facto standardem zdalnej administracji w środowiskach Linuksowych.
PowerShell Core używa OpenSSH, forka z SSH 1.2.12, który został wydany na licencji open source. OpenSSH jest prawdopodobnie najpopularniejszą implementacją SSH.
kod wymagany do użycia WS-MAN remoting jest instalowany jako część systemu operacyjnego Windows. Musisz zainstalować OpenSSH ręcznie.
instalacja OpenSSH
przyzwyczailiśmy się do instalowania oprogramowania w systemie Windows za pomocą kreatorów, ale instalacja OpenSSH wymaga więcej informacji i więcej pracy od administratora. Bez ręcznej interwencji może pojawić się wiele problemów.
proces instalacji OpenSSH w systemie Windows poprawił się z czasem, ale nadal nie jest tak łatwy, jak powinien być. Praca z plikiem konfiguracyjnym pozostawia wiele do życzenia.
istnieją dwie opcje podczas instalacji PowerShell SSH:
- w systemach Windows 10 1809, Windows Server 1809, Windows Server 2019 i nowszych OpenSSH jest dostępny jako Opcjonalna funkcja.
- we wcześniejszych wersjach systemu Windows możesz pobrać i zainstalować OpenSSH z GitHub.
przed zainstalowaniem OpenSSH upewnij się, że Twój system ma najnowsze poprawki.
instalowanie opcjonalnej funkcji OpenSSH
możesz zainstalować opcjonalną funkcję OpenSSH za pomocą PowerShell. Najpierw sprawdź swój system za pomocą następującego polecenia:
Get-WindowsCapability -Online | where Name -like '*SSH*'
Rysunek 1 pokazuje preinstalowane oprogramowanie klienta OpenSSH.
do instalacji musisz użyć Windows PowerShell, chyba że pobierzesz moduł WindowsCompatibility dla rdzenia PowerShell. Następnie możesz zaimportować moduł obsługi i zarządzania obrazem wdrożenia z Windows PowerShell i uruchomić polecenia w PowerShell Core.
zainstaluj funkcję serwera:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Path :
Online : True
RestartNeeded : False
pliki SSH instalują się w C:\Windows\System32\OpenSSH folder.
Pobierz OpenSSH z GitHub
zacznij od pobrania najnowszej wersji z GitHub. Najnowsza wersja instrukcji instalacji znajduje się pod tym linkiem.
Po zakończeniu pobierania rozpakuj plik zip do C:\Program Files \ OpenSSH folder. Zmień lokalizację na C:\Program Files \ OpenSSH aby zainstalować usługi SSH:
.\install-sshd.ps1
SetServiceObjectSecurity SUCCESS
ChangeServiceConfig2 SUCCESS
ChangeServiceConfig2 SUCCESS
Konfigurowanie OpenSSH
Po zainstalowaniu OpenSSH wykonaj dodatkowe kroki konfiguracyjne.
upewnij się, że folder OpenSSH znajduje się w zmiennej środowiskowej system path:
- C:\Windows\System32\OpenSSH\ jeśli jest zainstalowany jako opcja Windows
- C:\Program Files\OpenSSH\ if installed via the OpenSSH download
Set the two services to start automatically:
Set-Service sshd -StartupType Automatic
Set-Service ssh-agent -StartupType Automatic
Jeśli zainstalowano OpenSSH z opcjonalną funkcją, System Windows tworzy nową regułę zapory, aby umożliwić przychodzący dostęp SSH przez port 22. Jeśli zainstalowałeś OpenSSH z pobrania, Utwórz regułę zapory za pomocą tego polecenia:
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' `
-Enabled True -Direction Inbound -Protocol TCP `
-Action Allow -LocalPort 22
Uruchom usługę SSHD, aby wygenerować klucze SSH:
Start-Service sshd
klucze SSH i plik konfiguracyjny znajdują się w C:\ProgramData\ssh, czyli ukryty folder. Domyślną powłoką używaną przez SSH jest powłoka poleceń systemu Windows. To musi zmienić się na PowerShell:
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell `
-Value "C:\Program Files\PowerShell\6\pwsh.exe" -PropertyType String -Force
teraz, gdy połączysz się z systemem przez SSH, uruchomi się rdzeń PowerShell i będzie domyślną powłoką. W razie potrzeby można również utworzyć domyślną PowerShell Windows.
jest błąd w OpenSSH w Windows. Nie działa ze ścieżkami ze spacją, takimi jak ścieżka do pliku wykonywalnego PowerShell Core! Obejście polega na stworzeniu dowiązania symbolicznego, które tworzy ścieżkę, której OpenSSH może użyć:
New-Item -ItemType SymbolicLink -Path C:\pwsh -Target 'C:\Program Files\PowerShell\6'
w pliku sshd_config Usuń komentarz z następujących linii:
PubkeyAuthentication yes
PasswordAuthentication yes
Dodaj tę linię przed innymi liniami podsystemu:
Subsystem powershell C:\pwsh\pwsh.exe -sshs -NoLogo -NoProfile
To mówi OpenSSH do uruchomienia PowerShell Core.
Skomentuj wiersz:
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
Po zapisaniu zmian w pliku sshd_config, uruchom ponownie usługi:
Restart-Service sshd
Start-Service ssh-agent
po każdej zmianie pliku konfiguracyjnego musisz ponownie uruchomić usługę SSHD.
używanie PowerShell SSH remoting
używanie remoting over SSH jest bardzo podobne do remoting over ws-MAN. Możesz uzyskać bezpośredni dostęp do zdalnego systemu za pomocą polecenia Invoke-Command:
Invoke-Command -HostName W19DC01 -ScriptBlock {Get-Process}
richard@MANTICORE@w19dc01's password:
pojawi się monit o hasło, które nie będzie wyświetlane podczas wpisywania.
Jeśli po raz pierwszy łączysz się ze zdalnym systemem przez SSH, zobaczysz komunikat podobny do tego:
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)?
wpisz yes i naciśnij Enter.
możesz utworzyć sesję remotowania:
$sshs = New-PSSession -HostName W19FS01
richard@MANTICORE@w19fs01's password:
a następnie użyć jej:
Invoke-Command -Session $sshs -ScriptBlock {$env:COMPUTERNAME}
W19FS01
możesz wprowadzić sesję Remotowania OpenSSH za pomocą Enter-PSSession w taki sam sposób, jak sesja WS-MAN. Możesz wprowadzić istniejącą sesję lub użyć parametru HostName w Enter-PSSession, aby utworzyć sesję interaktywną.
nie można odłączyć sesji opartej na SSH; to technika WS-MAN.
możesz używać sesji WS-MAN i SSH do zarządzania wieloma komputerami, jak pokazano na rysunku 2.
informacje o sesji pokazują inny mechanizm transportu-odpowiednio WS-MAN i SSH-oraz punkt końcowy używany przez każdą sesję.
jeśli przyjrzysz się dokładnie Rys. 2, zauważysz, że nie było monitu o hasło w sesji SSH, ponieważ system został skonfigurowany z uwierzytelnianiem opartym na kluczach SSH.
Korzystanie z uwierzytelniania opartego na kluczach SSH
Otwórz podwyższoną sesję PowerShell. Zmień lokalizację na .folder ssh w obszarze użytkownika:
Set-Location -Path ~\.ssh
Wygeneruj parę kluczy:
ssh-keygen -t ed25519
Dodaj plik klucza do agenta SSH na komputerze lokalnym:
ssh-add id_ed25519
Po dodaniu klucza prywatnego do ssh-agent, Utwórz kopię zapasową klucza prywatnego w bezpiecznej lokalizacji i usuń klucz z komputera lokalnego.
skopiuj id_ed25519.pub plik do .folder SSH dla pasującego konta użytkownika na zdalnym serwerze. W razie potrzeby możesz utworzyć takie konto:
$pwd = Read-Host -Prompt 'Password' -AsSecureString
Password: ********
New-LocalUser -Name Richard -Password $pwd -PasswordNeverExpires
Add-LocalGroupMember -Group Administrators -Member Richard
na zdalnym komputerze skopiuj zawartość pliku klucza do pliku authorized_keys:
scp id_ed25519.pub authorized_keys
plik authorized_keys wymaga zmiany uprawnień:
- Otwórz Eksplorator plików, kliknij prawym przyciskiem myszy authorized_keys i przejdź do Właściwości – bezpieczeństwo – zaawansowane
- kliknij Wyłącz dziedziczenie.
- wybierz Konwertuj odziedziczone uprawnienia na uprawnienia jawne dla tego obiektu.
- Usuń wszystkie uprawnienia z wyjątkiem systemu i konta użytkownika. Obie powinny mieć pełną kontrolę.
zobaczysz odniesienia do używania modułu OpenSSHUtils do ustawiania uprawnień, ale jest błąd w wersji z galerii PowerShell, który sprawia, że plik authorized_keys jest bezużyteczny.
Uruchom ponownie usługę sshd na zdalnym komputerze.
Możesz teraz połączyć się ze zdalnym komputerem bez użycia hasła, jak pokazano na rysunku 2.
Jeśli łączysz się z maszyną spoza domeny z maszyny w domenie, musisz użyć parametru nazwa użytkownika po włączeniu uwierzytelniania pary kluczy:
$ss = New-PSSession -HostName W19ND01 -UserName Richard
potrzebujesz nazwy użytkownika na zdalnym komputerze, aby pasowała do nazwy użytkownika domeny. Nie zostaniesz poproszony o podanie hasła.
ws-MAN czy SSH remoting?
czy powinieneś używać remotingu opartego na WS-MAN czy SSH? Ws-MAN remoting jest dostępny we wszystkich systemach Windows i jest domyślnie włączony w systemie Windows Server 2012 i nowszych wersjach serwera. Ws-MAN remoting ma pewne problemy, zwłaszcza problem podwójnego hopu. WS-MAN potrzebuje również dodatkowej pracy, aby zdalnie do systemów nie domenowych.
SSH remoting jest dostępny tylko w PowerShell Core; Windows PowerShell jest ograniczony do ws-MAN remoting. Instalacja i konfiguracja remotingu SSH wymaga znacznego nakładu pracy. Dokumentacja nie jest tak dobra, jak powinna być. Zaletą remotingu SSH jest to, że można łatwo uzyskać dostęp do maszyn spoza domeny i systemów innych niż Windows, w których SSH jest standardem zdalnego dostępu.