Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 entre dominios, como entre sistemas locales y hospedados en la nube, este tipo de autenticación se vuelve vulnerable a intrusiones por fuerza bruta.
En comparación, los entornos de Linux suelen usar pares de claves públicas y privadas para impulsar la autenticación que no requiere el uso de contraseñas adivinables. OpenSSH incluye herramientas para ayudar a admitir la autenticación basada en claves, específicamente:
- ssh-keygen para generar claves seguras.
- ssh-agent y ssh-add para almacenar claves privadas de forma segura.
- scp y sftp para copiar de forma segura los archivos de clave pública 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 Secure Shell (SSH). Si no está familiarizado con la administración de claves SSH, le recomendamos que revise el documento DE NIST IR 7966, titulado Seguridad de la administración interactiva y automatizada de acceso mediante Secure Shell (SSH).
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. Cada archivo de clave privada es el equivalente de una contraseña y debe permanecer protegido en todas las circunstancias. 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 lo que se coloca en el servidor SSH y se puede compartir sin poner en peligro la clave privada.
El servidor SSH y el cliente pueden usar la autenticación basada en claves 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.
La autenticación multifactor se puede implementar con pares de claves escribiendo una frase de contraseña cuando se genera el par de claves. Para obtener más información, consulte Generación de claves de usuario. Se solicita al usuario la frase de contraseña durante la autenticación. La frase de contraseña combinada con la presencia de la clave privada se usa 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. Como resultado, la sesión no es capaz de la autenticación de salida como usuario. Este comportamiento es por diseño.
Generación de claves de host
Las claves públicas tienen requisitos específicos de la lista de control de acceso (ACL) que, en Windows, equivalen solo a permitir el acceso a los administradores y al usuario del sistema. La primera vez que se usa el sshd
servicio, se genera automáticamente el par de claves para el host.
Importante
Debe instalar OpenSSH Server para poder ejecutar los comandos de este artículo. Para obtener más información, consulte Introducción a OpenSSH para Windows.
De manera predeterminada, debe iniciar sshd
manualmente. A fin de configurarlo para que se inicie 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
# Start the sshd service.
Start-Service sshd
Dado que no hay ningún usuario asociado al sshd
servicio, 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. Puede usar ssh-keygen.exe
para generar archivos de clave y puede especificar los siguientes algoritmos de generación de claves:
- Algoritmo de firma digital (DSA)
- Rivest–Shamir–Adleman (RSA)
- Algoritmo de firma digital de curva elíptica (ECDSA)
- ED25519
Si no especifica un algoritmo, se usa Ed25519. En este ejemplo, se debe usar un algoritmo seguro y una longitud de clave, como ECDSA.
Para generar archivos de clave mediante el algoritmo ECDSA, ejecute el siguiente comando en una ventana de PowerShell o símbolo del sistema en el cliente:
ssh-keygen -t ecdsa
La salida del comando debe tener un aspecto similar a las siguientes líneas, excepto que username
se reemplaza por el nombre de usuario:
Generating public/private ecdsa key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ecdsa):
En el símbolo del sistema, puede presionar Entrar para aceptar la ruta de archivo predeterminada o puede especificar una ruta o nombre de archivo para las claves generadas.
A continuación, se le pedirá que use una frase de contraseña para cifrar los archivos de clave privada. En general, no se recomienda usar una frase de contraseña vacía, ya que la frase de contraseña funciona con el archivo de clave para proporcionar autenticación en dos fases. Pero para este ejemplo, puede dejar la 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_ecdsa.
Your public key has been saved in C:\Users\username/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@LOCAL-HOSTNAME
The key's randomart image is:
+--[ECDSA 256]--+
| . |
| o |
| . + + . |
| o B * = . |
| o= B S . |
| .=B O o |
| + =+% o |
| *oo.O.E |
|+.o+=o. . |
+----[SHA256]-----+
Ahora tiene un par de claves ECDSA públicas/privadas en la ubicación especificada. El archivo .pub es la clave pública y el archivo sin una extensión es la clave privada:
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 6/3/2021 2:55 PM 464 id_ecdsa
-a---- 6/3/2021 2:55 PM 103 id_ecdsa.pub
Un archivo de clave privada es el equivalente de una contraseña y debe protegerse de la misma manera que protege la contraseña.
Puedes usar ssh-agent
para almacenar de forma segura las claves privadas dentro de un contexto de seguridad de Windows asociado a tu cuenta de Windows. Para configurar el ssh-agent
servicio para que se inicie automáticamente cada vez que se reinicie el ordenador y usar ssh-add
para almacenar la clave privada, ejecute los siguientes comandos en una ventana de PowerShell con privilegios elevados en el servidor:
# By default, the ssh-agent service is disabled. Configure it to start automatically.
# Run the following command as an administrator.
Get-Service ssh-agent | Set-Service -StartupType Automatic
# Start the service.
Start-Service ssh-agent
# The following command should return a status of Running.
Get-Service ssh-agent
# Load your key files into ssh-agent.
ssh-add $env:USERPROFILE\.ssh\id_ecdsa
Después de agregar la clave al servicio en el ssh-agent
cliente, el ssh-agent
servicio recupera automáticamente la clave privada local y la pasa 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 ssh-agent
servicio. La clave privada no se puede recuperar del agente cuando se usa un algoritmo seguro, como ECDSA en este ejemplo. Si pierde el acceso a la clave privada, debe crear un par de claves y actualizar la clave pública en todos los sistemas con los que interactúa.
Implementación de la clave pública
Para usar la clave de usuario que creó anteriormente, debe colocar el contenido de la clave pública (\.ssh\id_ecdsa.pub) 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 local o de una cuenta de usuario estándar. En las secciones siguientes se tratan los usuarios estándar y administrativos.
Usuario estándar
Debe colocar el contenido de su clave pública (\.ssh\id_ecdsa.pub) 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 openSSH scp
secure file-transfer o mediante PowerShell para escribir la clave en el archivo.
Puede usar el código siguiente para copiar la clave pública en el servidor. En la última línea, reemplace username
por su nombre de usuario. Inicialmente, se le pedirá que escriba una contraseña para la cuenta de usuario del servidor.
# Get the public key file generated previously on your client.
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub
# Generate the PowerShell command to run remotely that copies 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 command by using the $remotePowerShell variable.
ssh username@domain1@contoso.com $remotePowershell
Usuario administrativo
Debe colocar el contenido de la clave pública (\.ssh\id_ecdsa.pub) 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 openSSH scp
secure file-transfer 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 usuario del sistema.
Puede usar el código siguiente para copiar la clave pública en el servidor y configurar la ACL. En la última línea, reemplace username
por su nombre de usuario. Inicialmente, se le pedirá que escriba una contraseña para la cuenta de usuario del servidor.
Nota:
En este ejemplo, se muestran los pasos para crear el archivo administrators_authorized_keys
. Este archivo solo se aplica a las cuentas de administrador. Debe usarlo en lugar del archivo específico del 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_ecdsa.pub
# Generate the PowerShell command to run remotely that copies 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 command by using the $remotePowerShell variable.
ssh username@domain1@contoso.com $remotePowershell
En el caso de las versiones localizadas que no son en inglés del sistema operativo, el script debe modificarse para reflejar los nombres de grupo en consecuencia. Para evitar errores que pueden producirse al conceder permisos para los nombres de grupo, puede usar el identificador de seguridad (SID) en lugar del nombre del grupo. Para recuperar el SID, ejecute Get-LocalGroup | Select-Object Name, SID
. Cuando se usa el SID en lugar del nombre del grupo, debe ir precedido por 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.
Después de ejecutar estos comandos de PowerShell, puede conectarse al sshd
host desde cualquier cliente que tenga la clave privada.