· 16 мин чтения

PowerShell Remoting через WinRM или SSH: какой транспорт выбрать и как настроить

Меня зовут Семёнов Евгений Сергеевич, директор АйТи Фреш. За 15+ лет работы с Windows-инфраструктурами я видел эволюцию PowerShell Remoting: сначала только WinRM, потом PowerShell 6 принёс SSH-транспорт, а с PowerShell 7 SSH-remoting стал боевым вариантом. У нас на практике я сам выбираю транспорт под задачу: гибридные парки Windows+Linux — SSH, чистый AD-домен с 200 серверами — WinRM, централизованный jump-host с авторизацией по ключам — тоже SSH. В этой статье — сравнение транспортов, реальные команды настройки и рекомендации, когда выбирать что.

Исторический контекст

WinRM появился в Windows Server 2008 и стал основой Windows-remoting. SSH в мире Windows долго был экзотикой: ставили Cygwin или OpenSSH от третьих лиц. С Windows 10 v1803 Microsoft включила OpenSSH как компонент (Features on Demand), а в PowerShell 6 добавила SSH-транспорт для remoting. Сегодня SSH работает нативно и на Windows Server 2019+, и на десктопных Windows 11.

Сравнение транспортов

КритерийWinRMSSH
PowerShell версии5.1 и 7.xТолько 7.x на обоих концах
АутентификацияKerberos, NTLM, Basic, Cert, CredSSPПо паролю, по ключу, GSSAPI/Kerberos
Порт по умолчанию5985 / 598622
КроссплатформенностьТолько между WindowsWindows, Linux, macOS
JEAДаНет
Delegation (double hop)KCD, CredSSP, JEA RunAsssh-agent forwarding
CIM/WMI командлетыРаботаютНе все, зависит от модуля
Тишина при первой установкеEnable-PSRemotingСтавится Feature on Demand + конфиг

Мой главный критерий выбора: если инфраструктура чистого Windows AD — оставляю WinRM, потому что Kerberos и JEA дают лучший security profile. Если есть Linux или Docker-хосты и нужен единый инструмент для всех — ставлю PowerShell 7 и использую SSH.

Установка OpenSSH Server на Windows

# Windows Server 2019+, Windows 10/11
Get-WindowsCapability -Online -Name OpenSSH* | Where-Object State -eq 'NotPresent' |
    Add-WindowsCapability -Online

# Запуск и автостарт
Set-Service -Name sshd -StartupType Automatic
Start-Service sshd

# Firewall
New-NetFirewallRule -Name 'SSH-In' -DisplayName 'OpenSSH Server (sshd)' `
    -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow

# Проверка
Get-Service sshd, ssh-agent
netstat -an | Select-String ':22 '

Настройка sshd_config для PowerShell Subsystem

Чтобы SSH-клиент понимал, куда писать в PowerShell, нужно добавить subsystem. Файл C:\ProgramData\ssh\sshd_config:

# Разрешить вход по ключу
PubkeyAuthentication yes
PasswordAuthentication yes     # можно отключить после настройки ключей

# Subsystem для PowerShell 7
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo

# Отключить GSSAPI если не используется Kerberos
GSSAPIAuthentication no

# Ограничить пользователей
AllowGroups 'Administrators' 'Remote Management Users'

После правки — Restart-Service sshd. Теперь с клиента:

Enter-PSSession -HostName srv-app01 -UserName admin -SSHTransport
Invoke-Command -HostName srv-app01 -UserName admin -ScriptBlock { hostname; $PSVersionTable.PSVersion }

Аутентификация по ключам

Пароли — плохо. Ключи — хорошо. Генерируем на клиенте:

ssh-keygen -t ed25519 -f $HOME\.ssh\id_corp
# Получили id_corp (приватный) и id_corp.pub (публичный)

# Копируем публичный на сервер
# Вариант 1: автоматом, если sshd настроен и пароль работает
ssh-copy-id.exe -i $HOME\.ssh\id_corp.pub admin@srv-app01

# Вариант 2: руками через RDP / Invoke-Command
$pub = Get-Content $HOME\.ssh\id_corp.pub
Invoke-Command srv-app01 -ScriptBlock {
    Add-Content -Path $env:USERPROFILE\.ssh\authorized_keys -Value $using:pub
}

Важно: на Windows есть нюанс с правами на файл authorized_keys — он должен принадлежать только пользователю или системе, иначе OpenSSH его проигнорирует. Для админских аккаунтов используется отдельный файл C:\ProgramData\ssh\administrators_authorized_keys.

Remoting между Windows и Linux

Основной сценарий, ради которого я вообще начал использовать SSH-remoting — управление смешанным парком. У одного клиента 45 Linux-серверов (Ubuntu 22.04) и 30 Windows. Ansible уже стоит, но хочется интерактивного Enter-PSSession. Настройка на Linux:

sudo apt install powershell openssh-server -y
# В /etc/ssh/sshd_config
# Subsystem powershell /usr/bin/pwsh -sshs -NoLogo

sudo systemctl restart ssh

С Windows-клиента:

Enter-PSSession -HostName ubuntu-app01 -UserName devops -SSHTransport
# Получаем PowerShell на Linux
PS /home/devops> Get-Process | Sort-Object CPU -Descending | Select-Object -First 5

Мини-кейс: гибридная инфраструктура

В декабре 2025 взяли в обслуживание клиента — IT-компанию (70 Windows + 40 Linux, 280 рабочих мест). У них был хаос: Windows-сервера через RDP, Linux через SSH, пароли везде разные, никакой централизации. Менеджмент попросил унификации. Решение:

Результат: любой инженер может одной командой подключиться к любому серверу парка — Windows или Linux — из PowerShell 7. Пароли нигде не хранятся. Средний MTTR упал с 40 минут до 18. Стоимость внедрения — 180 тыс. руб.

Производительность и нюансы

Несколько практических наблюдений:

ControlMaster для ускорения SSH

Файл ~/.ssh/config на клиенте:

Host *.corp.itfresh.local
    User svc_ops
    IdentityFile ~/.ssh/id_corp
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h-%p
    ControlPersist 10m
    ServerAliveInterval 30
    ServerAliveCountMax 3

Первое подключение открывает мастер-соединение, следующие — мультиплексируются через него. Второй Enter-PSSession на тот же хост открывается за доли секунды.

Безопасность

По пунктам:

Когда оставлять WinRM

Организуем гибридное управление парком серверов

Настрою PowerShell 7 + OpenSSH или WinRM на вашем парке, подниму jump-host с SSH-CA и 2FA, интегрирую логирование в SIEM. Смешанные Windows+Linux инфраструктуры — наша специализация. Серверы на Dell с Xeon Platinum 8280 и 40G Mellanox в дата-центре МТС — если нужна надёжная сетевая площадка для jump-хоста.

Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш

FAQ — частые вопросы о WinRM и SSH

Когда выбирать SSH вместо WinRM?
Когда у вас смешанный парк Windows+Linux и хочется единый инструмент. Когда целевой хост не в домене. Когда нужна аутентификация по ключам, а не паролям или сертификатам. Когда управляете из macOS/Linux в Windows.
Можно ли Enter-PSSession через SSH?
Да, начиная с PowerShell 6. Enter-PSSession -HostName srv01 -UserName user -SSHTransport. Предварительно нужно установить OpenSSH Server на целевую машину и настроить Subsystem powershell в sshd_config.
Поддерживает ли SSH-remoting JEA?
Нет. JEA — функция WinRM, через SSH пока недоступна. Если нужны JEA-роли, оставайтесь на WinRM или используйте ограничения на уровне OpenSSH (ForceCommand, match user).
Какая версия PowerShell нужна для SSH?
PowerShell 7.x на обоих концах. Windows PowerShell 5.1 не поддерживает SSH-транспорт. OpenSSH Server — компонент Windows 10/11 и Server 2019+.
Какой транспорт быстрее?
Для одиночных Invoke-Command — примерно одинаково. Для массовых — WinRM в AD-домене быстрее за счёт Kerberos tickets. SSH медленнее на первой аутентификации, но может удерживать session через ControlMaster.

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.