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-PSSessioncmdlet , Enter-PSSessioni 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

  1. 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
    
  2. 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.

  3. 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 zwykle Progra~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.

  4. Uruchom ponownie usługę sshd.

    Restart-Service sshd
    
  5. Dodaj ścieżkę, w której zainstalowano protokół OpenSSH do zmiennej środowiskowej Path. Na przykład C:\Program Files\OpenSSH\. Ten wpis umożliwia odnalezienie ssh.exe elementu .

Instalowanie usługi SSH na komputerze z systemem Ubuntu Linux

  1. Zainstaluj najnowszą wersję programu PowerShell, zobacz Instalowanie programu PowerShell w systemie Ubuntu.

  2. Zainstaluj serwer Ubuntu OpenSSH.

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. 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.

  4. Uruchom ponownie usługę SSH .

    sudo systemctl restart sshd.service
    

Instalowanie usługi SSH na komputerze z systemem macOS

  1. 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:

    1. Otwórz System Settings.
    2. Kliknij pozycję General
    3. Kliknij pozycję Sharing.
    4. Zaznacz Remote Login , aby ustawić wartość Remote Login: On.
    5. Zezwalaj na dostęp do odpowiednich użytkowników.
  2. 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
    
  3. 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 $PROFILEusł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-PSSessionEnter-PSHostProcess pracę i pracę z poziomu dowolnej interaktywnej sesji zdalnej.

Zobacz też