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.
Configuración en un equipo Windows
Instale la versión más reciente de PowerShell. Para obtener más información, vea Instalación de PowerShell Core 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.NameName ---- SSHHost SSHHostHashParamInstale 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_configubicado en$env:ProgramData\ssh.Asegúrese de que la autenticación de contraseña esté habilitada:
PasswordAuthentication yesCree el subsistema SSH que hospeda un proceso de PowerShell en el equipo remoto:
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogoNota
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 obtener más información, vea este problema de GitHub.
Normalmente, el nombre corto de 8.3 de la carpeta
Program Filesen Windows esProgra~1. No obstante, puede usar el comando siguiente para asegurarse:Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' | Select-Object EightDotThreeFileNameEightDotThreeFileName --------------------- c:\progra~1Opcionalmente, habilite la autenticación de clave:
PubkeyAuthentication yesPara obtener más información, vea Administración de claves de OpenSSH.
Reinicie el servicio sshd.
Restart-Service sshdAgregue 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.
Configuración en un equipo Linux Ubuntu 16.04
Instale la versión más reciente de PowerShell, vea Instalación de PowerShell Core en Linux.
Instale Servidor OpenSSH en Ubuntu.
sudo apt install openssh-client sudo apt install openssh-serverEdite el archivo
sshd_configen ubicación/etc/ssh.Asegúrese de que la autenticación de contraseña esté habilitada:
PasswordAuthentication yesOpcionalmente, habilite la autenticación de clave:
PubkeyAuthentication yesPara 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 -NoLogoNota
La ubicación predeterminada del ejecutable de PowerShell es
/usr/bin/pwsh. Esta puede variar en función de cómo haya instalado PowerShell.Reinicie el servicio ssh.
sudo service ssh restart
Configuración en un equipo macOS
Instale la versión más reciente de PowerShell. Para obtener más información, vea Instalación de PowerShell Core en macOS.
Asegúrese de que la comunicación remota mediante SSH está habilitada. Para ello, siga estos pasos:
- Abra
System Preferences. - Haga clic en
Sharing. - Active
Remote Loginpara establecerRemote Login: On. - Permita el acceso a los usuarios adecuados.
- Abra
Edite el archivo
sshd_configen ubicación/private/etc/ssh/sshd_config.Use un editor de texto, como nano:
sudo nano /private/etc/ssh/sshd_configAsegúrese de que la autenticación de contraseña esté habilitada:
PasswordAuthentication yesAgregue una entrada de subsistema de PowerShell:
Subsystem powershell /usr/local/bin/pwsh -sshs -NoLogoNota
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.Opcionalmente, habilite la autenticación de clave:
PubkeyAuthentication yesReinicie el servicio sshd.
sudo launchctl stop com.openssh.sshd sudo launchctl start com.openssh.sshd
Authentication
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.
# Linux to Linux
#
$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' cannot 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 powershell }
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName PSComputerName
------- ------ ----- ----- ------ -- -- ----------- --------------
0 0 0 19 3.23 10635 635 powershell UbuntuVM1
0 0 0 21 4.92 11033 017 powershell UbuntuVM1
0 0 0 20 3.07 11076 076 powershell UbuntuVM1
#
# Linux to 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 to 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-PSSessionyEnter-PSHostProcessfuncionen desde cualquier sesión remota interactiva.
Consulte también
Instalación de PowerShell Core en Linux
Instalación de PowerShell Core en macOS
Instalación de PowerShell Core en Windows
Administración de Windows con OpenSSH