Удалённое управление PowerShell через SSH
Обзор
Функция удаленного взаимодействия PowerShell обычно использует WinRM для согласования соединения и передачи данных. Теперь протокол SSH доступен на платформах Linux и Windows, что позволяет осуществлять многоплатформенное удаленное взаимодействие с PowerShell.
Служба удаленного управления Windows (WinRM) предоставляет надежную хостинговую модель для удаленных сеансов PowerShell. Удаленное взаимодействие по протоколу SSH сейчас не поддерживает настройку удаленных конечных точек и функцию JEA (Just Enough Administration).
Удаленное взаимодействие SSH позволяет выполнять базовый удаленный доступ к сеансам PowerShell между компьютерами Windows и Linux. Удаленное взаимодействие через SSH запускает процесс PowerShell на целевом компьютере в виде подсистемы SSH. В конечном итоге мы реализуем общую модель размещения, аналогичную WinRM, для поддержки конфигурации конечной точки и JEA.
Командлеты New-PSSession
, Enter-PSSession
и Invoke-Command
теперь имеют новый набор параметров для поддержки нового подключения для удаленного взаимодействия.
[-HostName <string>] [-UserName <string>] [-KeyFilePath <string>]
Чтобы создать удаленный сеанс, укажите целевой компьютер с параметром HostName и укажите имя пользователя UserName. При интерактивном выполнении командлетов вам будет предложено ввести пароль. Можно также использовать проверку подлинности ключа SSH с помощью файла закрытого ключа с параметром KeyFilePath. Создание ключей для проверки подлинности SSH зависит от платформы.
Общие сведения о настройке
PowerShell 6 или более поздней версии, а SSH должен быть установлен на всех компьютерах. Установите клиент SSH (ssh.exe
) и сервер (sshd.exe
), чтобы вы могли удаленно подключаться к компьютерам и с них. OpenSSH для Windows теперь доступен в windows 10 сборки 1809 и Windows Server 2019. Дополнительные сведения см. в статье Управление Windows с помощью OpenSSH. Для Linux установите SSH, включая сервер sshd, соответствующий вашей платформе. Кроме того, необходимо установить PowerShell из GitHub, чтобы получить функцию удаленного подключения SSH.
Сервер SSH должен быть настроен для создания подсистемы SSH для размещения процесса PowerShell на удаленном компьютере. Кроме того, необходимо включить пароль или проверку подлинности на основе ключей.
Установка службы SSH на компьютере Windows
Установите последнюю версию PowerShell. Дополнительные сведения см. в "Установке PowerShell в Windows".
Вы можете убедиться, что PowerShell поддерживает удалённый доступ по SSH, перечислив наборы параметров
New-PSSession
. Вы заметите, что имена наборов параметров начинаются с SSH. Эти наборы параметров включают параметры SSH.(Get-Command New-PSSession).ParameterSets.Name
Name ---- SSHHost SSHHostHashParam
Установите последнюю версию Win32 OpenSSH. Инструкции по установке см. в разделе Начало работы с OpenSSH.
Примечание.
Если вы хотите задать PowerShell как оболочку по умолчанию для OpenSSH, см. раздел «Настройка Windows для OpenSSH».
Измените файл
sshd_config
, расположенный в$Env:ProgramData\ssh
.Убедитесь, что проверка подлинности паролей включена:
PasswordAuthentication yes
Создайте подсистему SSH, на котором размещен процесс PowerShell на удаленном компьютере:
Subsystem powershell C:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo
Примечание.
Начиная с PowerShell 7.4, больше не нужно использовать параметр
-NoLogo
при запуске PowerShell в режиме сервера SSH.Примечание.
Расположение по умолчанию исполняемого файла PowerShell —
C:/progra~1/powershell/7/pwsh.exe
. Расположение может отличаться в зависимости от способа установки PowerShell.Для всех путей к файлам, содержащих пробелы, необходимо использовать короткое имя 8.3. Существует ошибка в OpenSSH для Windows, которая не позволяет использовать пробелы в путях к исполняемым файлам подсистемы. Дополнительные сведения см. в этом вопросе на GitHub.
Короткое имя формата 8.3 для папки
Program Files
в Windows — это обычноProgra~1
. Однако можно использовать следующую команду, чтобы убедиться в следующем:Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' | Select-Object EightDotThreeFileName
EightDotThreeFileName --------------------- C:\progra~1
При необходимости включите проверку подлинности ключа:
PubkeyAuthentication yes
Дополнительные сведения см. в разделе Управление ключами OpenSSH.
Перезапустите службу sshd.
Restart-Service sshd
Добавьте путь, по которому OpenSSH установлен в переменную среды PATH. Например,
C:\Program Files\OpenSSH\
. Эта запись позволяет найтиssh.exe
.
Установка службы SSH на компьютере Ubuntu Linux
Установите последнюю версию PowerShell, см. Установка PowerShell на Ubuntu.
Установите сервер Ubuntu OpenSSH .
sudo apt install openssh-client sudo apt install openssh-server
Измените файл
sshd_config
в расположении/etc/ssh
.Убедитесь, что проверка подлинности паролей включена:
PasswordAuthentication yes
При необходимости включите проверку подлинности ключа:
PubkeyAuthentication yes
Дополнительные сведения о создании ключей SSH в Ubuntu см. в странице man для ssh-keygen.
Добавьте запись подсистемы PowerShell:
Subsystem powershell /usr/bin/pwsh -sshs -NoLogo
Примечание.
Расположение по умолчанию исполняемого файла PowerShell —
/usr/bin/pwsh
. Расположение может отличаться в зависимости от способа установки PowerShell.Примечание.
Начиная с PowerShell 7.4, больше не нужно использовать параметр
-NoLogo
при запуске PowerShell в режиме сервера SSH.Перезапустите службу ssh.
sudo systemctl restart sshd.service
Установка службы SSH на компьютере macOS
Установите последнюю версию PowerShell. Дополнительные сведения установке PowerShell в macOS.
Убедитесь, что удаленное взаимодействие SSH включено, выполнив следующие действия.
- Откройте
System Settings
. - Щелкните
General
- Щелкните
Sharing
. - Проверьте
Remote Login
, чтобы задатьRemote Login: On
. - Разрешить доступ к соответствующим пользователям.
- Откройте
Измените файл
sshd_config
в расположении/private/etc/ssh/sshd_config
.Используйте текстовый редактор, например nano:
sudo nano /private/etc/ssh/sshd_config
Убедитесь, что проверка подлинности паролей включена:
PasswordAuthentication yes
Добавьте запись для подсистемы PowerShell.
Subsystem powershell /usr/local/bin/pwsh -sshs -NoLogo
Примечание.
Расположение по умолчанию исполняемого файла PowerShell —
/usr/local/bin/pwsh
. Расположение может отличаться в зависимости от способа установки PowerShell.Примечание.
Начиная с PowerShell 7.4, больше не нужно использовать параметр
-NoLogo
при запуске PowerShell в режиме сервера SSH.При необходимости включите проверку подлинности ключа:
PubkeyAuthentication yes
Перезапустите службу sshd.
sudo launchctl stop com.openssh.sshd sudo launchctl start com.openssh.sshd
Примечание.
При обновлении операционной системы файл конфигурации SSH может быть перезаписан. Проверьте файл конфигурации после обновления.
Аутентификация
Удаленное взаимодействие PowerShell по протоколу SSH зависит от обмена данными для проверки подлинности между клиентом SSH и службой SSH и не реализует никаких собственных схем проверки подлинности. Результатом является то, что все настроенные схемы проверки подлинности, включая многофакторную проверку подлинности, обрабатываются SSH и не зависят от PowerShell. Например, можно настроить службу SSH, чтобы требовать проверку подлинности открытого ключа и одноразовый пароль для дополнительной безопасности. Настройка многофакторной проверки подлинности выходит за рамки этой документации. Ознакомьтесь с документацией по SSH о том, как правильно настроить многофакторную проверку подлинности и проверить его работу за пределами PowerShell, прежде чем пытаться использовать его с помощью удаленного взаимодействия PowerShell.
Примечание.
Пользователи сохраняют те же привилегии в удаленных сеансах. Это означает, что администраторы имеют доступ к оболочке с повышенными привилегиями, и обычные пользователи не имеют доступа.
Пример удаленного управления PowerShell
Самый простой способ проверить удаленное управление — на одном компьютере. В этом примере мы создаем удаленный сеанс возврата к тому же компьютеру Linux. Мы используем командлеты PowerShell в интерактивном режиме, поэтому видим запросы от SSH, которые требуют проверки хост-компьютера и ввода пароля. Вы можете сделать то же самое на компьютере Windows, чтобы обеспечить работу удаленного взаимодействия. Затем подключитесь к удаленному компьютеру, изменив имя хоста.
Linux на Linux
$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' can't be established.
ECDSA key fingerprint is SHA256:2kCbnhT2dUE6WCGgVJ8Hyfu1z2wE4lifaJXLO7QJy0Y.
Are you sure you want to continue connecting (yes/no)?
TestUser@UbuntuVM1s password:
$session
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
1 SSH1 UbuntuVM1 RemoteMachine Opened DefaultShell Available
Enter-PSSession $session
[UbuntuVM1]: PS /home/TestUser> uname -a
Linux TestUser-UbuntuVM1 4.2.0-42-generic 49~16.04.1-Ubuntu SMP Wed Jun 29 20:22:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[UbuntuVM1]: PS /home/TestUser> Exit-PSSession
Invoke-Command $session -ScriptBlock { Get-Process pwsh }
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName PSComputerName
------- ------ ----- ----- ------ -- -- ----------- --------------
0 0 0 19 3.23 10635 635 pwsh UbuntuVM1
0 0 0 21 4.92 11033 017 pwsh UbuntuVM1
0 0 0 20 3.07 11076 076 pwsh UbuntuVM1
Linux в Windows
Enter-PSSession -HostName WinVM1 -UserName PTestName
PTestName@WinVM1s password:
[WinVM1]: PS C:\Users\PTestName\Documents> cmd /c ver
Microsoft Windows [Version 10.0.10586]
из Windows в Windows
C:\Users\PSUser\Documents>pwsh.exe
PowerShell
Copyright (c) Microsoft Corporation. All rights reserved.
$session = New-PSSession -HostName WinVM2 -UserName PSRemoteUser
The authenticity of host 'WinVM2 (10.13.37.3)' can't be established.
ECDSA key fingerprint is SHA256:kSU6slAROyQVMEynVIXAdxSiZpwDBigpAF/TXjjWjmw.
Are you sure you want to continue connecting (yes/no)?
Warning: Permanently added 'WinVM2,10.13.37.3' (ECDSA) to the list of known hosts.
PSRemoteUser@WinVM2's password:
$session
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
1 SSH1 WinVM2 RemoteMachine Opened DefaultShell Available
Enter-PSSession -Session $session
[WinVM2]: PS C:\Users\PSRemoteUser\Documents> $PSVersionTable
Name Value
---- -----
PSEdition Core
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
SerializationVersion 1.1.0.1
BuildVersion 3.0.0.0
CLRVersion
PSVersion 6.0.0-alpha
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
GitCommitId v6.0.0-alpha.17
[WinVM2]: PS C:\Users\PSRemoteUser\Documents>
Ограничения
Команда sudo не работает в удаленном сеансе на компьютере Linux.
PSRemoting по протоколу SSH не поддерживает профили и не имеет доступа к
$PROFILE
. Один раз за сеанс можно загрузить профиль, подключив его с помощью полного пути к файлу. Это не связано с профилями SSH. Сервер SSH можно настроить для использования PowerShell в качестве оболочки по умолчанию и загрузки профиля через SSH. Дополнительные сведения см. в документации по SSH.До PowerShell 7.1 удаленное взаимодействие через SSH не поддерживало удаленные сеансы второго шага. Эта возможность ограничена сеансами с помощью WinRM. PowerShell 7.1 позволяет
Enter-PSSession
иEnter-PSHostProcess
работать в любом интерактивном удаленном сеансе.
См. также
PowerShell