Claves SSH distintas para distintos servidores

¿SSH es un protocolo para conexión de terminal remota? Sí, es eso, y mucho más. SSH es un protocolo de establecimiento de túnel seguro (cifrado) a nivel de capa de aplicación de TCP/IP. En un artículo anterior estuvimos comentando cómo autenticar un usuario contra un servidor usando claves SSH asimétricas. Imaginemos que estamos administrando 10 servidores de la misma manera. Generamos el par de claves en nuestro cliente ssh, y enviamos la clave pública al archivo authorized_keys de los 10 servidores… hasta ahí muy bonito.openssh_logo claves ssh

Ahora imaginemos que por alguna cuestión de seguridad (alguna vez comentamos de heartbleed por ejemplo), o torpeza nuestra, se compromete el archivo de clave privada de nuestro equipo. Eso significa que alguien podría hacerse con la clave y conectarse a los 10 servidores haciéndose pasar por nosotros, con todos los accesos que tenemos nosotros.

Conclusión hasta aquí, administrar varios equipos utilizando una sola clave privada puede llegar a ser un riesgo.

En esta entrega comentaré brevemente cómo podemos conectarnos a varios servidores remotos utilizando claves asimétricas SSH diferentes, una para cada servidor.

Generando las claves ssh

Este paso es exactamente igual al que comentamos acá. Supongamos un caso de prueba en el que con nuestro cliente vamos a conectarnos a dos servidores cuyas direcciones IP son 10.0.0.20 y 10.0.0.60.

Generemos las claves ssh para ambos, con sus respectivos nombres:

Copiando las claves ssh a sus respectivos sitios

Ahora copiamos las claves ssh a los equipos correspondientes, dentro de los authorized_keys de los usuarios.

Para el usuario “usuario” del server 10.0.0.20:

Para el usuario “alumno” del server 10.0.0.60:

Configurando nuestro cliente SSH

Ahora llegó la hora de editar las configuraciones de nuestro cliente ssh personal, es decir, cómo le decimos al cliente que use X clave para conectarse a tal server, o Y clave para hacerlo con cual server.

Para ello, editamos el archivo de configuración personal de nuestro cliente (en general estará vacío). Es el archivo ~/.ssh/config

Donde:

  • Host: es un alias para el nombre de host, que nos permita recordarlo. Yo he puesto la dirección IP en este ejemplo para evitar confusiones.
  • Hostname: es la dirección IP o nombre del servidor al que vamos a conectarnos.
  • User: es el usuario remoto con el cual vamos a autenticarnos (debe ser el que posee nuestra clave pública en su authorized_keys).
  • PreferredAuthentications: indica el método o métodos de autenticación utilizados para conectarnos a este host. He seleccionado publickey para la autenticación con clave asimétrica, pero hay varios, password para contraseña por ejemplo, etc.
  • IdentityFile: indica el archivo de clave privada utilizado para conectarnos. Debe ser el par de la clave publica que “subimos” al authorized_keys del servidor.

NOTA: otros parámetros de configuración del cliente pueden leerse en:

man ssh_config

Testeando la conexión

Ahora la prueba de fuego, vamos a conectarnos!

Conectando al host 10.0.0.20:

Conectando al host 10.0.0.60:

La prueba ha sido un éxito 🙂

Notas adicionales

Por un lado, aclarar que en el caso de que un cliente no conecte y siempre nos pida contraseña, podremos optar por agregar las claves privadas de conexión a nuestro agente de autenticación local utilizando ssh-add de la siguiente forma:

Si ahora listamos las claves ssh agregadas:

Por otro lado, cabe añadir que si disponemos de varias claves privadas y no sabemos con cual debemos autenticarnos, podemos especificar varias líneas “IdentityFile” para que vaya probando una clave por vez.

Espero les sirva! Cualquier duda o comentario están invitados a escribir, y por supuesto, a compartir si les resulta útil!