Obsługa zdalna programu PowerShell za pośrednictwem protokołu SSH

Omówienie

Komunikacja zdalna programu PowerShell zwykle używa usługi WinRM do negocjowania połączenia i transportu danych. SSH jest teraz dostępny dla platform Linux i Windows platform i umożliwia prawdziwą zdalną komunikacja zdalną programu PowerShell dla wielu platform.

Usługa WinRM zapewnia niezawodny model hostingu dla sesji zdalnych programu PowerShell. Komunikacja zdalna oparta na połączeniach SSH nie obsługuje obecnie konfiguracji zdalnego punktu końcowego i funkcji Just Enough Administration (JEA).

Komunikacja zdalna SSH umożliwia podstawową zdalną komunikacja sesji programu PowerShell między Windows komputerami z systemem Linux. Zdalna komunikacja SSH tworzy proces hosta programu PowerShell na komputerze docelowym jako podsystem SSH. Po pewnym czasie zaim implementowany będzie ogólny model hostingu, podobny do usługi WinRM, w celu obsługi konfiguracji punktu końcowego i usługi JEA.

Polecenia cmdlet , i mają teraz nowy zestaw parametrów do obsługi New-PSSession tego nowego połączenia komunikacji Enter-PSSession Invoke-Command zdalnej.

[-HostName <string>]  [-UserName <string>]  [-KeyFilePath <string>]

Aby utworzyć sesję zdalną, należy określić komputer docelowy za pomocą parametru HostName i podać nazwę użytkownika za pomocą username. Podczas interakcyjnego uruchamiania poleceń cmdlet zostanie wyświetlony monit o hasło. Możesz również użyć uwierzytelniania klucza SSH przy użyciu pliku klucza prywatnego z parametrem KeyFilePath. Tworzenie kluczy do uwierzytelniania SSH różni się w zależności od platformy.

Ogólne informacje o konfiguracji

Na wszystkich komputerach musi być zainstalowany program PowerShell 6 lub wyższy, a na wszystkich komputerach musi być zainstalowany program SSH. Zainstaluj klienta SSH ( ) i serwer ( ), aby można było zdalnie do ssh.exe sshd.exe i z komputerów. Program OpenSSH dla Windows jest teraz dostępny w kompilacji Windows 10 1809 i Windows Server 2019. Aby uzyskać więcej informacji, zobacz Manage Windows with OpenSSH (Zarządzanie Windows openSSH). W przypadku systemu Linux zainstaluj SSH, w tym serwer sshd, który jest odpowiedni dla Twojej platformy. Należy również zainstalować program PowerShell z GitHub, aby uzyskać funkcję komunikacji zdalnej SSH. 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.

Konfigurowanie na komputerze Windows komputera

  1. Zainstaluj najnowszą wersję programu PowerShell. Aby uzyskać więcej informacji, zobacz Instalowanie PowerShell Core na Windows.

    Możesz potwierdzić, że program PowerShell obsługuje zdalną obsługę SSH, wymieniając New-PSSession zestawy parametrów. Zauważysz, że istnieją nazwy zestawu parametrów, które zaczynają się od SSH. Te zestawy parametrów zawierają parametry SSH.

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. Zainstaluj najnowszą wersję win32 OpenSSH. Aby uzyskać instrukcje dotyczące instalacji, zobacz Getting started with OpenSSH (Wprowadzenie do programu OpenSSH).

    Uwaga

    Jeśli chcesz ustawić program PowerShell jako domyślną powłokę dla programu OpenSSH, zobacz Konfigurowanie programu Windows dla programu OpenSSH.

  3. Edytuj plik sshd_config znajdujący się w pliku $env:ProgramData\ssh .

    Upewnij się, że włączono uwierzytelnianie hasłem:

    PasswordAuthentication yes
    

    Utwórz podsystem SSH, który hostuje proces programu PowerShell na komputerze zdalnym:

    Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo
    

    Uwaga

    Domyślna lokalizacja pliku wykonywalnego programu PowerShell to 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. Istnieje usterka w programie OpenSSH dla Windows która uniemożliwia pracę spacji w ścieżkach wykonywalnych podsystemu. Aby uzyskać więcej informacji, zobacz ten GitHub problem.

    Krótka nazwa folderu w programie to 8.3 Windows Program Files to zazwyczaj Progra~1 . Można jednak użyć następującego polecenia, aby się upewnić:

    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 Managing OpenSSH Keys (Zarządzanie kluczami OpenSSH).

  4. Uruchom ponownie usługę sshd.

    Restart-Service sshd
    
  5. Dodaj ścieżkę, w której jest instalowany program OpenSSH, do zmiennej środowiskowej Path. Na przykład C:\Program Files\OpenSSH\. Ten wpis umożliwia ssh.exe znaleźć.

Konfigurowanie na komputerze z systemem Ubuntu 16.04 z systemem Linux

  1. Zainstaluj najnowszą wersję programu PowerShell. Zobacz Installing PowerShell Core on Linux (Instalowanie programu PowerShell Core systemie Linux).

  2. Zainstaluj serwer Ubuntu OpenSSH.

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. Edytuj sshd_config plik w lokalizacji /etc/ssh .

    Upewnij się, że włączono uwierzytelnianie hasłem:

    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 dla klucza ssh-keygen.

    Dodaj wpis podsystemu PowerShell:

    Subsystem powershell /usr/bin/pwsh -sshs -NoLogo
    

    Uwaga

    Domyślna lokalizacja pliku wykonywalnego programu PowerShell to /usr/bin/pwsh . Lokalizacja może się różnić w zależności od sposobu instalacji programu PowerShell.

  4. Uruchom ponownie usługę SSH.

    sudo service ssh restart
    

Konfigurowanie na komputerze z systemem macOS

  1. Zainstaluj najnowszą wersję programu PowerShell. Aby uzyskać więcej informacji, PowerShell Core w systemie macOS.

    Upewnij się, że komunikacja zdalna SSH jest włączona, wykonać następujące kroki:

    1. Otwórz plik System Preferences.
    2. Kliknij pozycję Sharing.
    3. Sprawdź, Remote Login czy ustawiono Remote Login: On wartość .
    4. Zezwalaj na dostęp odpowiednim użytkownikom.
  2. Edytuj sshd_config 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 hasłem:

    PasswordAuthentication yes
    

    Dodaj wpis podsystemu PowerShell:

    Subsystem powershell /usr/local/bin/pwsh -sshs -NoLogo
    

    Uwaga

    Domyślna lokalizacja pliku wykonywalnego programu PowerShell to /usr/local/bin/pwsh . Lokalizacja może się różnić w zależności od sposobu instalacji programu PowerShell.

    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
    

Authentication

Komunikacja zdalna programu PowerShell za pośrednictwem protokołu SSH opiera się 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 protokoły SSH i niezależne od programu PowerShell. Na przykład można skonfigurować usługę SSH tak, aby wymagała uwierzytelniania za pomocą klucza publicznego i hasła raz w celu dodania zabezpieczeń. Konfiguracja uwierzytelniania wieloskładnikowego jest poza zakresem tej dokumentacji. Zapoznaj się z dokumentacją protokołu SSH, aby dowiedzieć się, jak poprawnie skonfigurować uwierzytelnianie wieloskładnikowe i sprawdzić, czy działa ono poza programem PowerShell, zanim spróbujesz użyć go z usługą zdalną programu PowerShell.

Uwaga

Użytkownicy zachowują te same uprawnienia w sesjach zdalnych. Oznacza to, że administratorzy mają dostęp do powłoki z podwyższonym poziomem uprawnień, a normalni użytkownicy nie.

Przykład komunikacji zdalnej programu PowerShell

Najprostszym sposobem przetestowania komunikacji zdalnej jest wypróbowanie jej na jednym komputerze. W tym przykładzie tworzymy sesję zdalną z powrotem do tego samego komputera z systemem Linux. Używamy poleceń cmdlet programu PowerShell interaktywnie, więc widzimy monity od SSH z prośbą o zweryfikowanie komputera hosta i monitowanie o hasło. To samo można zrobić na komputerze Windows, aby upewnić się, że komunikacja zdalna działa. Następnie należy zdalnie na różnych komputerach zmienić nazwę hosta.

# Linux to Linux
#
$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' cannot 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 powershell }
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName                    PSComputerName
-------  ------    -----      -----     ------     --  -- -----------                    --------------
      0       0        0         19       3.23  10635 635 powershell                     UbuntuVM1
      0       0        0         21       4.92  11033 017 powershell                     UbuntuVM1
      0       0        0         20       3.07  11076 076 powershell                     UbuntuVM1
#
# Linux to 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 to 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 z komputerem z systemem Linux.

  • PsRemoting za pośrednictwem SSH nie obsługuje profilów i nie ma dostępu do programu $PROFILE . Po zakończeniu sesji możesz załadować profil, korzystając z kropki, korzystając z pełnej ścieżki pliku. Nie jest to związane z profilami SSH. Serwer SSH można skonfigurować do używania programu PowerShell jako domyślnej powłoki i ładowania profilu za pośrednictwem SSH. Aby uzyskać więcej informacji, zobacz dokumentację SSH.

  • W systemach wcześniejszych niż PowerShell 7.1 komunikacja zdalna za pośrednictwem połączenia SSH nie obsługiła sesji zdalnych z drugim przeskoku. Ta możliwość była ograniczona do sesji korzystających z usługi WinRM. Program PowerShell 7.1 umożliwia Enter-PSSession i pracę z poziomu dowolnej Enter-PSHostProcess interaktywnej sesji zdalnej.

Zobacz też

Instalowanie programu PowerShell Core w systemie Linux

Instalowanie programu PowerShell Core w systemie macOS

Instalowanie programu PowerShell Core w systemie Windows

Zarządzanie Windows za pomocą openSSH

Zarządzanie kluczami OpenSSH

Ubuntu SSH