Compartir a través de


Autenticación basada en claves en OpenSSH para Windows

Se aplica a Windows Server 2022, Windows Server 2019, Windows 10 (compilación 1809 y posteriores)

La mayoría de autenticaciones en entornos de Windows se realizan con un par de nombre de usuario y contraseña, lo que funciona bien para los sistemas que comparten un dominio común. Al trabajar con varios dominios (por ejemplo, entre sistemas locales y hospedados en la nube), se expone más a intrusiones de fuerza bruta.

En comparación, los entornos de Linux normalmente usan pares de clave pública y privada para controlar la autenticación, lo que no requiere el uso de contraseñas que se pudieran adivinar. OpenSSH incluye herramientas para ayudar a admitir la autenticación basada en claves, en concreto:

  • ssh-keygen para generar claves seguras.
  • ssh-agent y ssh-add para almacenar claves privadas de forma segura.
  • scp y sftp para copiar archivos de claves públicas de forma segura durante el uso inicial de un servidor.

En este documento se proporciona información general sobre cómo usar estas herramientas en Windows para empezar a usar la autenticación basada en claves con SSH. Si no está familiarizado con la administración de claves SSH, le recomendamos que revise el informe interno de NIST 7966 titulado "Seguridad de la administración de acceso interactiva y automatizada con Secure Shell (SSH)".

Acerca de los pares de claves

Los pares de claves hacen referencia a los archivos de clave pública y privada que utilizan determinados protocolos de autenticación.

La autenticación de clave pública SSH usa algoritmos criptográficos asimétricos para generar dos archivos de clave: uno "privado" y otro "público". Los archivos de clave privada son el equivalente de una contraseña y deben estar protegidos en todo momento. Si alguien adquiriese su clave privada, esa persona podrá iniciar sesión en cualquier servidor SSH al que tenga acceso. La clave pública es la que se coloca en el servidor SSH y puede compartirse sin poner en peligro la clave privada.

La autenticación basada en claves habilita al servidor SSH y al cliente para comparar la clave pública de un nombre de usuario proporcionado con la clave privada. Si la clave pública del lado servidor no se pudiera validar con la clave privada del lado cliente, se producirá un error de autenticación.

Para implementar la autenticación multifactor con pares de claves, debe introducir una frase de contraseña cuando se genera el par de claves (consulte Generación de claves de usuario a continuación). Se le pedirá al usuario la frase de contraseña durante la autenticación. La frase de contraseña se usa junto con la presencia de la clave privada en el cliente SSH para autenticar al usuario.

Importante

Una sesión remota abierta a través de la autenticación basada en claves no tiene credenciales de usuario asociadas y, por lo tanto, no es capaz de realizar la autenticación saliente como el usuario, lo que se produce por diseño.

Generación de claves de host

Las claves públicas tienen requisitos de ACL específicos que, en Windows, equivalen a permitir el acceso únicamente a los administradores y al sistema. Al usar sshd por primera vez, se generará automáticamente el par de claves para el host.

Importante

Primero debe tener instalado el servidor OpenSSH. Consulte la Introducción a OpenSSH.

De manera predeterminada, el servicio SSHD está configurado para iniciarse manualmente. Para iniciarlo cada vez que se reinicie el servidor, ejecute los siguientes comandos desde un símbolo del sistema de PowerShell con privilegios elevados en el servidor:

# Set the sshd service to be started automatically
Get-Service -Name sshd | Set-Service -StartupType Automatic

# Now start the sshd service
Start-Service sshd

Dado que no hay ningún usuario asociado al servicio SSHD, las claves de host se almacenan en C:\ProgramData\ssh.

Generación de claves de usuario

Para usar la autenticación basada en claves, primero debe generar pares de claves públicas o privadas para el cliente. ssh-keygen.exe se usa para generar archivos de clave y se pueden especificar los algoritmos DSA, RSA, ECDSA o Ed25519. Si no se especifica ningún algoritmo, se usa RSA. En este ejemplo, se debe usar un algoritmo seguro y una longitud de clave, como Ed25519.

Para generar archivos de claves mediante el algoritmo Ed25519, ejecute el siguiente comando desde un símbolo del sistema de PowerShell o cmd en el cliente:

ssh-keygen -t ed25519

La salida del comando debería mostrar la siguiente salida (donde "username" se reemplazará por su nombre de usuario):

Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ed25519):

Puede presionar Entrar para aceptar el valor predeterminado o puede especificar una ruta de acceso o un nombre de archivo en el que quiere que se generen las claves. Llegados a este punto, se te pedirá que uses una frase de contraseña para cifrar los archivos de clave privada. La frase de contraseña puede estar vacía, pero no se recomienda. La frase de contraseña funciona con el archivo de clave para proporcionar una autenticación en dos fases. En este ejemplo, dejaremos la frase de contraseña vacía.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username/.ssh/id_ed25519.
Your public key has been saved in C:\Users\username/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@LOCAL-HOSTNAME

The key's randomart image is:
+--[ED25519 256]--+
|        .        |
|         o       |
|    . + + .      |
|   o B * = .     |
|   o= B S .      |
|   .=B O o       |
|  + =+% o        |
| *oo.O.E         |
|+.o+=o. .        |
+----[SHA256]-----+

Ahora tiene un par de claves ed25519 públicas/privadas en la ubicación especificada. Los archivos .pub son claves públicas y los archivos sin extensión son claves privadas:

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         6/3/2021   2:55 PM            464 id_ed25519
-a----         6/3/2021   2:55 PM            103 id_ed25519.pub

Recuerda que los archivos de clave privada son el equivalente de una contraseña, por lo que se deben proteger de la misma manera que las contraseñas. Use ssh-agent para almacenar de forma segura las claves privadas en un contexto de seguridad de Windows y asócielas con la cuenta de Windows. Para iniciar el servicio ssh-agent cada vez que se reinicie el equipo y se use ssh-add para almacenar la clave privada, ejecute los siguientes comandos desde un símbolo del sistema de PowerShell con privilegios elevados en el servidor:

# By default the ssh-agent service is disabled. Configure it to start automatically.
# Make sure you're running as an Administrator.
Get-Service ssh-agent | Set-Service -StartupType Automatic

# Start the service
Start-Service ssh-agent

# This should return a status of Running
Get-Service ssh-agent

# Now load your key files into ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519

Una vez que haya agregado la clave a ssh-agent en el cliente, ssh-agent recuperará automáticamente la clave privada local y la pasará al cliente SSH.

Importante

Se recomienda realizar una copia de seguridad de la clave privada en una ubicación segura y, a continuación, eliminarla del sistema local después de agregarla al agente SSH. La clave privada no se puede recuperar del agente, siempre que se haya usado un algoritmo seguro, como Ed25519 en este ejemplo. Si pierde el acceso a la clave privada, tendrá que crear un nuevo par de claves y actualizar la clave pública en todos los sistemas con los que interactúe.

Implementación de la clave pública

Para usar la clave de usuario que se creó anteriormente, el contenido de la clave pública (\.ssh\id_ed25519.pub) debe colocarse en el servidor en un archivo de texto. El nombre y la ubicación del archivo dependen de si la cuenta de usuario es miembro del grupo de administradores locales o de una cuenta de usuario estándar. En las secciones siguientes se tratan los usuarios estándar y administrativos.

Usuario estándar

El contenido de la clave pública (\.ssh\id_ed25519.pub) debe situarse en el servidor en un archivo de texto llamado authorized_keys en C:\Users\username\.ssh\. Puede copiar la clave pública mediante la utilidad de transferencia segura de archivos scp de OpenSSH o mediante PowerShell para escribir la clave en el archivo.

En el ejemplo siguiente, se copia la clave pública en el servidor (donde "username" se reemplaza por su nombre de usuario). Inicialmente, deberá usar la contraseña de la cuenta de usuario para el servidor.

# Get the public key file generated previously on your client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub

# Generate the PowerShell to be run remote that will copy the public key file generated previously on your client to the authorized_keys file on your server
$remotePowershell = "powershell New-Item -Force -ItemType Directory -Path $env:USERPROFILE\.ssh; Add-Content -Force -Path $env:USERPROFILE\.ssh\authorized_keys -Value '$authorizedKey'"

# Connect to your server and run the PowerShell using the $remotePowerShell variable
ssh username@domain1@contoso.com $remotePowershell

Usuario administrativo

El contenido de la clave pública (\.ssh\id_ed25519.pub) debe situarse en el servidor en un archivo de texto llamado administrators_authorized_keys en C:\ProgramData\ssh\. Puede copiar la clave pública mediante la utilidad de transferencia segura de archivos scp de OpenSSH o mediante PowerShell para escribir la clave en el archivo. La ACL de este archivo debe configurarse para permitir solo el acceso a los administradores y al sistema.

En el ejemplo siguiente se copia la clave pública en el servidor y se configura la ACL (en que "username" se reemplaza por su nombre de usuario). Inicialmente, deberá usar la contraseña de la cuenta de usuario para el servidor.

Nota:

En este ejemplo, se muestran los pasos para crear el archivo administrators_authorized_keys. Esto solo se aplica a las cuentas de administrador y debe usarse en lugar del archivo por usuario dentro de la ubicación del perfil del usuario.

# Get the public key file generated previously on your client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub

# Generate the PowerShell to be run remote that will copy the public key file generated previously on your client to the authorized_keys file on your server
$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""Administrators:F"" /grant ""SYSTEM:F"""

# Connect to your server and run the PowerShell using the $remotePowerShell variable
ssh username@domain1@contoso.com $remotePowershell

En el caso de las versiones del sistema operativo traducidas a idiomas distintos del inglés, el script se deberá modificar para reflejar los nombres de grupo. Para evitar errores al conceder permisos a nombres de grupo, se puede usar el identificador de seguridad (SID) en su lugar. El SID se puede recuperar ejecutando Get-LocalGroup | Select-Object Name, SID. Cuando se usa el SID en lugar del nombre de grupo, debe ir precedido de un asterisco (*). En el ejemplo siguiente, el grupo Administrators usa el SID S-1-5-32-544:

$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""*S-1-5-32-544:F"" /grant ""SYSTEM:F"""

Estos pasos completan la configuración necesaria para usar la autenticación con OpenSSH basada en claves en Windows. Una vez ejecutados los comandos de PowerShell de ejemplo, el usuario podrá conectarse al host sshd desde cualquier cliente que tenga la clave privada.