Pasos detallados: crear y administrar claves SSH para la autenticación en una VM Linux en Azure

Se aplica a: ✔️ máquinas virtuales Linux ✔️ conjuntos de escalado flexibles

Con un par de claves SSH puede crear una máquina virtual Linux que use claves SSH para la autenticación. En este artículo se muestra cómo crear y usar rápidamente un par de archivos de claves pública-privada RSA SSH para conexiones cliente SSH.

Si desea comandos rápidos en lugar de una explicación más detallada de las claves SSH, consulte Creación de un par de claves pública-privada SSH para máquinas virtuales Linux en Azure.

Para crear claves SSH y usarlas para conectarse a una VM Linux desde un equipo Windows, vea Uso de claves SSH con Windows en Azure. También puede usar Azure Portal para crear y administrar claves SSH para crear máquinas virtuales en el portal.

Información general sobre SSH y sus claves

SSH es un protocolo de conexión cifrada que permite inicios de sesión seguros a través de conexiones no seguras. Aunque SSH proporciona una conexión cifrada, el uso de contraseñas con conexiones SSH deja la máquina virtual vulnerable a ataques por fuerza bruta. Se recomienda conectarse a una máquina virtual a través de SSH mediante un par de claves pública y privada, también conocidas como claves SSH.

  • La clave pública se coloca en la máquina virtual.

  • La clave privada permanece en el sistema local. Esta clave se debe proteger, por lo que no se debe compartir.

Cuando se usa un cliente SSH para conectarse a la máquina virtual (que tiene la clave pública), la máquina virtual remota comprueba que el cliente posee la clave privada. Si es el caso, se le concede acceso a la máquina virtual.

En función de las directivas de seguridad de la organización, puede volver a usar un par de claves públicas y privadas único para obtener acceso a varias máquinas virtuales y servicios de Azure. No es necesario usar ningún par de claves independiente para cada máquina virtual o servicio al que se quiera acceder.

La clave pública se puede compartir con cualquiera. Sin embargo, solo usted (o su infraestructura de seguridad local) debe tener acceso a la clave privada.

Formatos de clave SSH compatibles

Azure admite actualmente pares de claves públicas y privadas RSA del protocolo SSH 2 (SSH-2) con una longitud mínima de 2048 bits. No se admiten otros formatos de clave como ED25519 y ECDSA.

Uso y ventajas de las claves SSH

Cuando se crea una VM de Azure mediante la especificación de la clave pública, Azure copia la clave pública (en el formato .pub) a la carpeta ~/.ssh/authorized_keys en la VM. Las claves SSH de ~/.ssh/authorized_keys para asegurarse de que los clientes que conectan presentan la clave privada correspondiente durante una conexión SSH. En una máquina virtual Linux de Azure que usa claves SSH para la autenticación, Azure deshabilita el sistema de autenticación de contraseñas del servidor SSH y solo permite la autenticación de claves SSH. Mediante la creación una máquina virtual Linux de Azure con claves SSH, puede ayudar a proteger la implementación de la máquina virtual y ahorrarse el paso de configuración que es habitual después de la implementación para deshabilitar las contraseñas en el archivo sshd_config.

Si no quiere usar claves de SSH, puede configurar la VM Linux para que use la autenticación de contraseña. Si la máquina virtual no está expuesta a Internet, el uso de contraseñas puede ser suficiente. Aun así, es preciso que administre las contraseñas de cada VM Linux y que mantenga directivas y procedimientos seguros con respecto a las contraseñas, como la elección contraseñas con una longitud mínima y actualizaciones periódicas del sistema.

Generar claves con ssh-keygen

Para crear las claves, un comando preferido es ssh-keygen, que está disponible con las utilidades de OpenSSH en Azure Cloud Shell, un host de macOS o Linux y Windows (10 y 11). ssh-keygen realiza una serie de preguntas y, después, escribe una clave privada y una clave pública correspondiente.

Las claves SSH se mantienen de forma predeterminada en el directorio ~/.ssh. Si no tiene un directorio ~/.ssh, el comando ssh-keygen lo crea automáticamente con los permisos correctos. Una clave SSH se crea como un recurso y se almacena en Azure para su uso posterior.

Nota

También puede crear pares de claves con la CLI de Azure con el comando az sshkey create, como se describe en Generar y almacenar claves SSH.

Ejemplo básico

El siguiente comando ssh-keygen genera archivos RSA de SSH de clave pública y privada de 4096 bits de forma predeterminada en el directorio ~/.ssh. Si se encuentra un par de claves existentes SSH en la ubicación actual, esos archivos se sobrescribirán.

ssh-keygen -m PEM -t rsa -b 4096

Ejemplo detallado

En el siguiente ejemplo, se muestran las opciones de comando adicionales para crear un par de claves RSA de SSH. Si existe un par de claves SSH en la ubicación actual, esos archivos se sobrescribirán.

ssh-keygen \
    -m PEM \
    -t rsa \
    -b 4096 \
    -C "azureuser@myserver" \
    -f ~/.ssh/mykeys/myprivatekey \
    -N mypassphrase

Explicación del comando

ssh-keygen = programa usado para crear las claves;

-m PEM = formatea la clave como PEM

-t rsa = tipo de clave que se va a crear; en este caso, en el formato RSA

-b 4096 = número de bits de la clave; en este caso, 4096

-C "azureuser@myserver" = comentario que se anexa al final del archivo de clave pública para identificarlo fácilmente. Normalmente, se usa una dirección de correo electrónico como comentario, pero utilice lo que funcione mejor para su infraestructura.

-f ~/.ssh/mykeys/myprivatekey = nombre del archivo de clave privada, si decide no usar el nombre predeterminado. Se genera un archivo de clave pública correspondiente anexo a .pub en el mismo directorio. El directorio debe existir.

-N mypassphrase = frase de contraseña adicional que se usa para acceder al archivo de clave privada.

Ejemplo de ssh-keygen

ssh-keygen -t rsa -m PEM -b 4096 -C "azureuser@myserver"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/azureuser/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/azureuser/.ssh/id_rsa.
Your public key has been saved in /home/azureuser/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:vFfHHrpSGQBd/oNdvNiX0sG9Vh+wROlZBktNZw9AUjA azureuser@myserver
The key's randomart image is:
+---[RSA 4096]----+
|        .oE=*B*+ |
|          o+o.*++|
|           .oo++*|
|       .    .B+.O|
|        S   o=BO.|
|         . .o++o |
|        . ... .  |
|         ..  .   |
|           ..    |
+----[SHA256]-----+

Archivos de clave guardados

Enter file in which to save the key (/home/azureuser/.ssh/id_rsa): ~/.ssh/id_rsa

El nombre del par de claves en este artículo. Tener un par de claves denominado id_rsa es la opción predeterminada y algunas herramientas podrían esperar id_rsa como nombre del archivo de la clave privada, así que es buena idea tener uno. El directorio ~/.ssh/ es la ubicación predeterminada para los pares de claves SSH y el archivo de configuración de SSH. Si no se especifica con una ruta de acceso completa, ssh-keygen creará las claves en el directorio de trabajo actual, no en el predeterminado ~/.ssh.

Lista del directorio ~/.ssh

Para ver los archivos existentes en el directorio ~/.ssh, ejecute el siguiente comando. Si no se encuentra ningún archivo en el directorio o falta el propio directorio, asegúrese de que todos los comandos anteriores se ejecutaron correctamente. Es posible que necesite acceso raíz para modificar archivos en este directorio en determinadas distribuciones de Linux.

ls -al ~/.ssh
-rw------- 1 azureuser staff  1675 Aug 25 18:04 id_rsa
-rw-r--r-- 1 azureuser staff   410 Aug 25 18:04 id_rsa.pub

Frase de contraseña de la clave

Enter passphrase (empty for no passphrase):

Es muy recomendable agregar una frase de contraseña a las claves privadas. Sin una frase de contraseña que proteja el archivo de claves, cualquiera que disponga del archivo puede usarlo para iniciar sesión en cualquier servidor que tenga la clave pública correspondiente. El uso de una frase de contraseña ofrece más protección en caso de que alguien obtenga acceso al archivo de clave privada, ya que le daría tiempo para cambiar las claves.

Generar claves automáticamente durante la implementación

Si usa la CLI de Azure para crear la máquina virtual, de manera opcional, se pueden generar archivos de claves SSH pública y privada mediante la ejecución del comando az vm create con la opción --generate-ssh-keys. Las claves se almacenan en el directorio ~/.ssh. Tenga en cuenta que esta opción de comando no sobrescribe las claves si ya existen en esa ubicación, como con algunas imágenes preconfiguradas de la galería de procesos.

Proporcione la clave pública SSH al implementar una VM

Para crear una VM Linux que use claves SSH para la autenticación, proporcione la clave pública SSH al crear la VM mediante el portal de Azure, CLI, plantillas de Resource Manager u otros métodos. Al usar el portal, escriba propia la clave pública. Si usa la CLI de Azure para crear la máquina virtual con una clave pública existente, especifique el valor o la ubicación de esta clave pública mediante la ejecución del comando az vm create con la opción --ssh-key-value.

Si no está familiarizado con el formato de una clave pública SSH, puede ver su clave pública si ejecuta cat de la siguiente manera y reemplaza ~/.ssh/id_rsa.pub por la ubicación de su propio archivo de clave pública:

cat ~/.ssh/id_rsa.pub

La salida es similar a la siguiente (ejemplo redactado a continuación):

ssh-rsa XXXXXXXXXXc2EAAAADAXABAAABAXC5Am7+fGZ+5zXBGgXS6GUvmsXCLGc7tX7/rViXk3+eShZzaXnt75gUmT1I2f75zFn2hlAIDGKWf4g12KWcZxy81TniUOTjUsVlwPymXUXxESL/UfJKfbdstBhTOdy5EG9rYWA0K43SJmwPhH28BpoLfXXXXXG+/ilsXXXXXKgRLiJ2W19MzXHp8z3Lxw7r9wx3HaVlP4XiFv9U4hGcp8RMI1MP1nNesFlOBpG4pV2bJRBTXNXeY4l6F8WZ3C4kuf8XxOo08mXaTpvZ3T1841altmNTZCcPkXuMrBjYSJbA8npoXAXNwiivyoe3X2KMXXXXXdXXXXXXXXXXCXXXXX/ azureuser@myserver

Si copia y pega el contenido del archivo de clave pública en Azure Portal o en una plantilla de Resource Manager, asegúrese de no copiar ningún espacio en blanco adicional y de no introducir saltos de línea adicionales. Por ejemplo, si utiliza macOS, puede canalizar el archivo de clave pública (de forma predeterminada, ~/.ssh/id_rsa.pub) hacia pbcopy para copiar el contenido (hay otros programas de Linux que hacen lo mismo, como xclip).

Si prefiere usar una clave pública que se encuentra en un formato de varias líneas, puede generar una clave con formato RFC4716 en un contenedor de «pem» de la clave pública que creó anteriormente.

Para crear una clave con formato RFC4716 a partir de una clave pública SSH existente:

ssh-keygen \
-f ~/.ssh/id_rsa.pub \
-e \
-m RFC4716 > ~/.ssh/id_ssh2.pem

SSH en la VM con un cliente SSH

Con la clave pública implementada en la VM de Azure y la clave privada en su sistema local, aplique SSH en la VM con la dirección IP o nombre DNS de la VM. Reemplace azureuser y myvm.westus.cloudapp.azure.com en el siguiente comando con el nombre de usuario administrador y el nombre de dominio completo (o dirección IP):

ssh azureuser@myvm.westus.cloudapp.azure.com

Si proporcionó una frase de contraseña cuando creó el par de claves, escríbala cuando se le solicite durante el proceso de inicio de sesión. (El servidor se agrega a la carpeta ~/.ssh/known_hosts y no se le pedirá que se conecte de nuevo hasta que la clave pública de la máquina virtual de Azure cambie o se quite el nombre del servidor de ~/.ssh/known_hosts).

Si la máquina virtual está usando la directiva de acceso Just-In-Time, deberá solicitar acceso antes de poder conectarse a la máquina virtual. Para más información sobre la directiva Just-in-Time, vea Administración del acceso a máquina virtual mediante Just-In-Time.

Use ssh-agent para almacenar la frase de contraseña de clave privada

Para no tener que escribir la frase de contraseña del archivo de clave privada con cada inicio de sesión SSH, puede usar ssh-agent para almacenar en caché la frase de contraseña del archivo de clave privada en su sistema local. Si usa Mac, la aplicación Keychain de macOS almacena de forma segura las frases de contraseña de clave privada al invocar ssh-agent.

Compruebe y use ssh-agent y ssh-add para informar al sistema SSH acerca de los archivos de clave para que no sea necesario usar la frase de contraseña de forma interactiva.

eval "$(ssh-agent -s)"

Ahora, agregue la clave privada a ssh-agent mediante el comando ssh-add.

ssh-add ~/.ssh/id_rsa

La frase de contraseña de clave privada está almacenada ahora en ssh-agent.

Use ssh-copy-id para copiar la clave en una VM existente

Si ya ha creado una máquina virtual, puede agregar una clave pública SSH nueva a su máquina virtual Linux mediante ssh-copy-id.

ssh-copy-id -i ~/.ssh/id_rsa.pub azureuser@myserver

Creación y configuración de un archivo de configuración de SSH

Puede crear y configurar un archivo de configuración SSH (~/.ssh/config) para acelerar los inicios de sesión y optimizar el comportamiento del cliente SSH.

En el siguiente ejemplo se muestra una configuración simple que puede utilizar para iniciar sesión rápidamente como un usuario en una VM específica mediante la clave privada de SSH de forma predeterminada.

Cree el archivo.

touch ~/.ssh/config

Edite el archivo para agregar la nueva configuración de SSH

vim ~/.ssh/config

Agregue valores de configuración adecuados para la VM host. En este ejemplo, el nombre de la máquina virtual (host) es myvm, el nombre de cuenta (usuario) es azureuser y la dirección IP o el FQDN (nombre de host) es 192.168.0.255.

# Azure Keys
Host myvm
  Hostname 192.168.0.255
  User azureuser
# ./Azure Keys

Puede agregar configuraciones para hosts adicionales para permitir que cada uno use su propio par de claves dedicado. Vea archivo de configuración SSH para obtener más opciones de configuración avanzada.

Ahora que tiene un par de claves SSH y un archivo de configuración de SSH configurado, puede acceder en remoto en la máquina virtual Linux de forma rápida y segura. Cuando ejecute el siguiente comando, SSH busca y carga los valores de configuración del bloque Host myvm en el archivo de configuración SSH.

ssh myvm

La primera vez que inicie sesión en un servidor mediante una clave SSH, el símbolo del sistema le pedirá la frase de contraseña para ese archivo de clave.

Pasos siguientes

El siguiente paso es crear máquinas virtuales de Linux en Azure con la nueva clave pública SSH. Las máquinas virtuales de Azure que se crean con una clave pública SSH como inicio de sesión están mejor protegidas que las creadas con contraseñas, el método de inicio de sesión predeterminado.