Cómo configurar OpenSSH en Windows Server [Guía completa]

El protocolo Secure Shell (SSH) y el proyecto OpenSSH han estado presentes durante décadas en Linux. Sin embargo, OpenSSH en Windows no fue ampliamente adoptado en el mundo de Windows hasta hace poco. Como resultado, un servidor de Windows generalmente no viene preconfigurado y listo para usar, sino que requiere cierta configuración.

En este tutorial, aprenderás cómo realizar conexiones SSH en tu servidor Windows tan fácilmente como en Linux. Aprenderás cómo instalar (o actualizar) OpenSSH en Windows, agregar reglas de firewall apropiadas y configurar la autenticación mediante clave pública, contraseña y certificado.

**Requisitos Previos**

Para seguir eficazmente los ejemplos y demostraciones de este artículo, debes cumplir con los siguientes requisitos:

  • A Windows Server machine – This article will use Windows Server 2019 Datacenter. The server this tutorial will use will have a user account called june and will connect to the server at the IP address of 40.117.77.227 with a hostname of ataWindows.
  • A local computer with PowerShell 7.1 installed. PowerShell 7.1 is available in Windows, Linux, and macOS. The examples in this article use PowerShell 7.1 in Windows 10.

**Descargando OpenSSH**

A diferencia de los servidores Linux, los servidores Windows no tienen un servidor SSH preinstalado. Sin embargo, Microsoft ha lanzado una versión de OpenSSH de código abierto para Windows. Con esta versión, ahora puedes configurar un servidor SSH en una máquina con Windows.

Para comenzar, primero debes descargar OpenSSH. Para hacerlo, sigue los pasos a continuación:

  1. 1. Conéctate al escritorio en un servidor Windows mediante Remote Desktop (RDP) o tu cliente de administrador de escritorio preferido.

2. En el escritorio de tu servidor Windows, abre una consola de Windows PowerShell elevada.

3. A continuación, copia el código que aparece a continuación, pégalo en la ventana de PowerShell y presiona Enter. Este script descargará la última versión de OpenSSH, que, hasta la fecha de esta redacción, es v8.1.0.0p1-Beta, en el directorio de trabajo actual.

Si prefieres guardar el código PowerShell para descargar OpenSSH, también puedes abrir un editor de código como Windows PowerShell ISE o Visual Studio Code y guardarlo allí.

## Establecer el protocolo de conexión de red a TLS 1.2
## Definir la URL de la última versión de OpenSSH
 $url = 'https://github.com/PowerShell/Win32-OpenSSH/releases/latest/'
## Crear una solicitud web para obtener el enlace de descarga de la última versión
 $request = [System.Net.WebRequest]::Create($url)
 $request.AllowAutoRedirect=$false
 $response=$request.GetResponse()
 $source = $([String]$response.GetResponseHeader("Location")).Replace('tag','download') + '/OpenSSH-Win64.zip'
## Descargar el paquete más reciente de OpenSSH para Windows en el directorio de trabajo actual
 $webClient = [System.Net.WebClient]::new()
 $webClient.DownloadFile($source, (Get-Location).Path + '\OpenSSH-Win64.zip')

4. El archivo OpenSSH-Win64.zip debería estar ahora en tu directorio de trabajo actual. Verifica esto ejecutando el siguiente comando.

Get-ChildItem *.zip

Como puedes ver a continuación, el archivo OpenSSH-Win64.zip existe en el directorio.

Checking if the OpenSSH zip file exists

Instalación de OpenSSH

Después de haber descargado OpenSSH-Win64.zip, el siguiente paso es instalar OpenSSH en el servidor. No hay un asistente de instalación en caso de que lo estés esperando.

  1. Mientras sigas en la misma sesión de PowerShell, copia el código siguiente y ejecútalo en PowerShell. Este código extrae el contenido del archivo OpenSSH-Win64.zip a C:\Program Files\OpenSSH.
# Extraer el ZIP a una ubicación temporal
 Expand-Archive -Path .\OpenSSH-Win64.zip -DestinationPath ($env:temp) -Force
# Mover el contenido extraído del ZIP desde la ubicación temporal a C:\Program Files\OpenSSH\
 Move-Item "$($env:temp)\OpenSSH-Win64" -Destination "C:\Program Files\OpenSSH\" -Force
# Desbloquear los archivos en C:\Program Files\OpenSSH\
 Get-ChildItem -Path "C:\Program Files\OpenSSH\" | Unblock-File

2. Después de extraer el archivo ZIP, ejecuta el siguiente comando en PowerShell para ejecutar el script C:\Program Files\OpenSSH\install-sshd.ps1. Este script instala el servicio del servidor SSH OpenSSH (sshd) y el servicio del Agente de Autenticación OpenSSH (sshd-agent).

& 'C:\Program Files\OpenSSH\install-sshd.ps1'

Puedes ver el resultado esperado a continuación.

Installing OpenSSH

Para asegurarte de que el servidor SSH se inicie automáticamente, ejecuta el siguiente comando en PowerShell.

## cambia el tipo de inicio del servicio sshd de manual a automático.
 Set-Service sshd -StartupType Automatic
## inicia el servicio sshd.
 Start-Service sshd

Agregando una Regla de Firewall de Windows para Permitir el Tráfico SSH

Este procedimiento es aplicable solo si tu servidor Windows está utilizando el Firewall de Windows. Para servidores que usan firewalls de terceros, consulta la documentación de tu firewall sobre cómo permitir el puerto 22.

Instalar OpenSSH no crea automáticamente una regla de excepción de firewall para permitir el tráfico SSH. Por lo tanto, tu siguiente tarea es crear manualmente la regla de firewall.

Una de las formas más sencillas de crear una nueva regla de firewall de Windows es mediante PowerShell y el cmdlet New-NetFirewallRule. El siguiente comando crea una regla de firewall llamada Permitir SSH que permite todo el tráfico TCP entrante con destino al puerto 22.

Copia el siguiente comando y ejecútalo en PowerShell.

New-NetFirewallRule -Name sshd -DisplayName 'Allow SSH' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

La captura de pantalla a continuación muestra la salida esperada en PowerShell después de crear la regla de firewall.

Creating a Windows Firewall Rule to allow Port 22

Conexión con SSH mediante autenticación de contraseña

En este punto, has instalado OpenSSH en Windows y realizado la configuración inicial del servidor. El siguiente paso es probar si la conexión a través de SSH funciona realmente.

Para probar tu servidor SSH recién configurado, ejecutemos ahora el comando ssh en tu computadora local.

Los mismos pasos de esta sección también se aplican al conectar con un servidor SSH de Linux.

1. Desde tu computadora local en esta ocasión, abre PowerShell.

2. A continuación, ejecuta el siguiente comando para iniciar el proceso de inicio de sesión SSH. Asegúrate de cambiar el nombre de usuario y el host remoto de tu servidor Windows.

ssh june@40.117.77.227

3. Como estás conectando al servidor por primera vez, verás un mensaje indicando que no se puede establecer la autenticidad del host. El mensaje significa que tu computadora aún no reconoce el host remoto. Escribe y presiona Enter para continuar.

4. Cuando se te pida la contraseña, escribe la contraseña de tu cuenta y presiona Enter.

Connecting via SSH using Password Authentication

5. Después de iniciar sesión, como se muestra en la captura de pantalla a continuación, llegarás al indicador de comando del host remoto. Supongamos que deseas confirmar que has ingresado a la sesión en el host remoto. Para hacerlo, escribe hostname y presiona Enter. El comando debería devolver el nombre de la computadora remota.

Getting the hostname of the SSH server

Cambiando el Shell Predeterminado de OpenSSH a PowerShell

Cuando inicias sesión por primera vez en tu servidor SSH de Windows, notarás que el shell o intérprete de comandos predeterminado es CMD. Tener CMD como el shell SSH predeterminado está bien, pero si prefieres usar PowerShell en su lugar, sigue estos pasos.

Para cambiar el shell predeterminado de OpenSSH de CMD a PowerShell:

Primero, abre una ventana de PowerShell elevada en tu servidor Windows, si aún no tienes una abierta.

Luego, crea un nuevo valor de cadena de registro llamado DefaultShell en la clave del registro HKLM:\SOFTWARE\OpenSSH. Establece los datos de la cadena DefaultShell en la ruta de Windows PowerShell C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe.

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

La captura de pantalla a continuación muestra el resultado esperado del comando.

Changing the default OpenSSH shell

Configuración de la autenticación de clave pública

En las secciones anteriores, te conectaste con un nombre de usuario y una contraseña. Esto funciona, pero una forma más segura de autenticarse con un servidor SSH es mediante el uso de un par de claves.

En pocas palabras, un par de claves consiste en dos claves llamadas la clave pública y la clave privada, que constituyen un conjunto de credenciales de seguridad para probar tu identidad.

La clave pública se almacena en el servidor, mientras que la clave privada permanece en el ordenador local. Debes tratar una clave privada como tu contraseña. Si la clave privada se ve comprometida, cualquiera puede usarla para obtener acceso a tu servidor SSH.

Preparando el archivo “administrators_authorized_keys”

Las claves públicas deben estar en el servidor. ¿Pero dónde? Para OpenSSH en Windows, el servidor SSH lee las claves públicas desde el archivo C:\ProgramData\ssh\administrators_authorized_keys. Pero este archivo no existe por defecto. Debes crearlo primero.

Sigue estos pasos a continuación para crear el archivo administrators_authorized_keys y establecer su correspondiente lista de control de acceso (ACL).

En el servidor Windows:

1. Abre una consola elevada de Windows PowerShell si aún no lo has hecho.

2. Copia el siguiente comando y ejecútalo en PowerShell. Este comando crea el archivo administrators_authorized_keys utilizando el New-Itemcmdlet.

New-Item -Type File -Path C:\ProgramData\ssh\administrators_authorized_keys

Deberías ver un resultado similar a la captura de pantalla a continuación.

Creating the administrators_authorized_keys file

3. A continuación, obtén la ACL actualmente asignada al archivo ssh_host_dsa_key y copia esa ACL al archivo administrators_authorized_keys. Para hacerlo, ejecuta el siguiente comando.

get-acl C:\ProgramData\ssh\ssh_host_dsa_key | set-acl C:\ProgramData\ssh\administrators_authorized_keys

El servicio OpenSSH requiere que solo el grupo Administradores y la cuenta SYSTEM tengan acceso al archivo administrators_authorized_keys. Y tiene sentido copiar el ACL de ssh_host_dsa_key a administrators_authorized_keys porque el ACL ya está configurado.

4. Ahora abre el Explorador de Windows.

5. Navega hasta la carpeta C:\ProgramData\ssh\.

6. Haz clic derecho en el archivo administrators_authorized_keys y selecciona Propiedades.

7. En la página de propiedades, haz clic en la pestaña Seguridad y luego en Avanzado.

Opening advanced security settings

8. Luego, confirma si los permisos son como se muestran en la imagen a continuación.

Viewing advanced security permission

Generando un Nuevo Par de Claves SSH

Para generar un nuevo par de claves SSH, usa el comando ssh-keygen, que es parte de las herramientas de cliente OpenSSH integradas en Windows 10 (y superior) y la mayoría de los sistemas operativos Linux.

El ejemplo mostrado en esta sección funciona en computadoras con Windows y Linux.

En tu computadora local, en una consola de PowerShell:

1. Navega al directorio .ssh de tu carpeta de inicio ejecutando el siguiente comando.

cd ~/.ssh

2. A continuación, escribe el comando ssh-keygen y presiona Enter. Cuando se te pida ingresar una ubicación de archivo para guardar la clave que estás generando, mantén la ubicación predeterminada y presiona Enter. De esta manera, tu cliente SSH podrá encontrar tus claves SSH al autenticar automáticamente.

En Windows, el archivo de clave predeterminado es C:\Users\<nombre_de_usuario>\.ssh\id_rsa.

3. En el siguiente paso, deja en blanco la frase de contraseña. En este punto, no es necesario usar una frase de contraseña para realizar pruebas.

Agregar una frase de contraseña a tu clave privada aumenta significativamente su seguridad. Una frase de contraseña actúa como una autenticación de segundo factor (2FA) para tu clave privada.

Notarás que el comando ha creado dos archivos; id_rsa (clave privada) e id_rsa.pub (clave pública).

Generating a new SSH key pair on the local computer

Implementando la Clave Pública en el Servidor SSH de Windows

Ahora que has generado tu par de claves privada-pública, tu próximo paso es copiar la clave pública al archivo C:\ProgramData\ssh\administrators_authorized_keys en el servidor SSH.

En tu computadora local, en una consola de PowerShell:

1. Copia el código a continuación y ejecútalo en PowerShell. Asegúrate de cambiar primero el nombre de usuario y la dirección IP. Puedes referirte al comentario encima de cada comando para saber qué hace cada uno.

# Leer la clave pública
 $public_key = Get-Content ~/.ssh/id_rsa.pub
# Agregar la clave pública al archivo administrators_authorized_keys en el servidor usando ssh.
 ssh june@40.177.77.227 "'$($public_key)' | Out-File C:\ProgramData\ssh\administrators_authorized_keys -Encoding UTF8 -Append"

2. Ingresa tu contraseña cuando se te solicite, y ssh procederá a copiar la clave pública. Verás un resultado similar, como se muestra a continuación.

Deploying the public key to the Windows SSH server

Conexión con SSH usando Autenticación de Clave Pública

Ahora que has copiado tu clave pública en tu servidor SSH, ya no necesitas usar una contraseña para autenticarte. Como puedes ver a continuación, ssh no solicitó una contraseña.

Connecting with SSH using Public Key Authentication

Configuración de Autenticación con Certificado

Al igual que la autenticación con clave pública, la autenticación con certificado no requiere contraseña o está protegida con una frase de paso. Para habilitar el inicio de sesión con certificado, sigue el mismo procedimiento de generación de un par de claves sin implementar la clave pública en el servidor SSH.

No necesitas mapear la clave pública a los archivos authorized_keys o administrators_authorized_keys en el servidor SSH. En su lugar, la clave pública se firma utilizando una autoridad de certificación (CA).

Creación de la Clave de Autoridad de Certificación (CA)

Generar las claves del CA para la firma es similar a generar un par de claves de usuario que hiciste anteriormente en este artículo. Solo que esta vez, deberás especificar un nombre de archivo para las nuevas claves del CA. Para hacerlo, en tu servidor Windows en una consola de PowerShell:

Ejecuta el comando ssh-keygen como se muestra a continuación. Este comando crea la clave CA en C:\ProgramData\ssh\ca_userkeys, pero siéntete libre de usar un nombre de archivo diferente. Usar un nombre de archivo diferente no afectará la funcionalidad de la clave CA.

Cuando se te solicite una frase de paso, deja la frase de paso vacía y presiona Enter.

ssh-keygen -f C:\ProgramData\ssh\ca_userkeys

Puedes ver a continuación que el comando creó dos archivos. ca_userkeys, que es la clave privada, y ca_userkeys.pub, que es la clave pública.

Creating the Certificate Authority (CA) Key on a Windows SSH server

Ahora que has generado las claves CA, indica al servidor SSH que confíe en la CA y dónde encontrar la clave CA. Para hacer esto, agrega una nueva línea TrustedUserCAKeys ruta/hacia/ca_userkeys.pub al archivo C:\ProgramData\ssh\sshd_config en el servidor.

Ejecuta los comandos a continuación para agregar el elemento de configuración en el archivo sshd_config.

# Si el servidor SSH es Windows
 echo TrustedUserCAKeys C:\ProgramData\ssh\ca_userkeys.pub>> C:\ProgramData\ssh\sshd_config

Firmar la Clave Pública del Usuario

En este punto, has generado las claves CA y configurado el servidor SSH para confiar en el archivo de clave pública de la CA. Lo que queda ahora es firmar la clave pública de tu usuario.

En tu computadora local, en una consola de PowerShell:

1. Copia el archivo id_rsa.pub a tu unidad de inicio en el servidor SSH usando el comando SCP. Asegúrate de cambiar el nombre de usuario y la dirección IP a los valores correctos.

scp ((Resolve-Path ~/.ssh/id_rsa.pub).Path) june@40.117.77.227:id_rsa.pub

2. Inicie sesión en su servidor Windows usando ssh. Una vez conectado, ejecute ssh-keygen para firmar la clave pública del usuario. Notará que el comando a continuación utilizó varios parámetros. Veamos detalladamente cada uno.

  • -s C:\ProgramData\ssh\ca_userkeys – especifica la ubicación de la clave CA para firmar la clave pública. En este ejemplo, la clave CA es la que usted generó.
  • -I id_username – especifica el ID que desea asignar a la clave pública del usuario firmada. Cambie el valor de id_username por el nombre que desee.
  • -V +4w – este parámetro especifica el período de validez de la clave firmada. En este ejemplo, +4w significa que la clave del usuario firmada será válida durante cuatro semanas. Puede cambiar este valor según el período de validez que prefiera.
  • -n username – este es el nombre de usuario que será dueño de la clave pública firmada.
  • <path to id_rsa.pub> – esta es la ubicación de la clave pública del usuario para firmar (Windows).
ssh-keygen -s C:\ProgramData\ssh\ca_userkeys -I id_username -V +4w -n username ~/id_rsa.pub

Después de ejecutar el comando en su sesión de SSH, debería obtener una salida similar, como se muestra a continuación. Como puede ver, el comando generó un nuevo archivo llamado id_rsa-cert.pub, que es el certificado de usuario firmado.

Signing the User Key

3. Ahora, regrese a su sesión de PowerShell en su computadora local y copie el archivo id_rsa-cert.pub desde el servidor a su computadora local. Cambie primero el nombre de usuario y la dirección IP a los valores correctos antes de ejecutar el comando.

scp june@40.117.77.227:id_rsa-cert.pub ((Resolve-Path ~/.ssh/).Path)

Una vez que se complete la copia, encontrará el certificado de usuario firmado en su carpeta de inicio, como se muestra a continuación.

Finding the SSH user certificate

Conexión con SSH usando Autenticación de Certificados

Has configurado la autenticación de certificados y ahora tienes tu certificado de usuario. Deberías probar ahora si puedes conectar al servidor SSH con autenticación de certificado.

El comando para conectar a SSH con un certificado es el mismo que usar una contraseña o una clave pública. Pero, si habilitaste previamente la autenticación de clave pública, desactívala primero. De lo contrario, SSH seguirá utilizando tu par de claves en lugar de tu certificado.

Para desactivar tu par de claves, elimina tu clave pública del archivo administrators_authorized_keys. Para hacerlo, sigue estos pasos.

Ten en cuenta que los comandos siguientes vaciarán todo el archivo administrators_authorized_keys, eliminando efectivamente todas las claves públicas mapeadas. Si no deseas borrar todas las claves públicas mapeadas, utiliza un editor de texto para eliminar manualmente las claves públicas seleccionadas de cada archivo.

Mientras estás conectado al servidor Windows mediante SSH:

1. Ejecuta el siguiente código en PowerShell para vaciar el archivo administrators_authorized_keys.

# Limpiar el archivo administrators_authorized_keys
 $NULL > C:\ProgramData\ssh\administrators_authorized_keys
# Confirma que administrators_authorized_keys está vacío
 Get-Content C:\ProgramData\ssh\administrators_authorized_keys

2. En este punto, los archivos authorized_keys y administrators_authorized_keys están vacíos, como se puede ver en la captura de pantalla a continuación.

Emptying the administrators_authorized_keys

3. Escribe exit y presiona Enter para desconectarte de tu sesión SSH. Volverás a tu sesión de PowerShell.

4. Después de eliminar las claves públicas, tu próximo intento de inicio de sesión SSH utilizará la autenticación de certificado. La experiencia de inicio de sesión será la misma que la autenticación de clave pública.

Connecting with SSH using Certificate Authentication

Conclusión

Has configurado un servidor OpenSSH en Windows desde cero hasta explorar y configurar varios medios de autenticación. ¡Ahora puedes conectarte a tus servidores de Windows exactamente como lo harías con Linux!

Source:
https://adamtheautomator.com/openssh-windows/