Поделиться через


Удалённое управление PowerShell через SSH

Обзор

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

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

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

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

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

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

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

PowerShell 6 или более поздней версии, а SSH должен быть установлен на всех компьютерах. Установите клиент SSH (ssh.exe) и сервер (sshd.exe), чтобы вы могли удаленно подключаться к компьютерам и с них. OpenSSH для Windows теперь доступен в windows 10 сборки 1809 и Windows Server 2019. Дополнительные сведения см. в статье Управление Windows с помощью OpenSSH. Для Linux установите SSH, включая сервер sshd, соответствующий вашей платформе. Кроме того, необходимо установить PowerShell из GitHub, чтобы получить функцию удаленного подключения SSH. Сервер 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. Установите сервер Ubuntu OpenSSH .

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

    Убедитесь, что проверка подлинности паролей включена:

    PasswordAuthentication yes
    

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

    PubkeyAuthentication yes
    

    Дополнительные сведения о создании ключей SSH в Ubuntu см. в странице man для 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, чтобы требовать проверку подлинности открытого ключа и одноразовый пароль для дополнительной безопасности. Настройка многофакторной проверки подлинности выходит за рамки этой документации. Ознакомьтесь с документацией по SSH о том, как правильно настроить многофакторную проверку подлинности и проверить его работу за пределами PowerShell, прежде чем пытаться использовать его с помощью удаленного взаимодействия PowerShell.

Примечание.

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

Пример удаленного управления 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 работать в любом интерактивном удаленном сеансе.

См. также