Cómo configurar SSH para autenticar con clave pública y privada

Está demostrado que utilizar claves para autenticar una conexión SSH es mucho más seguro que usar un usuario y una contraseña.

Hoy vamos a ver cómo se genera un par de claves, cómo se instala la clave pública en el servidor y finalmente cómo establecemos una conexión SSH o usamos algún otro servicio sobre este protocolo como rsync.

Prerrequisitos

Para elaborar esta documentación se ha utilizado una máquina virtual creada sobre QEMU con Ubuntu 24.04. Esta máquina tiene una interfaz con una dirección de la red que hace NAT y por lo tanto puede conectarse a internet. También tiene una interfaz conectada a la red que comparte con el host. Esta interfaz tiene la dirección 192.168.122.21 y permite las conexiones SSH desde el anfitrión, o sea, desde mi equipo.

Esta máquina dispone de un usuario con privilegios de root via sudo y puede conectar via SSH autenticándose con su contraseña.

Generación del par de claves

Lo primero que necesitamos es disponer de una par de claves : la pública y la privada. La clave pública se la podemos dar a cualquiera, enviarla por correo electrónico, publicarla en los foros… lo que queramos. La clave privada hemos de guardarla y custodiarla ya que es la que nos permitirá el acceso.

El sistema de claves, o de clave asimétrica se trata de una mecanismo por el que se generan dos llaves, vamos a llamar complementarias : Lo que hagamos con una llave sólo lo podremos deshacer con la otra y quien dice hacer, dice también validar.

En una máquina que será la que utilizaremos para conectarnos al servidor generaremos las claves ejecutando :

ssh-keygen -C "albus@hogwarts.edu" -f ~/.ssh/albus

dónde :

  • -C «albus@hosgwars.edu» es un identificador interno que habrá en la llave de manera que podamos verlo si mostramos el contenido del archivo que la contiene.
  • -f [Ruta]/[Archivo] es la ruta donde se guardarán las claves pública y privada. Hemos de tener en cuenta que el nombre que asignemos será el de la clave privada. La clave pública tiene extensión .pub.

Durante el proceso de generación se nos pedirá una contraseña. En este caso es para proteger la propia clave ya que sin este password no vamos a poder usarla.

Una vez nos ha generado la clave podremos comprobar que los ficheros están en la ruta que hemos definido.

Tip : Llaves por defecto

Si quieres que la clave sea tu identidad principal y que se use de manera predeterminada siempre que conectes a algún sitio, genera la llave sin indicar el nombre de archivo. En este caso te creará los archivos ~/.ssh/id_rsa y ~/.ssh/id_rsa.pub.

Instalación de claves en el servidor

Para instalar las claves en el servidor es necesario que tengamos previamente acceso al mismo. El proceso no es complejo pero la dificultad a veces reside en cómo hacemos llegar la clave al servidor. En este caso optaremos por dos mecanismos : uno muy elaborado usando ssh-copy-id y uno muy cutre pero efectivo.

La clave la vamos a instalar en el usuario que ya tenemos creado en el sistema y que tiene acceso por SSH con contraseña. En mi caso, en aras de ser original, se llama albus.

Copia de la clave pública usando ssh-copy-id

En la mayoría de distribuciones existe el comando ssh-copy-id que nos permite transferir e instalar la clave pública que indiquemos en el usuario con el que hagamos login.

Los únicos requisitos que se deben cumplir para poder usar este sistema son :

  • El servicio SSH debe estar configurado para aceptar contraseña como método de validación.
  • El usuario deberá disponer de una contraseña definida.

En la mayoría de sistemas recién instalados se cumplen ambos requerimientos por lo que no deberíamos preocuparnos.

Para transferir e instalar la clave ejecutaremos en la máquina cliente (en la que tenemos las claves) :

ssh-copy-id -i ~/.ssh/albus.pub albus@192.168.122.21

El comando nos pedirá la contraseña y nos indicará que ya podemos conectar.

Una vez copiada la clave, ya podremos hacer un SSH usando la clave privada :

ssh -i ~/.ssh/albus albus@192.168.122.21

Si todo ha sido correcto podremos hacer login sin teclear la contraseña.

Copy-Paste de la clave pública

Este mecanismo es más cutre pero también muy efectivo. Básicamente se trata de copiar el contenido del archivo que contiene la clave pública en memoria. En nuestro caso el archivo es ~/.ssh/albus.pub. Y después, conectarnos al servidor remoto como esté establecido (por una conexión ssh, a través de la consola de virtualización o del propio servidor) y pegar el contenido en un archivo determinado. Vayamos por pasos.

Abrimos el archivo que contiene la clave pública. En mi caso el archivo es ~/.ssh/albus.pub y voy a usar el editor de notas de KDE llamado kate pero puedes usar el que quieras. Una vez abierto, lo seleccionas y lo copias en memoria (Ctrl + C).

Abres una conexión en remoto contra el servidor y con tu editor favorito -el mío es vi pero puedes usar nano o hasta emacs- editas el archivo ~/.ssh/authorized_keys. A continuación pega el contenido y guarda los cambios. Ya puedes salir del editor.

Necesitaremos cambiar los permisos del archivo que acabamos de crear porque necesita unos permisos muy restringidos.

chmod 500 ~/.ssh/authorized_keys

A partir de aquí, volvemos a la máquina cliente. Ya podremos probar la conexión ejecutando

ssh -i ~/.ssh/albus albus@192.168.122.21

Con este comando deberíamos poder conectarnos sin teclear la contraseña.

Conclusión

Conclusión

Aunque usar un sistema de clave pública/privada aumenta la seguridad del servicio, se pueden aplicar otras medidas para bastionar tu servicio. Las tienes explicadas en el post Cómo bastionar el servicio SSH.

Si te interesa el contenido no olvides suscribirte a mi newsletter para recibir updates cuando publique alguna cosa.

Bonus track : Cargar la clave como identidad

En el equipo que vamos a usar para conectar a sevidores remotos podremos añadir claves a un gestor de identidiades que se llama ssh-agent. Este gestor será el encargado de comprobar cada vez que conectemos a un equipo remoto si tenemos la llave adecuada para conectar.

Para añadir una clave al gestor nada más hay que ejecutar :

ssh-add ~/.ssh/albus

Nos indicará que hemos añadido la nueva identidad.

El comando ssh-add acepta más de una clave por lo que podremos cargar varias llaves al agente.