PSRemoting para Linux y Windows: Guía paso a paso

Una de las grandes cosas sobre cómo PowerShell ha evolucionado en los últimos años es que está adoptando muchas formas de interactuar con máquinas no Windows. Uno de estos cambios fue agregar soporte para PSRemoting sobre SSH. ¡PSRemoting sobre SSH también significa tener PSRemoting en Linux!

Aunque configurar PSRemoting para funcionar con SSH y Linux requiere un poco de configuración para que funcione, esto te permite usar PowerShell para interactuar con máquinas Linux de forma nativa.

En este tutorial, aprenderás cómo configurar un cliente de Windows para conectarse a una computadora Linux (CentOS) utilizando PSRemoting sobre SSH y viceversa. Aprenderás cómo autenticarte tanto usando una contraseña como utilizando un certificado.

Relacionado: PSRemoting de PowerShell: La guía definitiva

Requisitos previos

Este tutorial será un paso a paso. Si deseas seguirlo, asegúrate de tener lo siguiente de antemano:

  • A Windows 10 build 1809 or greater machine. The tutorial will use Windows Server 2019 Standard as the remote server.
  • A Linux machine that supports PowerShell 7. The tutorial will use CentOS 8.
  • Permisos de sudo en la máquina Linux y permisos de administrador local en la máquina Windows. Después de la configuración inicial, algunos de los permisos pueden ser revocados.

Configurando Windows (Cliente) para PSRemoting sobre SSH

Primero, necesitas configurar el cliente de PSRemoting (PowerShell) en tu cliente de Windows. Para hacer esto, deberás configurar tanto PowerShell 7+ como OpenSSH.

Instalando PowerShell 7+

Primero, instala PowerShell 7+. Este tutorial no cubrirá cómo hacerlo. Para aprender cómo hacerlo, consulta el enlace a continuación.

Instalando OpenSSH

Necesitarás instalar también OpenSSH. OpenSSH es el paquete que PSRemoting utilizará para conectarse al equipo remoto con Linux. Puedes instalar OpenSSH a través de PowerShell utilizando el cmdlet Get-WindowsCapability, como se muestra a continuación.

Dependiendo de si tu host de Windows será un cliente y/o un servidor, dependerá de qué característica de Windows debes instalar. Si te conectas desde el servidor Windows a Linux, solo necesitas el cliente OpenSSH. Si te conectas desde Linux a el servidor Windows, solo necesitas el servidor OpenSSH.

El siguiente comando encuentra todas las características de Windows con un nombre que comienza con OpenSSH e instala tanto el cliente como el servidor.

Get-WindowsCapability -Online | Where-Object {$_.Name -like 'OpenSSH*'} | Add-WindowsCapability -Online

Si solo quieres instalar el cliente, cambia el filtro en el bloque de script Where-Object a OpenSSH.Client* y para el servidor, el filtro debería ser OpenSSH.Server*.

Relacionado: Primeros pasos con SSH y PowerShell

Iniciando el servidor SSH

Una vez que se instala OpenSSH, abrirá el firewall de Windows en el puerto 22, pero no iniciará el servicio del servidor OpenSSH para escuchar en ese puerto. Para iniciar el servidor OpenSSH en Windows Server, ejecuta el siguiente comando de PowerShell para iniciar el servidor OpenSSH y configurar el servicio para que se inicie en el arranque.

Start-Service sshd
Set-Service sshd -StartupType Automatic

Configurando la configuración de OpenSSH

El siguiente paso es modificar el archivo de configuración del demonio `sshd_config` dentro de ``sshd_config daemon configuration file``. Dentro de este archivo, primero debes confirmar que la autenticación de contraseña esté habilitada y también `agregar el subsistema PowerShell`. `

Esta parte del tutorial establece el método más fácil utilizando contraseñas. Aprenderás cómo configurar la autenticación SSH usando certificados más adelante en este tutorial.

  1. Abre el archivo de configuración en tu editor de texto favorito en `C:\ProgramData\ssh\sshd_config`. `

2. Confirma que la autenticación por contraseña esté habilitada, donde la línea `PasswordAuthentication` está comentada con un `#` al principio o está configurada como `yes`. `

Password Authentication

3. Agrega el subsistema PowerShell. Para PowerShell 7, agrega la línea: `Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo`. `

  • La opción `-sshs` se utiliza para permitir que PowerShell 7 se ejecute dentro de SSH como un subsistema. `
  • La opción `-NoLogo` hace que PowerShell oculte la información de copyright al iniciarse, lo que asegura que no haya salidas inesperadas al iniciar la sesión SSH. `

4. Guarda y cierra el archivo de configuración. `

5. Reinicia el servicio sshd Windows. Puedes hacerlo con PowerShell ejecutando `Restart-Service sshd`. `

Ahora deberías tener todo configurado para conectarte `desde` (cliente) y `a` (servidor) a este servidor Windows usando PSRemoting sobre SSH.

Configuración de Linux (Servidor) para PSRemoting sobre SSH

El siguiente paso es configurar Linux de manera similar; instalando PowerShell y configurando OpenSSH.

Tenga en cuenta que dado que estamos usando CentOS, algunos de los comandos pueden ser diferentes si está utilizando una distribución diferente.

Instalando PowerShell 7+

Primero, instale PowerShell 7. Este tutorial no cubrirá cómo hacerlo. En su lugar, asegúrese de consultar el siguiente enlace.

Relacionado: Cómo descargar e instalar PowerShell 7 en Windows, macOS y Linux

Configurando OpenSSH

Al igual que en Windows Server, necesitará OpenSSH. Sin embargo, a diferencia de Windows, es probable que OpenSSH ya esté instalado. Para este tutorial que se ejecuta en CentOS 8, la máquina Linux ya tiene tanto el cliente como el servidor instalados de forma predeterminada, pero puede verificarlo usando el siguiente comando:

rpm -qa openssh*

Si el cliente y el servidor están instalados, debería obtener algo similar a la salida que se muestra a continuación.

Configuring OpenSSH

Configure el archivo de configuración de SSH mediante:

  1. Abrir el archivo sshd_config ejecutando sudo vi /etc/ssh/sshd_config.

2. Agregando el subsistema de PowerShell, al igual que en Windows Server, agregando la siguiente línea al archivo de configuración.

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

3. Salga de vi y guarde el archivo.

4. Reinicie el demonio ssh para aplicar los cambios ejecutando sudo systemctl restart sshd.

De forma predeterminada, la autenticación de contraseña y clave pública estará habilitada en la mayoría de los casos, incluido CentOS 8. No es necesario agregarlas aquí.

Conectar a/desde Windows/Linux con Autenticación de Contraseña

Una vez que hayas configurado todo en ambas máquinas Linux y Windows, es hora de poner a trabajar ese trabajo que hiciste. Ahora intentemos conectarnos desde Windows a Linux y viceversa utilizando la autenticación de contraseña.

La autenticación basada en contraseña se ve y se siente familiar al usar SSH con un nombre de usuario y contraseña.

Comandos de Conexión

Para probar la conexión con PSRemoting sobre SSH desde Windows a Linux o desde Linux a Windows, usemos tanto una sesión “ad-hoc” utilizando el cmdlet Invoke-Command como también una sesión persistente utilizando New-PSSession.

Relacionado: Invoke-Command: La Mejor Manera de Ejecutar Código Remoto

Prueba la conexión de PSRemoting utilizando Invoke-Command de la siguiente manera:

  1. Abriendo tu consola PowerShell 7.

Configurando los parámetros para el cmdlet Invoke-Command. En este caso, los parámetros a continuación se conectarán a una computadora llamada SRV1 utilizando una cuenta de usuario local en SRV1 llamada User.

$SessionParams = @{
     HostName = SRV1
     UserName = user
     SSHTransport = $true
 }

Ejecutando Invoke-Command desglosando los parámetros anteriores y ejecutando un comando (en este caso Get-Process) dentro de un bloque de script.

Relacionado: Splatting de PowerShell: ¿Qué es y cómo funciona?

Invoke-Command @SessionParams -ScriptBlock {Get-Process}

A continuación, deberías ver una lista de todos los procesos en ejecución en la computadora SRV1.

También puedes establecer una conexión persistente que te permita conectar y ejecutar comandos de manera interactiva mediante:

  1. Proporcionando los parámetros anteriores y pasándolos al cmdlet New-PSSession.

2. Conectándote a esa sesión de manera interactiva utilizando el cmdlet Enter-PSSession.

Create a persistent session
 $session = New-PSSession @SessionParams
 Connect interactively
 Enter-PSSession -Session $session

3. Después de ejecutar el comando Enter-PSSession anterior, se te solicitará la contraseña del usuario. Después de autenticarte, estarás conectado a la otra máquina dentro de PowerShell.

Observa que ninguno de los comandos anteriores requirió el parámetro común Credential para proporcionar un nombre de usuario y contraseña para conectarse. En su lugar, usamos el parámetro SSHTransport. SSH no utiliza el mismo proceso de autenticación que Windows para ir de una computadora Windows a otra, por lo que no puede interpretar objetos PSCredential.

Relacionado: Usando el cmdlet Get-Credential de PowerShell y todo lo relacionado con credenciales.

Usando este enfoque, también puedes aprovechar sesiones desconectadas.

Configuración de autenticación basada en clave pública

Mientras que la autenticación basada en contraseña es fácil de configurar y sencilla de usar, presenta dos problemas.

  • No hay forma de autenticar sin que alguien ejecute manualmente los comandos de forma segura.
  • Estás enviando una contraseña a través de la red.

Si bien la contraseña, en este caso, está cifrada dentro de la conexión SSH, el servidor recibe la contraseña en texto plano. Si el servidor se ve comprometido de alguna manera, podría convertirse en un problema de seguridad.

Generación de Claves Públicas/Privadas

Cuando se utiliza cualquier tipo de autenticación de clave pública, primero debes generar una clave pública desde el cliente. Este requisito se aplica tanto a Linux como a Windows.

En la máquina del servidor Linux o Windows:

  1. Ejecuta ssh-keygen para generar el par de claves.

Si estás ejecutando ssh-keygen en Linux, ten en cuenta que generará un par de claves RSA por defecto. Muchos sistemas operativos Linux nuevos no permitirán el uso de pares de claves RSA para la autenticación por defecto. Para corregir esto, usa ssh-keygen -t ed25519.

2. Se te pedirá una ruta para almacenar la clave privada y una contraseña para cifrar la clave privada. En caso de que no desees proporcionar una contraseña durante la autenticación, puedes dejar en blanco la contraseña.

3. Solo en Windows: Ejecuta los siguientes comandos desde PowerShell donde <ProfilePath> es la ruta de tu perfil (probablemente C:\Users\UserName).

Set-Service ssh-agent -StartupType Automatic
 Start-Service ssh-agent
 ssh-add .ssh\id_ed25519
 Remove-Item ~.ssh\id_ed25519

La implementación de OpenSSH de Windows cuenta con un servicio ssh-agent que te permite almacenar claves privadas dentro del Contexto de Seguridad de Windows del usuario con el que estás conectado. Esto te permitirá importar tu clave privada SSH al ssh-agent y luego eliminar la clave del sistema de archivos para asegurarla aún más.

4. Ahora copia la clave pública generada (<directorio de inicio del usuario>\.ssh\id_ed25519.pub) al servidor al que te vas a conectar. Windows no proporciona una herramienta para realizar esta copia, por lo que se puede completar con SCP. Ejecuta el siguiente comando para copiar la clave pública a la máquina Linux.

scp C:\Users\Username.ssh\id_ed25519.pub username@ServerB:~/.ssh/authorized_keys

Para copiar de Linux a Windows:

scp ~/.ssh/id_ed25519.pub administrator@ServerA:.ssh/authorized_keys

5. Ingresa la contraseña del usuario conectado. Una vez ingresada, PowerShell/Bash copiará la clave y te desconectarás de la máquina remota.

Conexión desde/hacia Windows/Linux con Autenticación de Clave Pública

Una vez que hayas configurado las claves pública y privada, la conexión desde/hacia tanto Windows como Linux debería ser fácil. Es casi idéntico a la autenticación basada en contraseña.

Para conectar con una clave pública en Windows, utiliza los mismos comandos que se muestran en Comandos de Conexión arriba. Solo notarás una diferencia: no se te pedirán credenciales.

A continuación, se muestra un ejemplo de conexión desde Linux a Windows usando el interruptor -v para ver qué está sucediendo durante la conexión.

Example of connecting from Linux to Windows using the -v switch

Source:
https://adamtheautomator.com/psremoting-linux/