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 systemów Linux i Windows platform i umożliwia naprawdę wieloplatformową zdalną komunikacji zdalnej programu PowerShell.

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ą sesję programu PowerShell między Windows komputerami z systemem Linux. Komunikacja zdalna SSH tworzy proces hosta programu PowerShell na komputerze docelowym jako podsystem SSH. W końcu zaim implementować będziemy ogólny model hostingu, podobny do usługi WinRM, w celu obsługi konfiguracji punktu końcowego i usługi JEA.

Polecenia New-PSSession Enter-PSSession cmdlet , i mają teraz nowy zestaw parametrów do obsługi Invoke-Command tego nowego połączenia komunikacji 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ą parametru UserName. Podczas interakcyjnego uruchamiania poleceń cmdlet zostanie wyświetlony monit o hasło. Można 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 Windows 10 kompilacji 1809 i Windows Server 2019. Aby uzyskać więcej informacji, zobacz Manage Windows with OpenSSH (Zarządzanie Windows za pomocą openSSH). W przypadku systemu Linux zainstaluj program 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.

Instalowanie usługi SSH na komputerze Windows lokalnym

  1. Zainstaluj najnowszą wersję programu PowerShell. Aby uzyskać więcej informacji, zobacz Instalowanie programu PowerShell 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 Configuring Windows for OpenSSH (Konfigurowanie programu Windows openSSH).

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

    Upewnij się, że włączono uwierzytelnianie za pomocą hasła:

    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 działanie spacji w ścieżkach wykonywalnych podsystemu. Aby uzyskać więcej informacji, zobacz ten GitHub problem.

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

    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 zainstalowany program OpenSSH, do zmiennej środowiskowej Path. Na przykład C:\Program Files\OpenSSH\. Ten wpis umożliwia ssh.exe znalezione.

Instalowanie usługi SSH na komputerze Ubuntu Linux lokalnym

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

  2. Zainstaluj system Ubuntu OpenSSH Server.

    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 za pomocą hasła:

    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 systemctl restart sshd.service
    

Instalowanie usługi SSH 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 do odpowiednich użytkowników.
  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 za pomocą hasła:

    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 do dodatkowych 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 przed podjęciem próby użycia go z usługą komunikacji zdalnej 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 monit o hasło. Możesz to zrobić na komputerze Windows, aby upewnić się, że komunikacja zdalna działa. Następnie należy zdalnie zmieniać nazwę hosta między komputerami.

# 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 w celu nakierowania profilu na pełną ścieżka 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 programu SSH. Aby uzyskać więcej informacji, zobacz dokumentację SSH.

  • Przed programem PowerShell 7.1 komunikacja zdalna za pośrednictwem połączenia SSH nie obsługiła sesji zdalnych drugiego 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 w systemie Linux

Instalowanie programu PowerShell w systemie macOS

Instalowanie programu PowerShell w systemie Windows

Zarządzanie Windows przy użyciu openssh

Zarządzanie kluczami OpenSSH

Ubuntu SSH