Comunicación remota de PowerShell a través de SSH
Información general
La comunicación remota de PowerShell suele usar WinRM para la negociación de la conexión y el transporte de datos. SSH está ahora disponible para plataformas Linux y Windows y permite una verdadera comunicación remota multiplataforma en PowerShell.
WinRM proporciona un modelo de hospedaje sólido para las sesiones remotas de PowerShell. La comunicación remota basada en SSH no admite actualmente la configuración remota de puntos de conexión y de Just Enough Administration (JEA).
La comunicación remota mediante SSH permite una comunicación remota de sesión de PowerShell básica entre los equipos Windows y Linux. La comunicación remota mediante SSH crea un proceso de host de PowerShell en el equipo de destino como un subsistema SSH. Finalmente, implementaremos un modelo general de hospedaje, similar a WinRM, para admitir la configuración de puntos de conexión y JEA.
Los cmdlets New-PSSession
, Enter-PSSession
y Invoke-Command
ahora tienen un nuevo conjunto de parámetros que permite esta nueva conexión de comunicación remota.
[-HostName <string>] [-UserName <string>] [-KeyFilePath <string>]
Para crear una sesión remota, especifique el equipo de destino con el parámetro HostName y proporcione el nombre de usuario con UserName. Al ejecutar los cmdlets de forma interactiva, se le pedirá una contraseña. También puede usar la autenticación de la clave SSH mediante un archivo de clave privada con el parámetro KeyFilePath. La creación de claves para la autenticación SSH varía según la plataforma.
Información de configuración general
Deben estar instalados PowerShell 6 o versiones posteriores y SSH en todos los equipos. Instale tanto el cliente (ssh.exe
) y el servidor (sshd.exe
) SSH para que pueda comunicarse de forma remota hacia y desde los equipos. OpenSSH para Windows ahora está disponible en las compilación 1809 de Windows 10 y en Windows Server 2019. Para obtener más información, vea Administrar Windows con OpenSSH. Para Linux, instale SSH, incluido el servidor sshd, más adecuado para su plataforma. También necesita instalar PowerShell de GitHub para obtener la característica de comunicación remota mediante SSH.
El servidor SSH debe estar configurado para crear un subsistema SSH para hospedar un proceso PowerShell en el equipo remoto. Además, debe habilitar la contraseña o la autenticación basada en claves.
Instalación del servicio SSH en un equipo Windows
Instale la versión más reciente de PowerShell. Para más información, consulte Instalación de PowerShell en Windows.
Para confirmar que PowerShell tiene compatibilidad con la comunicación remota SSH, enumere los conjuntos de parámetros
New-PSSession
. Observará que hay nombres de conjuntos de parámetros que comienzan por SSH. Esos conjuntos de parámetros incluyen parámetros SSH.(Get-Command New-PSSession).ParameterSets.Name
Name ---- SSHHost SSHHostHashParam
Instale la versión más reciente de OpenSSH para Win32. Para obtener instrucciones de instalación, vea Introducción a OpenSSH.
Nota:
Si quiere establecer PowerShell como el shell predeterminado para OpenSSH, vea Configuración de Windows para OpenSSH.
Edite el archivo
sshd_config
ubicado en$env:ProgramData\ssh
.Asegúrese de que la autenticación de contraseña esté habilitada:
PasswordAuthentication yes
Cree el subsistema SSH que hospeda un proceso de PowerShell en el equipo remoto:
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -nologo
Nota:
A partir de PowerShell 7.4, ya no es necesario usar el parámetro
-nologo
al ejecutar PowerShell en modo de servidor SSH.Nota:
La ubicación predeterminada del ejecutable de PowerShell es
c:/progra~1/powershell/7/pwsh.exe
. Esta puede variar en función de cómo haya instalado PowerShell.Debe usar el nombre corto de 8.3 para las rutas de acceso de archivo que contengan espacios. Hay un error en OpenSSH para Windows que impide que los espacios funcionen en rutas de acceso ejecutables del subsistema. Para más información, consulte este problema de GitHub.
Normalmente, el nombre corto de 8.3 de la carpeta
Program Files
en Windows esProgra~1
. No obstante, puede usar el comando siguiente para asegurarse:Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' | Select-Object EightDotThreeFileName
EightDotThreeFileName --------------------- c:\progra~1
Opcionalmente, habilite la autenticación de clave:
PubkeyAuthentication yes
Para obtener más información, vea Administración de claves de OpenSSH.
Reinicie el servicio sshd.
Restart-Service sshd
Agregue la ruta de acceso donde está instalado OpenSSH a la variable de entorno Path. Por ejemplo,
C:\Program Files\OpenSSH\
. Esta entrada permite encontrar el archivossh.exe
.
Instalación del servicio SSH en un equipo Ubuntu Linux
Instale la versión más reciente de PowerShell, consulte Instalación de PowerShell en Ubuntu.
Instale Servidor OpenSSH en Ubuntu.
sudo apt install openssh-client sudo apt install openssh-server
Edite el archivo
sshd_config
en ubicación/etc/ssh
.Asegúrese de que la autenticación de contraseña esté habilitada:
PasswordAuthentication yes
Opcionalmente, habilite la autenticación de clave:
PubkeyAuthentication yes
Para obtener más información sobre la creación de claves SSH en Ubuntu, vea la página del manual de ssh-keygen.
Agregue una entrada de subsistema de PowerShell:
Subsystem powershell /usr/bin/pwsh -sshs -nologo
Nota:
La ubicación predeterminada del ejecutable de PowerShell es
/usr/bin/pwsh
. Esta puede variar en función de cómo haya instalado PowerShell.Nota:
A partir de PowerShell 7.4, ya no es necesario usar el parámetro
-nologo
al ejecutar PowerShell en modo de servidor SSH.Reinicie el servicio ssh.
sudo systemctl restart sshd.service
Instalación del servicio SSH en un equipo macOS
Instale la versión más reciente de PowerShell. Para obtener más información, vea Instalación de PowerShell en macOS.
Asegúrese de que la comunicación remota mediante SSH está habilitada. Para ello, siga estos pasos:
- Abra
System Settings
. - Haga clic en
General
. - Haga clic en
Sharing
. - Active
Remote Login
para establecerRemote Login: On
. - Permita el acceso a los usuarios adecuados.
- Abra
Edite el archivo
sshd_config
en ubicación/private/etc/ssh/sshd_config
.Use un editor de texto, como nano:
sudo nano /private/etc/ssh/sshd_config
Asegúrese de que la autenticación de contraseña esté habilitada:
PasswordAuthentication yes
Agregue una entrada de subsistema de PowerShell:
Subsystem powershell /usr/local/bin/pwsh -sshs -nologo
Nota:
La ubicación predeterminada del ejecutable de PowerShell es
/usr/local/bin/pwsh
. Esta puede variar en función de cómo haya instalado PowerShell.Nota:
A partir de PowerShell 7.4, ya no es necesario usar el parámetro
-nologo
al ejecutar PowerShell en modo de servidor SSH.Opcionalmente, habilite la autenticación de clave:
PubkeyAuthentication yes
Reinicie el servicio sshd.
sudo launchctl stop com.openssh.sshd sudo launchctl start com.openssh.sshd
Nota:
Al actualizar el sistema operativo, es posible que se sobrescriba el archivo de configuración SSH. Asegúrese de comprobar el archivo de configuración después de una actualización.
Autenticación
La comunicación remota de PowerShell a través de SSH se basa en el intercambio de autenticación entre el cliente de SSH y el servicio SSH, y no implementa los esquemas de autenticación. El resultado es que los esquemas de autenticación configurados, incluida la autenticación multifactor, se controlan mediante SSH y son independientes de PowerShell. Por ejemplo, puede configurar el servicio SSH para que solicite la autenticación con una clave pública y con una contraseña de un solo uso para una mayor seguridad. La configuración de autenticación multifactor queda fuera del ámbito de este documento. Consulte la documentación para SSH sobre cómo configurar la autenticación multifactor correctamente y validar su funcionamiento fuera de PowerShell antes de intentar usarlo con comunicación remota de PowerShell.
Nota:
Los usuarios conservan los mismos privilegios en las sesiones remotas. Es decir, los administradores tienen acceso a un shell con privilegios elevados, a diferencia de los usuarios normales.
Ejemplo de comunicación remota de PowerShell
La manera más fácil de comprobar si la comunicación remota funciona es probarla en un único equipo. En este ejemplo, vamos a crear una sesión remota en el mismo equipo Linux. Estamos usando cmdlets de PowerShell de manera interactiva para que aparezcan avisos de SSH que solicitan comprobar el equipo host y que piden una contraseña. Puede hacer lo mismo en un equipo Windows para garantizar que la comunicación remota funcione. Después, establézcala entre equipos mediante el cambio del nombre de host.
De Linux a 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
De Linux a 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]
De Windows a 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>
Limitaciones
El comando sudo no funciona en una sesión remota con un equipo Linux.
PSRemoting a través de SSH no admite perfiles y no tiene acceso a
$PROFILE
. Una vez que esté en una sesión, podrá cargar un perfil prefijando por puntos dicho perfil con la ruta del archivo completa. Esto no está relacionado con los perfiles SSH. Puede configurar el servidor SSH para usar PowerShell como el shell predeterminado y cargar un perfil mediante SSH. Vea la documentación de SSH para obtener más información.Antes de PowerShell 7.1, la comunicación remota a través de SSH no admitía sesiones remotas de segundo salto. Esta capacidad se limitaba a las sesiones que usaban WinRM. PowerShell 7.1 permite que
Enter-PSSession
yEnter-PSHostProcess
funcionen desde cualquier sesión remota interactiva.