Búsqueda de sitios web

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


El protocolo Secure Shell (SSH) y el proyecto OpenSSH existen desde hace décadas en Linux. Pero OpenSSH en Windows no ha sido adoptado en el mundo de Windows hasta hace poco. Como tal, un servidor Windows normalmente no viene prediseñado y listo para funcionar y requiere cierta configuración.

En este tutorial, aprenderá cómo utilizar SSH en su servidor Windows con la misma facilidad que en Linux. Aprenderá cómo instalar (o actualizar) OpenSSH en Windows, agregar reglas de firewall adecuadas y configurar la clave pública, la contraseña y la autenticación basada en certificados.

Requisitos previos

Para seguir eficazmente los ejemplos y demostraciones de este artículo, deberá cumplir con los requisitos que se indican a continuación.

  • Una máquina con Windows Server: este artículo utilizará Windows Server 2019 Datacenter. El servidor que utilizará este tutorial tendrá una cuenta de usuario llamada june y se conectará al servidor en la IP dirección de 40.117.77.227 con un nombre de host de ataWindows.
  • Una computadora local con PowerShell 7.1 instalado. PowerShell 7.1 está disponible en Windows, Linux y macOS. Los ejemplos de este artículo utilizan PowerShell 7.1 en Windows 10.

Descargando OpenSSH

A diferencia de los servidores Linux, los servidores Windows no tienen un servidor SSH listo para usar en ejecución. Pero Microsoft ha lanzado una versión de código abierto de OpenSSH para Windows. Con esta versión, ahora puede configurar un servidor SSH en una máquina con Windows.

Para comenzar, primero deberá descargar OpenSSH. Para hacerlo, siga los pasos a continuación:

  1. Conéctese al escritorio en un servidor Windows mediante Escritorio remoto (RDP) o su cliente de administrador de escritorio preferido.

2. En su escritorio de Windows Server, abra una consola elevada de Windows PowerShell.

3. A continuación, copie el código siguiente, péguelo en la ventana de PowerShell y presione Entrar. Este script descargará la última versión de OpenSSH, que al momento de escribir este artículo, es v8.1.0.0p1-Beta en el directorio de trabajo actual.

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

## Set network connection protocol to TLS 1.2
## Define the OpenSSH latest release url
 $url = 'https://github.com/PowerShell/Win32-OpenSSH/releases/latest/'
## Create a web request to retrieve the latest release download link
 $request = [System.Net.WebRequest]::Create($url)
 $request.AllowAutoRedirect=$false
 $response=$request.GetResponse()
 $source = $([String]$response.GetResponseHeader("Location")).Replace('tag','download') + '/OpenSSH-Win64.zip'
## Download the latest OpenSSH for Windows package to the current working directory
 $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 su directorio de trabajo actual. Verifique esto ejecutando el siguiente comando.

Get-ChildItem *.zip

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

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é esperando.

  1. Mientras aún está en la misma sesión de PowerShell, copie el código siguiente y ejecútelo en PowerShell. Este código extrae el contenido del archivo OpenSSH-Win64.zip a C:\Program Files\OpenSSH.
# Extract the ZIP to a temporary location
 Expand-Archive -Path .\OpenSSH-Win64.zip -DestinationPath ($env:temp) -Force
# Move the extracted ZIP contents from the temporary location to C:\Program Files\OpenSSH\
 Move-Item "$($env:temp)\OpenSSH-Win64" -Destination "C:\Program Files\OpenSSH\" -Force
# Unblock the files in C:\Program Files\OpenSSH\
 Get-ChildItem -Path "C:\Program Files\OpenSSH\" | Unblock-File

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

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

Puede ver el resultado esperado a continuación.

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

## changes the sshd service's startup type from manual to automatic.
 Set-Service sshd -StartupType Automatic
## starts the sshd service.
 Start-Service sshd

Agregar una regla de Firewall de Windows para permitir el tráfico SSH

Este procedimiento se aplica sólo si su servidor Windows utiliza el Firewall de Windows. Para servidores que utilizan firewalls de terceros, consulte la documentación de su firewall sobre cómo permitir el puerto 22.

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

Una de las formas más sencillas de crear una nueva regla de Firewall de Windows es con 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 destinado al puerto 22.

Copie el siguiente comando y ejecútelo en PowerShell.

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

La siguiente captura de pantalla muestra el resultado esperado en PowerShell después de crear la regla de firewall.

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

En este punto, instaló OpenSSH en Windows y realizó la configuración inicial del servidor. El siguiente paso es probar si la conexión mediante SSH realmente funciona.

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

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

1. Esta vez desde su computadora local, abra PowerShell.

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

ssh [email 

3. Dado que se está conectando por primera vez al servidor, verá un mensaje que indica que no se puede establecer la autenticidad del host. El mensaje significa que su computadora aún no reconoce el host remoto. Escriba sí y presione Entrar para continuar.

4. Cuando se le solicite la contraseña, escriba la contraseña de su cuenta y presione Intro.

5. Después de iniciar sesión, como puede ver en la captura de pantalla a continuación, llegará al símbolo del sistema del host remoto. Suponga que desea confirmar que ha ingresado a la sesión en el host remoto. Para hacerlo, escriba hostname y presione Entrar. El comando debería devolver el nombre de la computadora remota.

Cambiar el Shell predeterminado de OpenSSH a PowerShell

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

Para cambiar el shell OpenSSH predeterminado de CMD a PowerShell:

Primero, abra una ventana elevada de PowerShell en su servidor Windows, si aún no tiene una abierta.

A continuación, cree un nuevo valor de cadena de registro llamado DefaultShell en la clave de registro HKLM:\SOFTWARE\OpenSSH. Establezca los datos de la cadena DefaultShell en Windows Ruta de 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 siguiente captura de pantalla muestra el resultado esperado del comando.

Configurar la autenticación de clave pública

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

En pocas palabras, un par de claves consta de dos claves denominadas clave pública y clave privada, que constituyen un conjunto de credenciales de seguridad para demostrar su identidad.

La clave pública se almacena en el servidor, mientras que la clave privada permanece en la computadora local. Debe tratar una clave privada como su contraseña. Si la clave privada está comprometida, cualquiera puede usarla para obtener acceso a su servidor SSH.

Preparando el archivo Administrators_authorized_keys

Las claves públicas deben estar en el servidor. ¿Pero donde? Para OpenSSH en Windows, el servidor SSH lee las claves públicas del archivo C:\ProgramData\ssh\administrators_authorized_keys. Pero este archivo no existe de forma predeterminada. Primero debes crear uno.

Siga estos pasos a continuación para crear el archivo administrators_authorized_keys y configurar su lista de control de acceso (ACL) adecuada.

En el servidor de Windows:

1. Abra una consola elevada de Windows PowerShell si aún no lo ha hecho.

2. Copie el siguiente comando y ejecútelo en PowerShell. Este comando crea el archivo administrators_authorized_keys mediante el cmdlet New-Item .

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

Debería ver un resultado similar a la captura de pantalla siguiente.

3. A continuación, obtenga la ACL actualmente asignada al archivo ssh_host_dsa_key y copie esa ACL al archivo Administrators_authorized_keys. Para hacerlo, ejecute 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 copiar la ACL de ssh_host_dsa_key a Administrators_authorized_keys tiene sentido porque la ACL ya está configurada.

4. Ahora abra el Explorador de Windows.

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

6. Haga clic derecho en el archivo administrators_authorized_keys y haga clic en Propiedades.

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

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

Generando un nuevo par de claves SSH

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

El ejemplo que se muestra en esta sección funciona tanto en computadoras con Windows como con Linux.

En su computadora local, en una consola de PowerShell:

1. Navegue hasta el directorio .ssh de su carpeta de inicio ejecutando el siguiente comando.

cd ~/.ssh

2. A continuación, escriba el comando ssh-keygen y presione Enter. Cuando se le solicite ingresar una ubicación de archivo para guardar la clave que está generando, mantenga la ubicación predeterminada y presione Entrar. Hacerlo le permitirá a su cliente SSH encontrar sus claves SSH al autenticarse automáticamente.

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

3. En el siguiente mensaje, deje la frase de contraseña en blanco. En este punto, no es necesario utilizar una frase de contraseña para realizar pruebas.

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

Notarás que el comando creó dos archivos; id_rsa (clave privada) y id_rsa.pub (clave pública).

Implementación de la clave pública en el servidor SSH de Windows

Ahora que ha generado su par de claves pública y privada, el siguiente paso es copiar la clave pública al archivo C:\ProgramData\ssh\administrators_authorized_keys en el servidor SSH.

En su computadora local, en una consola de PowerShell:

1. Copie el código siguiente y ejecútelo en PowerShell. Asegúrese de cambiar primero el nombre de usuario y la dirección IP. Puede consultar el comentario encima de cada comando para saber qué hace cada comando.

# Read the public key
 $public_key = Get-Content ~/.ssh/id_rsa.pub
# Append the public key to the administrators_authorized_keys on the server using ssh.
 ssh [email  "'$($public_key)' | Out-File C:\ProgramData\ssh\administrators_authorized_keys -Encoding UTF8 -Append"

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

Conexión con SSH mediante autenticación de clave pública

Ahora que ha copiado su clave pública en su servidor SSH, ya no necesita usar una contraseña para autenticarse. Como puede ver a continuación, ssh no solicitó una contraseña.

Configurar la autenticación de certificados

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

No es necesario asignar la clave pública a los archivos de claves_autorizadas o claves_autorizadas_de_administradores en el servidor SSH. En su lugar, la clave pública se firma utilizando una clave de autoridad certificadora (CA).

Creación de la clave de la autoridad certificadora (CA)

Generar las claves de CA para firmar es similar a generar un par de claves de usuario que hizo anteriormente en este artículo. Solo que esta vez deberá especificar un nombre de archivo para las nuevas claves de CA. Para hacerlo, en su Windows Server en una consola PowerShell:

Ejecute el comando ssh-keygen como se muestra a continuación. Este comando crea la clave CA en C:\ProgramData\ssh\ca_userkeys, pero no dude en utilizar un nombre de archivo diferente. El uso de un nombre de archivo diferente no afectará la funcionalidad de la clave CA.

Cuando se le solicite una frase de contraseña, déjela vacía y presione Entrar.

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

Puede 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.

Ahora que ha generado las claves de CA, dígale al servidor SSH que confíe en la CA y dónde encontrar la clave de CA. Para hacer esto, agregue una nueva línea TrustedUserCAKeys path/to/ca_userkeys.pub al archivo C:\ProgramData\ssh\sshd_config en el servidor.

Ejecute los siguientes comandos para agregar el elemento de configuración en el archivo sshd_config.

# If the SSH server is Windows
 echo TrustedUserCAKeys C:\ProgramData\ssh\ca_userkeys.pub>> C:\ProgramData\ssh\sshd_config

Firmar la clave pública del usuario

En este punto, generó las claves de CA y configuró el servidor SSH para confiar en el archivo de clave pública de CA. Lo que queda ahora es firmar su clave pública de usuario.

En su computadora local, en una consola de PowerShell:

1. Copie el archivo id_rsa.pub a su disco doméstico en el servidor SSH usando el comando SCP. Asegúrese de cambiar el nombre de usuario y la dirección IP a los valores correctos.

scp ((Resolve-Path ~/.ssh/id_rsa.pub).Path) [email :id_rsa.pub

2. Inicie sesión en su servidor Windows mediante ssh. Una vez que haya iniciado sesión, ejecute ssh-keygen para firmar la clave pública del usuario. Notarás que el siguiente comando utilizó varios parámetros. Analicémoslos.

  • -s C:\ProgramData\ssh\ca_userkeys: especifique 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: especifique el ID que desea asignar a la clave pública del usuario firmado. Cambie el valor id_username a cualquier 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 de usuario firmada será válida durante cuatro semanas. Puede cambiar este valor a su período de validez preferido.
  • -n nombre de usuario: este es el nombre de usuario de quién será el propietario de la clave pública firmada.
  • : 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 SSH, debería obtener un resultado 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.

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

scp [email :id_rsa-cert.pub ((Resolve-Path ~/.ssh/).Path)

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

Conexión con SSH mediante autenticación de certificado

Ha configurado la autenticación de certificado y ahora tiene su certificado de usuario. Ahora deberías probar si puedes conectar el servidor SSH con autenticación de certificado.

El comando para conectarse a SSH con un certificado es el mismo que usar una contraseña o clave pública. Pero, si habilitó la autenticación de clave pública anteriormente, desactívela primero. De lo contrario, ssh seguirá usando su par de claves en lugar de su certificado.

Para deshabilitar su par de claves, elimine su clave pública del archivo administrators_authorized_keys. Para hacerlo, siga estos pasos.

Tenga en cuenta que los comandos siguientes vaciarán todo el archivo Administrators_authorized_keys, eliminando efectivamente todas las claves públicas asignadas. Si no desea borrar todas las claves públicas asignadas, utilice un editor de texto para eliminar manualmente las claves públicas seleccionadas de cada archivo.

Mientras se realiza SSH en Windows Server:

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

# Clear the administrators_authorized_keys file
 $NULL > C:\ProgramData\ssh\administrators_authorized_keys
# Confirm that the administrators_authorized_keys is empty
 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 puede ver en la siguiente captura de pantalla.

3. Escriba exit y presione Entrar para desconectarse de su sesión SSH. Volverá a su sesión de PowerShell.

4. Después de eliminar las claves públicas, su 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.

Conclusión

Ahora ha configurado un servidor Windows OpenSSH desde cero hasta explorar y configurar varios medios de autenticación. ¡Ahora puede conectarse a sus servidores Windows exactamente como lo haría con Linux!

Artículos relacionados