В классическом 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'}
Разрешите входящие SSH подключения в Windows Defender Firewall:
Enable-NetFirewallRule -Name *OpenSSH-Server*
Затем нужно открыть конфигурационный файл sshd_config (C:\ProgramData\ssh):
notepad $Env:ProgramData\ssh\sshd_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
Перезапустите службу 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 отпечаток сервера и ввести пароль пользователя, которому разрешено удаленное подключение.
Можно создать несколько постоянных 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
В данном примере мы выполнили одновременно команду PowerShell на компьютере Windows и Linux и вывели результаты в консоль.
В переменной можно несколько SSH сессий и аутентифицироваться с помощью RSA ключей:
$sshConnections = @ HostName="winhost1"; UserName="winitpro\kbuldogov"; KeyFilePath="c:\users\kbuldogov\id_rsa" }, @{ HostName="sysops@ubuntu1"; KeyFilePath="c:\UserB\root\id_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) и прост в настройке.