Presentación de PSRemoting Linux y Windows: guía práctica
Una de las mejores cosas de cómo ha cambiado PowerShell en los últimos años es que está adoptando muchas formas de interactuar con máquinas que no son Windows. Uno de estos cambios fue admitir PSRemoting a través de SSH. ¡PSRemoting sobre SSH también significa tener PSRemoting Linux!
Si bien configurar PSRemoting para que funcione con SSH y Linux requiere un poco de configuración para que funcione, esto le permite usar PowerShell para interactuar con máquinas Linux de forma nativa.
En este tutorial, aprenderá cómo configurar un cliente de Windows para conectarse a una computadora Linux (CentOS) usando PSRemoting a través de SSH y viceversa. Aprenderá cómo autenticarse usando una contraseña y usando un certificado.
Relacionado: PowerShell Remoting: la guía definitiva
Requisitos previos
Este tutorial será un tutorial. Si desea seguirnos, asegúrese de tener lo siguiente con anticipación:
- Una máquina con Windows 10 build 1809 o superior. El tutorial utilizará Windows Server 2019 Standard como servidor remoto.
- Una máquina Linux que admita PowerShell 7. El tutorial utilizará CentOS 8.
- Derechos Sudo en la máquina Linux y derechos de administrador local en la máquina Windows. Después de la configuración inicial, algunos de los derechos se pueden revocar.
Configuración de Windows (Cliente) para PSRemoting a través de SSH
En primer lugar, debe configurar el cliente PSRemoting (PowerShell) en su cliente Windows. Para hacer eso, necesitará instalar y configurar PowerShell 7+ y OpenSSH.
Instalación de PowerShell 7+
Primero, instale PowerShell 7+. Este tutorial no cubrirá cómo hacer esto. Para saber cómo, consulte el enlace a continuación.
Instalación de OpenSSH
También necesitarás instalar OpenSSH. OpenSSH es el paquete que PSRemoting utilizará para conectarse a la computadora Linux remota. Puede instalar OpenSSH a través de PowerShell usando el cmdlet Get-WindowsCapability como se muestra a continuación.
Dependiendo de si desea que su host de Windows sea un cliente y/o un servidor, depende de qué característica de Windows debe instalar. Si se conecta desde el servidor Windows a Linux, solo necesita el cliente OpenSSH. Si se está conectando desde Linux a el servidor Windows, solo necesita el servidor OpenSSH.
El siguiente comando busca todas las funciones de Windows con un nombre que comienza con OpenSSH y las instala de modo que instale tanto el cliente como el servidor.
Get-WindowsCapability -Online | Where-Object {$_.Name -like 'OpenSSH*'} | Add-WindowsCapability -Online
Si solo desea instalar el cliente, cambie el filtro en el bloque de script
Where-ObjectaOpenSSH.Client*y para el servidor el filtro debe ser < código>OpenSSH.Server*.
Relacionado: Introducción al uso de SSH y PowerShell
Iniciando el servidor SSH
Una vez que OpenSSH se instale, abrirá el firewall de Windows en el puerto 22, pero no iniciará el servicio del servidor OpenSSH para escuchar en el puerto. Para abrir el servidor OpenSSH en Windows Server, ejecute el siguiente comando de PowerShell para iniciar el servidor OpenSSH y configurar el servicio para que se inicie durante el arranque.
Start-Service sshd
Set-Service sshd -StartupType Automatic
Configurar la configuración de OpenSSH
El siguiente paso es modificar el archivo de configuración del demonio sshd_config. Dentro de este archivo, primero debe confirmar que la autenticación de contraseña esté habilitada y también agregar el subsistema PowerShell.
Esta parte del tutorial configura el método más sencillo utilizando contraseñas. Aprenderá cómo configurar la autenticación SSH mediante certificados más adelante en este tutorial.
- Abra el archivo de configuración en su editor de texto favorito en C:\ProgramData\ssh\sshd_config.
2. Confirme que la autenticación de contraseña esté habilitada cuando la línea PasswordAuthentication esté comentada con un # al principio o esté configurada en yes.
3. Agregue el subsistema PowerShell. Para PowerShell 7, agregue la línea: Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo.
- La opción
-sshsse utiliza para permitir que PowerShell 7 se ejecute dentro de SSH como un subsistema. - La opción
-NoLogohace que PowerShell oculte la información de copyright cuando se inicia, lo que garantiza que no haya resultados inesperados al iniciar la sesión SSH.
4. Guarde y cierre el archivo de configuración.
5. Reinicie el servicio sshd de Windows. Puede hacerlo con PowerShell ejecutando Restart-Service sshd.
Ahora debería tener todo lo que necesita configurado para conectarse desde (cliente) y a (servidor) este servidor Windows usando PSRemoting sobre SSH.
Configuración de Linux (servidor) para PSRemoting a través de SSH
El siguiente es Linux con una configuración similar; instalando PowerShell y configurando OpenSSH.
Tenga en cuenta que, dado que utilizamos CentOS, algunos de los comandos pueden ser diferentes si utiliza una distribución diferente.
Instalación de PowerShell 7+
Primero, instale PowerShell 7. Este tutorial no cubrirá cómo hacer esto. 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 Windows Server, necesitará OpenSSH. Sin embargo, a diferencia de Windows, es probable que OpenSSH ya esté instalado. Para este tutorial que ejecuta CentOS 8, la máquina Linux ya tiene el cliente y 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 al resultado siguiente.
Configure el archivo de configuración SSH mediante:
- Abrir el archivo sshd_config ejecutando
sudo vi /etc/ssh/sshd_config.
2. Agregar el subsistema PowerShell como en Windows Server agregando la siguiente línea al archivo de configuración.
Subsystem powershell /usr/bin/pwsh -sshs -NoLogo3. Salga de vi y guarde el archivo.
4. Reiniciar el demonio ssh para aplicar los cambios ejecutando sudo systemctl restart sshd.
De forma predeterminada, la autenticación con contraseña y clave pública estará habilitada en la mayoría de los casos, incluido CentOS 8. No es necesario agregarlas aquí.
Conexión hacia/desde Windows/Linux con autenticación de contraseña
Una vez que haya configurado todo en las máquinas Linux y Windows, es hora de darle un buen uso al trabajo que hizo. Intentemos ahora conectarnos de Windows a Linux y viceversa mediante autenticación de contraseña.
La autenticación basada en contraseña parece familiar al usar SSH con un nombre de usuario y contraseña.
Comandos de conexión
Para probar la conexión con PSRemoting a través de SSH de Windows a Linux o de Linux a Windows, usemos una sesión "ad-hoc" usando el cmdlet Invoke-Command y también una sesión persistente usando Nueva PSSession.
Relacionado: Invoke-Command: la mejor manera de ejecutar código remoto
Pruebe la conexión PSRemoting usando Invoke-Command mediante:
- Abriendo su consola PowerShell 7.
2. Configuración de parámetros para el cmdlet Invoke-Command. En este caso, los parámetros siguientes se conectarán a una computadora llamada SRV1 usando una cuenta de usuario local en SRV1 llamada Usuario.
$SessionParams = @{
HostName = SRV1
UserName = user
SSHTransport = $true
}3. Ejecutar Invoke-Command agregando los parámetros anteriores y ejecutando un comando (en este caso Get-Process dentro de un bloque de script.
Relacionado: PowerShell Splatting: ¿Qué es y cómo funciona?
Invoke-Command @SessionParams -ScriptBlock {Get-Process}Luego debería ver una lista de todos los procesos en ejecución en la computadora SRV1.
También puede establecer una conexión persistente que le permita conectarse hacia y desde y ejecutar comandos de forma interactiva mediante:
- Proporcionar los parámetros anteriores y pasarlos al cmdlet
New-PSSession.
2. Conectarse a esa sesión de forma interactiva mediante el cmdlet Enter-PSSession.
Create a persistent session
$session = New-PSSession @SessionParams
Connect interactively
Enter-PSSession -Session $session3. Después de ejecutar el comando Enter-PSSession desde arriba, se le solicitará la contraseña del usuario. Después de autenticarse, se conectará a la otra máquina dentro de PowerShell.
Observe 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, utilizamos el parámetro SSHTransport. SSH no utiliza el mismo proceso de autenticación que utiliza Windows para pasar de una computadora con Windows a otra, por lo que no puede interpretar los objetos PSCredential.
Relacionado: Uso del cmdlet Get-Credential de PowerShell y todo lo relacionado con las credenciales.
Con este enfoque, también puedes aprovechar las sesiones desconectadas.
Configurar la autenticación basada en clave pública
Si bien la autenticación basada en contraseña es fácil de configurar y utilizar, tiene dos problemas.
- No hay forma de autenticarse 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 sin formato. Si el servidor está comprometido de alguna manera, podría convertirse en un problema de seguridad.
Generación de claves públicas/privadas
Cuando utilice cualquier tipo de autenticación de clave pública, primero debe generar una clave pública del cliente. Este requisito se aplica tanto a Linux como a Windows.
En la máquina Linux o Windows Server:
- Ejecute
ssh-keygenpara generar el par de claves.
Si está ejecutando
ssh-keygenen Linux, sepa que generará un par de claves RSA de forma predeterminada. Muchos sistemas operativos Linux nuevos no permitirán que se utilicen pares de claves RSA para la autenticación de forma predeterminada. Para corregir este usossh-keygen -t ed25519.
2. Se le solicitará una ruta para almacenar la clave privada y una frase de contraseña para cifrar la clave privada. En caso de que no desee tener que proporcionar una contraseña durante la autenticación, puede dejar la frase de contraseña en blanco.
3. Solo Windows: Ejecute los siguientes comandos desde PowerShell donde es la ruta a su perfil (probablemente C:\Users\UserName ).
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
ssh-add .ssh\id_ed25519
Remove-Item ~.ssh\id_ed25519La implementación de OpenSSH en Windows tiene un servicio de agente ssh que le permite almacenar claves privadas dentro del contexto de seguridad de Windows del usuario con el que inició sesión. Esto le permitirá importar su clave privada SSH al agente ssh y luego elimine la clave del sistema de archivos para protegerla aún más.
4. Ahora copie la clave pública generada (
scp C:\Users\Username.ssh\id_ed25519.pub username@ServerB:~/.ssh/authorized_keysPara copiar de Linux a Windows:
scp ~/.ssh/id_ed25519.pub administrator@ServerA:.ssh/authorized_keys5. Ingrese la contraseña del usuario que inició sesión. Una vez ingresada, PowerShell/Bash copiará la clave y se desconectará de la máquina remota.
Conexión hacia/desde Windows/Linux con autenticación de clave pública
Una vez que haya configurado las claves pública y privada, conectarse hacia/desde Windows y Linux debería ser fácil. Es casi idéntico a la autenticación basada en contraseña.
Para conectarse con una clave pública en Windows, use los mismos comandos que se muestran en Comandos de conexión arriba. Sólo notarás una diferencia; No se le solicitarán las credenciales.
A continuación se muestra un ejemplo de conexión de Linux a Windows usando el interruptor -v para ver qué sucede durante la conexión.


