Uso de la comunicación remota de PowerShell a través de SSH

En las versiones clásicas de Windows PowerShell (hasta la 5.1), solo podía usar el protocolo WinRM (WSMan, puerto 5985/5986) para acceder a equipos remotos mediante PSRemoting. En las versiones multiplataforma más recientes de PowerShell Core 7.x y 6.x, puede usar SSH para comunicación remota de PowerShell entre computadoras. Intentemos configurar PSRemoting a través de SSH para conectarse a hosts de Windows, Linux o macOS.

Habilite la comunicación remota SSH PowerShell en Windows

Veamos cómo configurar un servidor SSH en el lado del cliente de Windows para habilitar la comunicación remota de PowerShell.

Primero, habilite el servidor OpenSSH integrado en Windows 10 (versión 1809 o posterior) y Windows Server 2019. Instale el servidor SSH con el siguiente comando (en Windows 10 u 11):

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Además, instale la última versión de PowerShell Core:

iex "& { $(irm https://aka.ms/install-powershell.ps1) } -UseMSI"

Luego habilite un inicio automático para el servicio sshd usando los cmdlets de PowerShell de administración de servicios:

Set-Service -Name sshd -StartupType 'Automatic'
Start-Service sshd

Asegúrese de que Windows ahora esté escuchando en el puerto TCP/22 (SSH):

Get-NetTCPConnection -State Listen|where {$_.localport -eq '22'}

habilitar servidor sshd en windows

Permitir conexiones SSH entrantes en el Firewall de Windows Defender:

Enable-NetFirewallRule -Name *OpenSSH-Server*

Luego abre C:ProgramDatasshsshd_config archivo de configuración:

notepad $Env:ProgramDatasshsshd_config

Habilite la autenticación de contraseña SSH descomentando la siguiente línea:

PasswordAuthentication yes

También puede permitir el acceso SSH usando claves:

PubkeyAuthentication yes

Agregue la siguiente línea al archivo. Ejecutará el intérprete pwsh.exe para conexiones SSH remotas:

Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo

Guarde el archivo sshd_config y reinicie el servicio sshd:

restart-service sshd

¿Cómo habilitar la comunicación remota SSH de PowerShell en Linux?

Ahora veamos cómo configurar un host Linux para PowerShell Remoting sobre SSH.

Instale PowerShell Core en su distribución de Linux de acuerdo con esta guía. Uso los siguientes comandos para mi host Ubuntu 20.04:

$ sudo apt-get update -y
$ wget -q https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb
$ sudo apt-get update
$ sudo apt-get install powershell -y

Instale un servidor OpenSSH (si no está instalado):

$ sudo apt install openssh-server

Agregue las siguientes líneas a /etc/ssh/sshd_config:

PasswordAuthentication yes
Subsystem powershell /usr/bin/pwsh -sshs -NoLogo

sshd_config: use pwsh para psremoteing en Windows

Reinicie el servicio ssh:

sudo systemctl restart sshd.service

PSRemoting sobre SSH con ejemplos

Ahora puede conectarse a un host de Windows o Linux configurado mediante PowerShell a través de SSH. Para acceder a equipos remotos a través de SSH, se utilizan los mismos cmdlets que en WinRM:

  • New-PSSession
  • Enter-PSSession – para establecer una sesión interactiva de PowerShell con un host remoto
  • Invoke-Command – para ejecutar comandos o scripts de PS1 de forma remota

De forma predeterminada, estos cmdlets intentan usar WinRM para conectarse a equipos remotos. Para usar el transporte SSH, debe usar otras opciones de conexión (disponibles en PowerShell Core, por lo que debe ejecutarlas desde el pwsh.exe inmediato).

los -Nombre de host (en lugar de –ComputerName) y -Nombre de usuario (en lugar de – Credencial) las opciones permiten configurar el nombre de la computadora y el usuario para la conexión SSH. Utilizando el –RutaArchivoClave parámetro, puede especificar claves SSH para la autenticación (opcional). También puede utilizar el -SSHTransporte parámetro para habilitar los transportes SSH para el tráfico de PowerShell explícitamente

Intentemos conectarnos a una computadora remota de forma interactiva desde Windows usando el cliente SSH incorporado:

Enter-PSSession -HostName 192.168.50.20 -UserName maxbak

Para conectarse, basta con confirmar una huella digital SSH de un servidor e ingresar la contraseña del usuario que puede conectarse de forma remota.

usando la comunicación remota de powershell sobre ssh

Puede crear múltiples sesiones persistentes de PowerShell en computadoras remotas y ejecutar comandos en ellas a través de SSH:

$session1 = New-PSSession -HostName 192.168.50.20 -UserName maxbak -SSHTransport
$session2 = New-PSSession -HostName 192.168.54.44 -UserName root -SSHTransport

Para ejecutar un comando en varias computadoras a la vez, use el siguiente comando:

Invoke-Command -Session $session1, $session2 -ScriptBlock { $PSVersionTable| select OS, PSVersion}| Select-Object PSComputerName, PSVersion, OS

psremoting sobre ssh: ejecute comandos en hosts Windows y Linux

En este ejemplo, ejecutamos el comando en una computadora Windows y Linux y mostramos el resultado en la consola.

En PowerShell Core 7.1 y posteriores, PSRemoting admite un doble salto a otra computadora remota desde una sesión existente.

Puede especificar múltiples sesiones SSH en la opción y autenticarse usando claves RSA:

$sshConnections = @{HostName="winsrv1"; UserName="woshubmaxbak"; KeyFilePath="c:usersmaxbakid_rsa" }, @{ HostName="root@ubunsrv1"; KeyFilePath="c:vaultubunsrv1_id_rsa" }
New-PSSession -SSHConnection $sshConnections

Limitaciones clave de PowerShell Remoting sobre SSH:

  • Los perfiles de PowerShell no son compatibles;
  • En sesiones remotas con hosts Linux, sudo no es compatible (cuando se ejecuta, aparece el siguiente error: sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper );
  • No se admite Just Enough Administration (JEA).

Como puede ver, configurar PowerShell Remoting a través de SSH es mucho más fácil que a través de WinRM HTTPS. Además, puede usar este método de conexión para conectarse a computadoras en un grupo de trabajo usando PowerShell sin agregarlas a TrustedHost.

PowerShell Remoting over SSH es una alternativa segura y sencilla a WinRM. PSremoting sobre SSH es compatible con cualquier plataforma (Windows, Linux, macOS), cualquier puerto adicional que se abra (excepto TCP/22 SSH) y es fácil de configurar.

Artículos Interesantes