Использование удаленного взаимодействия PowerShell через SSH
В классических версиях Windows PowerShell (до 5.1) для доступа к удаленным компьютерам с помощью PSRemoting можно было использовать только протокол WinRM (WSMan, порт 5985/5986). В новых кроссплатформенных версиях PowerShell Core 7.x и 6.x вы можете использовать SSH для удаленного взаимодействия PowerShell между компьютерами. Давайте попробуем настроить PSRemoting через SSH для подключения к хостам Windows, Linux или macOS.
Включить удаленное взаимодействие SSH PowerShell в Windows
Давайте посмотрим, как настроить SSH-сервер на стороне клиента Windows для включения удаленного взаимодействия PowerShell.
Сначала включите встроенный сервер OpenSSH в Windows 10 (версия 1809 или новее) и Windows Server 2019. Установите SSH-сервер с помощью следующей команды (в 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 с помощью командлетов PowerShell управления службами:
Set-Service -Name sshd -StartupType 'Automatic'
Start-Service sshd
Убедитесь, что Windows теперь прослушивает порт TCP/22 (SSH):
Get-NetTCPConnection -State Listen|where {$_.localport -eq '22'}Разрешите входящие SSH-соединения в брандмауэре Защитника Windows:
Enable-NetFirewallRule -Name *OpenSSH-Server*Затем откройте файл конфигурации C:\ProgramData\ssh\sshd_config:
notepad $Env:ProgramData\ssh\sshd_configВключите аутентификацию по паролю SSH, раскомментировав следующую строку:
PasswordAuthentication yesВы также можете разрешить доступ по SSH с помощью ключей:
PubkeyAuthentication yesДобавьте строку ниже в файл. Он запустит интерпретатор pwsh.exe для удаленных подключений SSH:
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogoСохраните файл sshd_config и перезапустите службу sshd:
restart-service sshdКак включить удаленное взаимодействие PowerShell SSH в Linux?
Теперь давайте посмотрим, как настроить хост Linux для удаленного взаимодействия PowerShell через 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Перезапустите службу ssh:
sudo systemctl restart sshd.serviceP.S.Управление по SSH с примерами
Теперь вы можете подключиться к настроенному хосту Windows или Linux с помощью PowerShell через SSH. Для доступа к удаленным компьютерам по SSH используются те же командлеты, что и в WinRM:
New-PSSessionEnter-PSSession- установить интерактивный сеанс PowerShell с удаленным хостом
Invoke-Command- для удаленного запуска команд или скриптов PS1
По умолчанию эти командлеты пытаются использовать WinRM для подключения к удаленным компьютерам. Чтобы использовать транспорт SSH, вам следует использовать другие варианты подключения (доступные в PowerShell Core, поэтому вам придется запускать их из
pwsh.exeбыстрый).
Параметры -HostName (вместо -ComputerName) и -UserName (вместо -Credential) позволяют указать имя компьютера и пользователя для SSH-соединения. С помощью параметра -KeyFilePath вы можете указать ключи SSH для аутентификации (необязательно). Вы также можете использовать параметр -SSHTransport, чтобы явно включить SSH-транспорт для трафика PowerShell.
Попробуем подключиться к удаленному компьютеру в интерактивном режиме из Windows с помощью встроенного SSH-клиента:
Enter-PSSession -HostName 192.168.50.20 -UserName maxbakДля подключения достаточно подтвердить SSH-отпечаток сервера и ввести пароль пользователя, которому разрешено удаленное подключение.
Вы можете создать несколько постоянных сеансов PowerShell для удаленных компьютеров и выполнять на них команды через SSH:
$session1 = New-PSSession -HostName 192.168.50.20 -UserName maxbak -SSHTransport
$session2 = New-PSSession -HostName 192.168.54.44 -UserName root -SSHTransportЧтобы запустить команду на нескольких компьютерах одновременно, используйте команду ниже:
Invoke-Command -Session $session1, $session2 -ScriptBlock { $PSVersionTable| select OS, PSVersion}| Select-Object PSComputerName, PSVersion, OSВ этом примере мы запустили команду на компьютере с Windows и Linux и отобразили вывод в консоли.
В PowerShell Core 7.1 и более поздних версиях PSRemoting поддерживает двойной переход к другому удаленному компьютеру из существующего сеанса.
В этой опции вы можете указать несколько сеансов SSH и пройти аутентификацию с использованием ключей RSA:
$sshConnections = @{HostName="winsrv1"; UserName="active-directory\maxbak"; KeyFilePath="c:\users\maxbak\id_rsa" }, @{ HostName="root@ubunsrv1"; KeyFilePath="c:\vault\ubunsrv1_id_rsa" }
New-PSSession -SSHConnection $sshConnectionsКлючевые ограничения удаленного взаимодействия PowerShell через 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 через SSH — безопасная и простая альтернатива WinRM. PSУдаленное взаимодействие через SSH поддерживается на любой платформе (Windows, Linux, macOS), открываются любые дополнительные порты (кроме TCP/22 SSH) и легко настраивается.



