Удаленное взаимодействие с PowerShell через SSH

Обзор

Функция удаленного взаимодействия PowerShell обычно использует WinRM для согласования соединения и передачи данных. Теперь протокол SSH доступен на платформах Linux и Windows, что позволяет осуществлять многоплатформенное удаленное взаимодействие с PowerShell.

Служба удаленного управления Windows обеспечивает надежную модель поддержки удаленных сеансов PowerShell. Удаленное взаимодействие по протоколу SSH сейчас не поддерживает настройку удаленных конечных точек и функцию JEA (Just Enough Administration).

Удаленное взаимодействие по SSH позволяет осуществлять базовое удаленное взаимодействие между компьютерами с Windows и Linux в рамках сеансов PowerShell. Функция удаленного взаимодействия по SSH создает хост-процесс PowerShell на целевом компьютере в качестве подсистемы SSH. Со временем для поддержки настройки удаленных конечных точек и функции JEA мы реализуем общую модель размещения, похожую на службе удаленного управления Windows.

Командлеты New-PSSession, Enter-PSSession и Invoke-Command теперь имеют набор новых параметров для поддержки этой возможности удаленного взаимодействия.

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

Чтобы создать удаленный сеанс, укажите целевой компьютер с помощью параметра HostName и имя пользователя с помощью параметра UserName. При интерактивном выполнении командлетов отображается запрос на ввод пароля. Вы также можете использовать проверку подлинности ключа SSH с помощью файла закрытого ключа с параметром KeyFilePath. Способ создания ключей для проверки подлинности по протоколу SSH зависит от платформы.

Общие сведения об установке

PowerShell 6 или более поздней версии, и на всех компьютерах должен быть установлен SSH. Установите клиент (ssh.exe) и сервер (sshd.exe) SSH, чтобы осуществлять удаленное взаимодействие между компьютерами. Решение OpenSSH для Windows теперь доступно в Windows 10 сборки 1809 и Windows Server 2019. Дополнительные сведения см. в статье Управление Windows через OpenSSH. В Linux нужно реализовать поддержку SSH (включая установку сервера sshd) в соответствии с используемой платформой. Также для поддержки удаленного взаимодействия по SSH нужно установить PowerShell с сайта GitHub. Для сервера SSH нужно настроить возможность создать подсистему SSH для размещения процесса PowerShell на удаленном компьютере. Также нужно активировать проверку подлинности на основе пароля или ключа.

Установка службы SSH на компьютере Windows

  1. Установите последнюю версию PowerShell. Дополнительные сведения см. в статье Установка PowerShell в Windows.

    Чтобы убедиться, что в PowerShell есть поддержка удаленного взаимодействия SSH, перечислите наборы параметров New-PSSession. Обратите внимание на наличие имен наборов параметров, начинающихся с SSH. К этим наборам параметров относятся параметры SSH.

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. Установите последнюю версию Win32 OpenSSH. Инструкции по установке см. в разделе Начало работы с OpenSSH.

    Примечание.

    Если вы хотите задать PowerShell в качестве оболочки по умолчанию для OpenSSH, см. раздел Настройка Windows для OpenSSH.

  3. Измените файл sshd_config, расположенный в $env:ProgramData\ssh.

    Включите проверку подлинности с помощью пароля:

    PasswordAuthentication yes
    

    Создайте подсистему SSH, в которой размещается процесс PowerShell на удаленном компьютере:

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

    Примечание.

    Начиная с PowerShell 7.4, больше не нужно использовать -nologo параметр при запуске PowerShell в режиме сервера SSH.

    Примечание.

    Расположение исполняемого файла PowerShell по умолчанию — c:/progra~1/powershell/7/pwsh.exe. Расположение может различаться в зависимости от способа установки PowerShell.

    Необходимо использовать краткое имя 8.3 для всех путей к файлам, содержащим пробелы. В OpenSSH для Windows обнаружена ошибка, блокирующая работу пробелов в путях к исполняемым файлам подсистемы. Дополнительные сведения см. здесь на GitHub.

    Обычно краткое имя 8.3 для папки Program Files в Windows — это Progra~1. Тем не менее для проверки можно использовать следующую команду:

    Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' |
      Select-Object EightDotThreeFileName
    
    EightDotThreeFileName
    ---------------------
    c:\progra~1
    

    При необходимости включите проверку подлинности на основе ключа:

    PubkeyAuthentication yes
    

    Дополнительные сведения см. в статье Управление ключами OpenSSH.

  4. Перезапустите службу sshd.

    Restart-Service sshd
    
  5. Добавьте путь установки OpenSSH в свою переменную среды Path. Например, C:\Program Files\OpenSSH\. Это позволит найти файл ssh.exe.

Установка службы SSH на компьютере Ubuntu Linux

  1. Установите последнюю версию PowerShell, см. статью "Установка PowerShell в Ubuntu".

  2. Установите сервер OpenSSH для Ubuntu.

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. Измените файл sshd_config в расположении /etc/ssh.

    Включите проверку подлинности с помощью пароля:

    PasswordAuthentication yes
    

    При необходимости включите проверку подлинности на основе ключа:

    PubkeyAuthentication yes
    

    Дополнительные сведения о создании ключей SSH в Ubuntu см. на странице справки по ssh-keygen.

    Добавьте запись подсистемы PowerShell:

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

    Примечание.

    Расположение исполняемого файла PowerShell по умолчанию — /usr/bin/pwsh. Расположение может различаться в зависимости от способа установки PowerShell.

    Примечание.

    Начиная с PowerShell 7.4, больше не нужно использовать -nologo параметр при запуске PowerShell в режиме сервера SSH.

  4. Перезапустите службу ssh.

    sudo systemctl restart sshd.service
    

Установка службы SSH на компьютере macOS

  1. Установите последнюю версию PowerShell. Дополнительные сведения об установке PowerShell в macOS.

    Убедитесь, что удаленное взаимодействие SSH включено, выполните следующие действия:

    1. Открыть System Settings.
    2. Щелкните General
    3. Нажмите Sharing.
    4. Установите флажок Remote Login, чтобы задать Remote Login: On.
    5. Разрешите доступ соответствующим пользователям.
  2. Измените файл sshd_config в расположении /private/etc/ssh/sshd_config.

    Используйте текстовый редактор, например nano:

    sudo nano /private/etc/ssh/sshd_config
    

    Включите проверку подлинности с помощью пароля:

    PasswordAuthentication yes
    

    Добавьте запись подсистемы PowerShell:

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

    Примечание.

    Расположение исполняемого файла PowerShell по умолчанию — /usr/local/bin/pwsh. Расположение может различаться в зависимости от способа установки PowerShell.

    Примечание.

    Начиная с PowerShell 7.4, больше не нужно использовать -nologo параметр при запуске PowerShell в режиме сервера SSH.

    При необходимости включите проверку подлинности на основе ключа:

    PubkeyAuthentication yes
    
  3. Перезапустите службу sshd.

    sudo launchctl stop com.openssh.sshd
    sudo launchctl start com.openssh.sshd
    

Примечание.

При обновлении операционной системы файл конфигурации SSH может быть перезаписан. Убедитесь, что после обновления проверка файл конфигурации.

Проверка подлинности

При удаленном взаимодействии с PowerShell через SSH используется обмен данными для проверки подлинности между клиентом SSH и службой SSH. Схемы проверки подлинности в его рамках не реализуются. Это означает, что любые настроенные схемы проверки подлинности, включая многофакторную проверку подлинности, обрабатываются протоколом SSH независимо от PowerShell. Например, в службе SSH можно настроить обязательное применение проверки подлинности на основе открытых ключей, а также разовых паролей для усиления безопасности. Настройка многофакторной проверки подлинности выходит за рамки настоящего документа. Сведения о том, как правильно настроить многофакторную проверку подлинности и проверить ее работу вне PowerShell, прежде чем пытаться использовать ее для удаленного взаимодействия с PowerShell, см. в документации по SSH.

Примечание.

Пользователи сохраняют те же привилегии в удаленных сеансах. Это означает, что Администратор istrator имеют доступ к оболочке с повышенными привилегиями, а обычные пользователи не имеют доступа.

Пример удаленного взаимодействия PowerShell

Проще всего проверить удаленное взаимодействие на одном компьютере. В этом примере мы создадим удаленный сеанс с одним и тем же компьютером Linux. Командлеты PowerShell мы выполняем в интерактивном режиме, поэтому мы увидим запрос от SSH на проверку удаленного компьютера, а также запрос на ввод пароля. Чтобы убедиться, что удаленное взаимодействие работает, те же операции можно выполнить на компьютере Windows. Затем установите удаленное подключение между компьютерами, изменив имя узла.

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

Linux в 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 в 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>

Ограничения

  • Команда sudo не работает в рамках сеанса удаленного взаимодействия с компьютером Linux.

  • PSRemoting по протоколу SSH не поддерживает профили и не имеет доступа к $PROFILE. После входа в сеанс можно загрузить профиль с помощью вызова с точкой, указав полный путь к профилю. Это не связано с профилями SSH. Вы можете настроить SSH-сервер для использования PowerShell в качестве оболочки по умолчанию и для загрузки профиля через SSH. Дополнительные сведения см. в документации по SSH.

  • До PowerShell 7.1 удаленное взаимодействие через SSH не поддерживает удаленные сеансы второго прыжка. Эта возможность была ограничена сеансами через WinRM. PowerShell 7.1 позволяет Enter-PSSession и Enter-PSHostProcess работать в любом интерактивном удаленном сеансе.

См. также