Llaves SSH #

Docker

Antes de explicar qué son exactamente las llaves SSH, primero debemos entender el contexto del protocolo SSH.

Breve historia del protocolo SSH #

Tatu Ylönen era un estudiante de la Universidad de Helsinki, cuando un ataque de interceptación (sniffing attack) se descubrió en la red de la universidad. Este tipo de ataque intercepta el tráfico de la red para obtener información sensible, como contraseñas.

Este ataque motivó a Tatu a investigar como hacer las redes más seguras. Lo que le llevó a crear la primera versión del protocolo SSH . Hoy en día, el protocolo SSH es utilizado ampliamente para conectarse remotamente entre sistemas. Además de contar con una fuerte encriptación, que lo hace ideal en la era del Cloud Computing.

En síntesis, una llave SSH es una credencial de acceso en el protocolo SSH. Similar a una contraseña, pero son principalmente utilizadas para automatizar procesos de autenticación por diferentes tipos de usuario.

¿Cómo se utiliza el protocolo SSH? #

Para utilizar el protocolo SSH, es necesario instalar varias piezas de software, en los sistemas remotos, se requiere de un programa llamado SSH Daemon. Que en sí es un servidor, que escucha las peticiones de conexión. En el sistema local se requiere de un programa llamado SSH Client. Estas dos piezas de software son necesarias para la comunicación entre sistemas.

¿Qué son las llaves SSH? #

Son llaves que siempre vienen en pares, una llave pública y una llave privada. Quién posea estas dos llaves determina el tipo de par de llaves SSH. Por ejemplo, si las posee un usuario, se refiere a un par de llaves SSH de usuario. Si las posee un sistema remoto, entonces se refiere a un par de llaves SSH de sistema. En este artículo nos enfocaremos en las llaves SSH de usuario.

Llave privada #

En un par de llaves de usuario, la llave privada es la que se debe mantener segura, ya que se utiliza para desencriptar la información que se intercambia por medio del protocolo SSH. Por lo tanto nunca se debería compartir con nadie, y debe estar en un sistema seguro. Esta misma se puede proteger con una contraseña.

Llave pública #

La llave pública es la que se comparte con los sistemas remotos, para que puedan encriptar la información que se intercambia. Es utilizada por el usuario y el sistema remoto, este último la guarda en una lista que contiene todas las llaves públicas de los usuarios autorizados. Por parte del usuario se guarda en un software de gestión de llaves o en un archivo.

¿Cómo se generan las llaves SSH? #

En sistemas linux basados en arch, se debe instalar el paquete de openssh.

sudo pacman -S openssh

Iniciar el servicio de sshd, para que escuche las peticiones de conexión.

sudo systemctl start sshd

Luego de tener el servicio habilitado, se puede generar el par de llaves SSH.

ssh-keygen -f <key-name> -t rsa -b 4096
ssh-keygen

La opción -f indica el nombre del archivo donde se guardará el par de llaves. La llave privada se guardará en ~/.ssh/<key-name>. Y la llave pública se guardará en ~/.ssh/<key-name>.pub.

La opción -t indica el tipo de algoritmo utilizado para generar el par de llaves SSH. En este caso se utiliza el tipo rsa. Este es un viejo algoritmo basado en la dificultad de factorizar números primos grandes.

La opción -b indica el tamaño del par de llaves en bits. En este caso se utiliza un tamaño de 4096 bits. Aunque es recomendado utilizar 2048 bits, utilizar 4096 bits es más seguro.

Nos va a pedir una contraseña para proteger la llave privada. Esta contraseña es opcional, pero es recomendado utilizarla.

¿Cómo se utiliza el par de llaves SSH? #

Para utilizar el par de llaves SSH, primero se debe copiar la llave pública en el sistema remoto. Esto se puede hacer de varias formas, pero la más sencilla es utilizando el comando ssh-copy-id.

ssh-copy-id -i ~/.ssh/<key-name>.pub <user>@<host>
ssh-copy-id

Lo que estamos haciendo es indicarle que copie la llave pública deseada en el sistema remoto. El parámetro -i indica el archivo de la llave pública. <user> indica el usuario del sistema remoto. Y <host> indica el host del sistema remoto.

¿Cómo autenticarse con el sistema remoto? #

Configurar el cliente SSH #

Antes de autenticarnos, debemos de configurar un archivo llamado ~/.ssh/config. Para que el cliente SSH sepa que llave utilizar para autenticarse con el sistema remoto. Al cual le debemos de indicar con Host, el sistema al cual nos queremos conectar, en este caso 10.0.0.1, y con IdentityFile

, la ubicación de la llave privada, en este caso ~/.ssh/araya-key. Importante recalcar que es la llave privada, no la llave pública.

ssh-config

Con esto configurado, podemos aseguranos que el cliente SSH sepa que llave utilizar para autenticarse con el sistema remoto.

Autenticarse con el sistema remoto #

Ahora para autenticarnos con el sistema remoto, simplemente debemos de ejecutar el comando ssh <remote-username>@<remote-host>.

logged

Como se puede observar en la imagen, el cliente SSH nos pide la contraseña de la llave privada. Si la llave privada no tiene contraseña, entonces no nos la va a pedir.

Acceso denegado #

Si el cliente SSH no encuentra la llave privada para autenticarse nos va denegar el acceso.

permission-denied

Conclusión #

Asegurar nuestros sistemas por medio de llaves SSH es una buena práctica de seguridad. De forma que se le dificulta a los atacantes obtener acceso a nuestros sistemas. Por otra parte nos permite autenticarnos sin la necesidad de compartir contraseñas, además de que nos permite automatizar los procesos de autenticación.