Удаленные подключения PowerShell Remoting через SSH

Удаленные подключения PowerShell Remoting через SSH

В классическом Windows PowerShell (до версии 5.1 включительно) для удаленного доступа через PSRemoting между компьютерами можно было использовать только протокол WinRM (WSMan, порт 5985/5986). В новых кроссплатформенных версиях PowerShell Core 7.x и 6.x вы можете использовать SSH в качестве транспорта для удаленного взаимодействия PowerShell между компьютерами. В этой статье мы рассмотрим, как настроить PSRemoting over SSH для подключения к Windows, Linux и macOS хостам.

Настройка SSH PowerShell Remoting в Windows

Рассмотрим, как настроить SSH сервер на стороне клиента Windows для удаленного взаимодействия через PowerShell Remoting.

В Windows 10 (начиная с версии 1809) и Windows Server 2019+ доступен для установки встроенный OpenSSH сервер. Его можно установить с помощью следующей команды (для Windows 10 и 11):

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Также установите на компьютер последнюю версию PowerShell Core:

iex "& { $(irm https://aka.ms/install-powershell.ps1) } -UseMSI"

Затем нужно включить автоматический запуск службы sshd:

Set-Service -Name sshd -StartupType 'Automatic'
Start-Service sshd

Убедитесь, что Windows теперь слушает порт TCP/22 (SSH))

Get-NetTCPConnection -State Listen|where {$_.localport -eq '22'}

openssh сервер в windows слушает 22 порт TCP

Разрешите входящие SSH подключения в Windows Defender Firewall:

Enable-NetFirewallRule -Name *OpenSSH-Server*

Затем нужно открыть конфигурационный файл sshd_config (C:ProgramDatassh):

notepad $Env:ProgramDatasshsshd_config

Разрешите доступ по паролю, раскоментировав строку:

PasswordAuthentication yes

Также можно разрешить SSH доступ по ключам:

PubkeyAuthentication yes

Добавьте в файл следующую строку, которая будет обеспечивать запуск интерпретатора pwsh для удаленных SSH подключений:

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

Сохраните файл sshd_config, перезапустите службу sshd:

restart-service sshd

Настройка SSH Remoting для PowerShell в Linux

Теперь рассмотрим, как настроить хост с Linux для PowerShell Remoting over SSH.

Установите PowerShell Core в вашем дистрибутиве Linux согласно инструкции. В моем примере для Ubuntu 20.04 выполните команды:

sudo apt-get update -y
wget -q https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update
sudo apt-get install powershell -y

Установите OpenSSH сервер (если не установлен):

sudo apt install openssh-server

Добавьте в файл /etc/ssh/sshd_config следующие строки:

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

sshd_config в linux - добавить консоль powershell

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

sudo systemctl restart sshd.service

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

Теперь вы можете подключиться к настроенному Windows или Linux хосту с помощью PowerShell over SSH. Для удаленного доступа к компьютерам через SSH используются те же командлеты PowerShell, что и для через WinRM,:

  • New-PSSession
  • Enter-PSSession – для запуска интерактивной PowerShell сессии с удаленных хостом;
  • Invoke-Command – для удалённого запуска отдельных команд или скриптов PS1.

По умолчанию все эти командлеты пытаются использовать Windows WinRM для подключения к удаленным компьютерам. Вам нужно использовать другие параметры подключения для использования SSH транспорта (доступны в PowerShell Core, поэтому нужно запускать из консоли
pwsh.exe
):

Параметры -HostName (вместо –ComputerName) и –UserName (вместо Credential) позволяют задать имя компьютера и пользователь для SSH подключения. С помощью параметра –KeyFilePath можно указать RSA ключи для SSH аутентификации (опционально). Также можно использовать параметр –SSHTransport для явного указания использования транспорта SSH для трафика PowerShell.

Попробуем интерактивно подключиться к удаленному компьютеру из Windows с помощью встроенного ssh клиента:

Enter-PSSession -HostName 192.168.13.202 -UserName kbuldogov

Для подключения достаточно подтвердить SSH отпечаток сервера и ввести пароль пользователя, которому разрешено удаленное подключение.

Enter-PSSession через SSH

Можно создать несколько постоянных PowerShell сессий к удаленным компьютерам и выполнять команды на них через SSH:

$session1 = New-PSSession -HostName 192.168.13.202 -UserName kbuldogov -SSHTransport
$session2 = New-PSSession -HostName 192.168.14.144 -UserName sysops -SSHTransport

Чтобы выполнить команду сразу на нескольких компьютерах, выполните:

Invoke-Command -Session $session1, $session2 -ScriptBlock { $PSVersionTable| select OS, PSVersion}| Select-Object PSComputerName, PSVersion, OS

Invoke-Command запуск удаленных команд в linux и windows через powershell remoting over ssh

В данном примере мы выполнили одновременно команду PowerShell на компьютере Windows и Linux и вывели результаты в консоль.

В PowerShell Core 7.1 и выше PSRemoting поддерживает второй прыжок (double hop) на другой удаленный компьютер из существующей сессии.

В переменной можно несколько SSH сессий и аутентифицироваться с помощью RSA ключей:

$sshConnections = @ HostName="winhost1"; UserName="winitprokbuldogov"; KeyFilePath="c:userskbuldogovid_rsa" }, @{ HostName="sysops@ubuntu1"; KeyFilePath="c:UserBrootid_rsa" }
New-PSSession -SSHConnection $sshConnections

Основные ограничения PowerShell Remoting через SSH:

  • Не поддерживаются профили PowerShell;
  • В удаленных сессиях с Linux хостами не поддерживается sudo (при запуске появляется уведомление:
    sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
    );
  • Не поддерживается Just Enough Administration (JEA);

Как вы видите, настроить удаленно управление PowerShell Remoting через SSH намного проще, чем через WinRM HTTPS. Кроме того, такой способ подключения можно использовать для подключения через PowerShell к компьютерам в рабочей группе без добавления их в TrustedHost.

PowerShell Remoting over SSH это безопасная и простая замена WinRM. PSremoting over SSH поддерживается на всех платформах (как Windows и Linux), не требует открытия дополнительных портов (кроме TCP/22 SSH) и прост в настройке.

PowerShell
Удаленные подключения PowerShell Remoting через SSH