Microsoft в PowerShell 6 представила Secure Shell(SSH) в качестве транспорта для удалённого взаимодействия PowerShell. Более старые версии PowerShell (Windows PowerShell) ограничены HTTP/HTTPS и службой удалённого управления Windows(WinRM).
WinRM/HTTP подходит для использования в инфраструктуре Active Directory(AD), т.к. аутентификация и коммуникация защищены. WinRM/HTTPS предназначен для доступа к компьютерам рабочей группы, то есть компьютерам, не присоединенным к домену AD.
Но чтобы использовать HTTPS, вам необходимо получать, предоставлять сертификаты и управлять ими. Кроме того, вам необходимо настроить Trusted Hosts на устройствах, прежде чем они будут принимать WinRM/HTTPS соединения.
Чтобы решить эти проблемы, Microsoft представила SSH в качестве транспортного средства для удаленного взаимодействия PowerShell в PowerShell 6. SSH использует пароли и пары открытых/закрытых ключей для аутентификации, поэтому сертификаты не являются обязательными, как при использовании HTTPS. Поскольку SSH поддерживается только в PowerShell 6 и более поздних версиях, вам необходимо установить последнюю версию PowerShell в Windows. Windows 10 поставляется с устаревшей Windows PowerShell 5.1, установленной по умолчанию.
Настройка удаленного взаимодействия PowerShell для использования SSH состоит из двух основных шагов. Первый шаг — это настройка компьютера, к которому вы хотите подключиться удаленно. Для этого Вам потребуется выполнить следующие действия:
- Установить актуальную версию PowerShell — на момент написания статьи это PowerShell 7
- Установить и настроить сервер OpenSSH
Как только это будет сделано, вам необходимо будет настроить компьютер, с которого вы хотите управлять удаленным устройством, проделав следущие шаги:
- Установить последнюю версию PowerShell
- Установить клиент OpenSSH
Настройка удаленного устройства
Начнем с настройки устройства, к которому вы хотите подключиться удаленно.
Установка актуальной версии PowerShell
Лучший способ установить актуальную версию PowerShell — загрузить последнюю версию установочного файла .msi с GitHub. После установки PowerShell, актуальная версия и PowerShell 5.1 будут работать параллельно. Некоторые командлеты поддерживаются только в последней версии PowerShell, поэтому далее мы будем использовать PowerShell 5.1 и версию PowerShell, которую мы только что установили.
Установка OpenSSH
Первый шаг — установить OpenSSH в Windows.
Для этого мы воспользуемся Windows PowerShell и командлетом Add-WindowsCapability. Чтобы открыть Windows PowerShell, введите windows powershell в поле поиска на панели задач, щелкните стрелку (>) справа от Windows PowerShell в результатах поиска и в списке параметров справа щелкните Запуск от имени администратора. Вас могут попросить ввести учетные данные администратора или дать согласие на запуск PowerShell с повышенными привилегиями.

В окне PowerShell выполните следующие две команды, чтобы добавить на устройство клиентские и серверные компоненты OpenSSH. Клиент не обязателен к установке, но он поможет нам проверить, работает ли SSH-сервер. Установка серверного компонента OpenSSH также создает и включает правило входящего подключения брандмауэра Windows по TCP-порту 22 для всех профилей сетевого подключения.
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Теперь запустим службу sshd и настроим ее автоматический запуск:
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'
Чтобы проверить работу SSH, вы можете подключиться к нему локально из окна PowerShell с помощью команды SSH. Выполните команду ниже, заменив «Servilon» своим именем пользователя на локальном устройстве.
ssh Servilon@localhost
Введите «Y», для подтверждения, что вы хотите подключиться, а затем введите пароль своей учетной записи. Чтобы выйти из сеанса SSH, введите exit и нажмите ENTER.
Настройка SSH для удаленного взаимодействия PowerShell
Теперь, когда на устройстве работает SSH, мы можем настроить его для работы с PowerShell. Нам нужно отредактировать файл sshd_config, который находится в C:\ProgramData\ssh. Поскольку sshd_config находится в защищенном каталоге, нам нужно запустить Блокнот от имени администратора, чтобы отредактировать его.
- Введите блокнот в поле поиска на панели задач, убедитесь, что Блокнот выбран в результатах поиска. В параметрах справа щелкните стрелку вниз, чтобы развернуть доступные параметры, и выберите Запуск от имени администратора
- В Блокноте нажмите CTRL + O, чтобы открыть файл
- В диалоговом окне «Открыть» вставить C:\ProgramData\ssh в поле «Имя файла» и нажать клавишу ВВОД
- В раскрывающемся меню справа от поля Имя файла изменить Текстовые документы (*.txt) на Все файлы
- Дважды щелкнуть sshd_config в списке файлов, чтобы открыть его

В файле найдите следующую строку:
#PasswordAuthentication yes
Отредактируйте его, удалив символ хеша в начале строки, чтобы он выглядел так:
PasswordAuthentication yes
Наконец, нам нужно создать хост-процесс PowerShell на целевом компьютере в качестве подсистемы SSH. Измените значение # override defalt of no subsystems в sshd_config следующим образом:
# override defalt of no subsystems
Subsystem sftp sftp-server.exe
Для этого добавим:
# override defalt of no subsystems
# Subsystem sftp sftp-server.exe
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo
Обратите внимание, что вам может потребоваться изменить путь к среде выполнения PowerShell (pwsh.exe), если вы используете старую или более позднюю версию PowerShell. В пути к файлу мы используем короткое имя 8.3 для Program Files. Это потому, что в OpenSSH для Windows есть ошибка, из-за которой вы не можете использовать пробелы в пути к исполняемым файлам подсистемы.
Теперь сохраните и закройте файл.

Чтобы применить изменения, перезапустите службу sshd с помощью PowerShell-командлета Restart-Service :
Restart-Service sshd
Тестирование удаленного взаимодействия PowerShell и SSH
Прежде чем подключаться к устройству удаленно, давайте сначала проверим, что удалённое взаимодействие PowerShell работает локально. Следующие шаги необходимо выполнять в PowerShell, а не в Windows PowerShell, поскольку он не поддерживает SSH в качестве протокола удаленного взаимодействия. Чтобы открыть PowerShell, введите powershell в поле поиска на панели задач. В результатах поиска обязательно щелкните PowerShell, а не Windows PowerShell.
В окне PowerShell создайте новый удаленный сеанс на локальном устройстве с помощью New-PSSession. При появлении запроса введите пароль для своей учетной записи.
$session = New-PSSession -HostName localhost
Теперь давайте проверим детали сеанса с помощью Get-PSSession. Как вы можете видеть на изображении ниже, в столбце Transport указан именно SSH.
Get-PSSession

Настройка своего устройства управления
Теперь осталось только настроить устройство, с которого вы управляете удаленным ПК. Загрузите последнюю версию PowerShell с GitHub и установите ее. Теперь установите клиент OpenSSH с помощью Windows PowerShell. Повторите шаги, описанные выше, но на этот раз серверный компонент OpenSSH не нужен. Просто установите клиентский компонент:
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0,1.0
Вот и все! Если у вас есть прямое сетевое подключение к удаленному устройству через порт 22, вы сможете установить сеанс удаленного взаимодействия PowerShell с помощью SSH. Вы можете подключиться с помощью Enter-PSSession, как показано ниже. Указание параметра -Hostname гарантирует, что PowerShell будет использовать SSH в качестве протокола подключения.
Замените WIN10-1 именем удаленного устройства, к которому вы хотите подключиться. PowerShell использует имя пользователя локального компьютера, если вы его не указали. Чтобы войти в систему с использованием учетной записи пользователя домена, используйте формат имя пользователя: домен, как показано ниже:
Enter-PSSession -HostName WIN10-1 -UserName user:servilon.ru
Invoke-Command и New-PSSession также поддерживают протокол SSH при условии, что вы используете параметр -Hostname или -SSHTransport.
В следующей статье мы продемонстрируем, как настроить удаленное взаимодействие PowerShell и аутентификацию с открытым ключом SSH.