Obsługa zdalna programu PowerShell za pośrednictwem protokołu SSH
Omówienie
Komunikacja zdalna programu PowerShell zwykle używa usługi WinRM do negocjacji połączenia i transportu danych. Protokół SSH jest teraz dostępny dla platform z systemami Linux i Windows i umożliwia nawiązywanie komunikacji zdalnej programu PowerShell z rzeczywistymi platformami wieloplatformowymi.
Usługa WinRM zapewnia niezawodny model hostingu dla sesji zdalnych programu PowerShell. Komunikacja zdalna oparta na protokole SSH nie obsługuje obecnie konfiguracji zdalnego punktu końcowego i funkcji Just Enough Administracja istration (JEA).
Komunikacja zdalna SSH umożliwia wykonywanie podstawowych komunikacji zdalnej sesji programu PowerShell między komputerami z systemem Windows i Linux. Komunikacja zdalna SSH tworzy proces hosta programu PowerShell na komputerze docelowym jako podsystem SSH. W końcu zaimplementujemy ogólny model hostingu, podobny do winRM, aby obsługiwać konfigurację punktu końcowego i usługę JEA.
Polecenia New-PSSession
cmdlet , Enter-PSSession
i Invoke-Command
mają teraz nowy zestaw parametrów, aby obsługiwać to nowe połączenie komunikacji wirtualnej.
[-HostName <string>] [-UserName <string>] [-KeyFilePath <string>]
Aby utworzyć sesję zdalną, należy określić komputer docelowy z parametrem HostName i podać nazwę użytkownika userName. Podczas interakcyjnego uruchamiania poleceń cmdlet zostanie wyświetlony monit o podanie hasła. Uwierzytelnianie za pomocą klucza SSH można również użyć przy użyciu pliku klucza prywatnego z parametrem KeyFilePath . Tworzenie kluczy na potrzeby uwierzytelniania SSH różni się w zależności od platformy.
Ogólne informacje o konfiguracji
Program PowerShell 6 lub nowszy i protokół SSH musi być zainstalowany na wszystkich komputerach. Zainstaluj zarówno klienta SSH (ssh.exe
) jak i serwera (sshd.exe
), aby umożliwić zdalny dostęp do i z komputerów. Protokół OpenSSH dla systemu Windows jest teraz dostępny w systemie Windows 10 build 1809 i Windows Server 2019. Aby uzyskać więcej informacji, zobacz Zarządzanie systemem Windows przy użyciu protokołu OpenSSH. W przypadku systemu Linux zainstaluj protokół SSH, w tym serwer sshd, który jest odpowiedni dla twojej platformy. Aby uzyskać funkcję komunikacji zdalnej SSH, należy również zainstalować program PowerShell z usługi GitHub.
Serwer SSH musi być skonfigurowany do tworzenia podsystemu SSH do hostowania procesu programu PowerShell na komputerze zdalnym. Należy również włączyć uwierzytelnianie oparte na hasłach lub kluczach.
Instalowanie usługi SSH na komputerze z systemem Windows
Zainstaluj najnowszą wersję programu PowerShell. Aby uzyskać więcej informacji, zobacz Instalowanie programu PowerShell w systemie Windows.
Możesz potwierdzić, że program PowerShell ma obsługę komunikacji zdalnej
New-PSSession
SSH, wyświetlając listę zestawów parametrów. Zauważysz, że istnieją nazwy zestawów parametrów rozpoczynające się od protokołu SSH. Te zestawy parametrów obejmują parametry SSH .(Get-Command New-PSSession).ParameterSets.Name
Name ---- SSHHost SSHHostHashParam
Zainstaluj najnowszą wersję systemu Win32 OpenSSH. Aby uzyskać instrukcje dotyczące instalacji, zobacz Wprowadzenie do protokołu OpenSSH.
Uwaga
Jeśli chcesz ustawić program PowerShell jako domyślną powłokę dla protokołu OpenSSH, zobacz Konfigurowanie systemu Windows dla protokołu OpenSSH.
sshd_config
Edytuj plik znajdujący się w lokalizacji$env:ProgramData\ssh
.Upewnij się, że włączono uwierzytelnianie haseł:
PasswordAuthentication yes
Utwórz podsystem SSH hostujący proces programu PowerShell na komputerze zdalnym:
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -nologo
Uwaga
Począwszy od programu PowerShell 7.4, nie trzeba już używać parametru
-nologo
podczas uruchamiania programu PowerShell w trybie serwera SSH.Uwaga
Domyślną lokalizacją pliku wykonywalnego programu PowerShell jest
c:/progra~1/powershell/7/pwsh.exe
. Lokalizacja może się różnić w zależności od sposobu instalacji programu PowerShell.Należy użyć krótkiej nazwy 8.3 dla wszystkich ścieżek plików, które zawierają spacje. W systemie Windows występuje usterka dotycząca protokołu OpenSSH, która uniemożliwia działanie spacji w ścieżkach wykonywalnych podsystemu. Aby uzyskać więcej informacji, zobacz ten problem w serwisie GitHub.
Krótka nazwa
Program Files
folderu w systemie Windows w wersji 8.3 to zwykleProgra~1
. Można jednak użyć następującego polecenia, aby upewnić się, że:Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' | Select-Object EightDotThreeFileName
EightDotThreeFileName --------------------- c:\progra~1
Opcjonalnie włącz uwierzytelnianie za pomocą klucza:
PubkeyAuthentication yes
Aby uzyskać więcej informacji, zobacz Zarządzanie kluczami OpenSSH.
Uruchom ponownie usługę sshd.
Restart-Service sshd
Dodaj ścieżkę, w której zainstalowano protokół OpenSSH do zmiennej środowiskowej Path. Na przykład
C:\Program Files\OpenSSH\
. Ten wpis umożliwia odnalezieniessh.exe
elementu .
Instalowanie usługi SSH na komputerze z systemem Ubuntu Linux
Zainstaluj najnowszą wersję programu PowerShell, zobacz Instalowanie programu PowerShell w systemie Ubuntu.
Zainstaluj serwer Ubuntu OpenSSH.
sudo apt install openssh-client sudo apt install openssh-server
sshd_config
Edytuj plik w lokalizacji/etc/ssh
.Upewnij się, że włączono uwierzytelnianie haseł:
PasswordAuthentication yes
Opcjonalnie włącz uwierzytelnianie za pomocą klucza:
PubkeyAuthentication yes
Aby uzyskać więcej informacji na temat tworzenia kluczy SSH w systemie Ubuntu, zobacz stronę manpage for ssh-keygen.
Dodaj wpis podsystemu programu PowerShell:
Subsystem powershell /usr/bin/pwsh -sshs -nologo
Uwaga
Domyślną lokalizacją pliku wykonywalnego programu PowerShell jest
/usr/bin/pwsh
. Lokalizacja może się różnić w zależności od sposobu instalacji programu PowerShell.Uwaga
Począwszy od programu PowerShell 7.4, nie trzeba już używać parametru
-nologo
podczas uruchamiania programu PowerShell w trybie serwera SSH.Uruchom ponownie usługę SSH .
sudo systemctl restart sshd.service
Instalowanie usługi SSH na komputerze z systemem macOS
Zainstaluj najnowszą wersję programu PowerShell. Aby uzyskać więcej informacji, instalowanie programu PowerShell w systemie macOS.
Upewnij się, że komunikacja zdalna SSH jest włączona, wykonując następujące kroki:
- Otwórz
System Settings
. - Kliknij pozycję
General
- Kliknij pozycję
Sharing
. - Zaznacz
Remote Login
, aby ustawić wartośćRemote Login: On
. - Zezwalaj na dostęp do odpowiednich użytkowników.
- Otwórz
sshd_config
Edytuj plik w lokalizacji/private/etc/ssh/sshd_config
.Użyj edytora tekstów, takiego jak nano:
sudo nano /private/etc/ssh/sshd_config
Upewnij się, że włączono uwierzytelnianie haseł:
PasswordAuthentication yes
Dodaj wpis podsystemu programu PowerShell:
Subsystem powershell /usr/local/bin/pwsh -sshs -nologo
Uwaga
Domyślną lokalizacją pliku wykonywalnego programu PowerShell jest
/usr/local/bin/pwsh
. Lokalizacja może się różnić w zależności od sposobu instalacji programu PowerShell.Uwaga
Począwszy od programu PowerShell 7.4, nie trzeba już używać parametru
-nologo
podczas uruchamiania programu PowerShell w trybie serwera SSH.Opcjonalnie włącz uwierzytelnianie za pomocą klucza:
PubkeyAuthentication yes
Uruchom ponownie usługę sshd.
sudo launchctl stop com.openssh.sshd sudo launchctl start com.openssh.sshd
Uwaga
Podczas uaktualniania systemu operacyjnego plik konfiguracji SSH może zostać zastąpiony. Upewnij się, że plik konfiguracji jest sprawdzany po uaktualnieniu.
Uwierzytelnianie
Komunikacja zdalna programu PowerShell za pośrednictwem protokołu SSH polega na wymianie uwierzytelniania między klientem SSH a usługą SSH i nie implementuje żadnych schematów uwierzytelniania. W rezultacie wszystkie skonfigurowane schematy uwierzytelniania, w tym uwierzytelnianie wieloskładnikowe, są obsługiwane przez protokół SSH i niezależne od programu PowerShell. Można na przykład skonfigurować usługę SSH tak, aby wymagała uwierzytelniania klucza publicznego i jednorazowego hasła w celu dodania zabezpieczeń. Konfiguracja uwierzytelniania wieloskładnikowego wykracza poza zakres tej dokumentacji. Zapoznaj się z dokumentacją protokołu SSH, aby dowiedzieć się, jak poprawnie skonfigurować uwierzytelnianie wieloskładnikowe i sprawdzić, czy działa poza programem PowerShell przed podjęciem próby użycia go za pomocą komunikacji zdalnej programu PowerShell.
Uwaga
Użytkownicy zachowują te same uprawnienia w sesjach zdalnych. Oznacza to, że Administracja istratory mają dostęp do powłoki z podwyższonym poziomem uprawnień, a normalni użytkownicy nie.
Przykład komunikacji zdalnej programu PowerShell
Najprostszym sposobem testowania komunikacji zdalniej jest wypróbowanie go na jednym komputerze. W tym przykładzie utworzymy sesję zdalną z powrotem na tym samym komputerze z systemem Linux. Używamy interakcyjnych poleceń cmdlet programu PowerShell, aby zobaczyć monity z protokołu SSH z prośbą o zweryfikowanie komputera hosta i wyświetlenie monitu o hasło. Możesz zrobić to samo na komputerze z systemem Windows, aby upewnić się, że komunikacja zdalna działa. Następnie zdalne między komputerami przez zmianę nazwy hosta.
Linux–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
System Linux do systemu 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 do systemu 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>
Ograniczenia
Polecenie sudo nie działa w sesji zdalnej na komputerze z systemem Linux.
Funkcja PSRemoting za pośrednictwem protokołu SSH nie obsługuje profilów i nie ma dostępu do
$PROFILE
usługi . Po zakończeniu sesji można załadować profil, określając kropkę określania profilu przy użyciu pełnej ścieżki plików. Nie jest to związane z profilami SSH. Serwer SSH można skonfigurować tak, aby używał programu PowerShell jako domyślnej powłoki i załadować profil za pośrednictwem protokołu SSH. Aby uzyskać więcej informacji, zobacz dokumentację protokołu SSH.Przed programem PowerShell 7.1 komunikacja zdalna za pośrednictwem protokołu SSH nie obsługiwała sesji zdalnych drugiego przeskoku. Ta funkcja była ograniczona do sesji przy użyciu usługi WinRM. Program PowerShell 7.1 umożliwia
Enter-PSSession
Enter-PSHostProcess
pracę i pracę z poziomu dowolnej interaktywnej sesji zdalnej.