Los misterios del protocolo SSH finalmente revelados

Oscar Martinez
NinjaCom
Published in
5 min readMay 28, 2020

En algún momento en tu vida como desarrollador tienes que utilizar el protocolo SSH para realizar alguna actividad, pero, ¿que es realmente SSH y como utilizarlo en mi día a día?

Imagen obtenida de https://www.linuxadictos.com/

Para poder entender SSH o Secure SHell es necesario remontarnos a uno de sus antepasados, Telnet, este es un protocolo de red que se utilizaba para poder acceder remotamente a la terminal de otra computadora, sin embargo, la transmisión de datos se realizaba sin ninguna clase de cifrado por lo cual tiene serios problemas en este aspecto, es por ello que nació SSH.

Según wikipedia:

SSH (o Secure SHell) es el nombre de un protocolo cuya principal función es el acceso a un servidor por medio de un canal seguro en el que toda la información está cifrada.

Fue creado en 1995 por Tatu Ylönen, y hasta el día de hoy (con bastantes modificaciones) seguimos utilizando este protocolo para acceder a dispositivos de forma virtual.

Resumidamente SSH es un protocolo que permite tener acceso a la terminal de otra computadora de forma remota y segura.

La manera en la que funciona el protocolo es un poco compleja, así que tratare de resumirla brevemente. SSH usa dos métodos de cifrado para asegurar que el intercambio de información entre dispositivos sea seguro.

Cifrado asimétrico

Imagen obtenida de https://www.ssl2buy.com/

Es un algoritmo de cifrado que utiliza dos archivos de texto plano, uno privado que cumple la función de cifrar los mensajes y uno publico que los descifra, la llave publica se genera a partir de la llave privada y es bastante costoso computacionalmente hablando el poder generar la llave privada a partir de la llave publica.

Cifrado simétrico

Imagen obtenida de https://www.ssl2buy.com/

Este cifrado es mas simple, utiliza solo un texto plano, que se utiliza para cifrar y descifrar los mensajes.

Bien, una vez explicado lo anterior debemos decir que SSH pasa por tres etapas:

  1. Autenticación del servidor(emisor) por el cliente(receptor).
  2. Generación de la llave de sesión con la cual se encriptara toda la comunicación.
  3. Autenticación del cliente.

Autenticacion del servidor

El cliente inicia una conexión SSH con el servidor. El servidor utiliza el puerto 22 por defecto (este puerto puede ser modificado), en este punto la identidad del servidor es verificada y existen dos casos:

  1. Si el cliente se conecta por primera vez: El cliente verifica manualmente la llave publica del servidor. Una vez que la llave ha sido verificada esta se agrega al archivo known_hosts que se encuentra en la ruta ~/.ssh del cliente, este archivo contiene todas las llaves publicas que han sido autorizadas por el cliente.
  2. Si no es la primera vez que el cliente se conecta por primera vez: La identidad del servidor se verifica a partir de las llaves que se encuentran en el archivo known_host.
Imagen obtenida de: https://youtu.be/zlv9dI-9g1U

Generacion de la llave de sesión

Una vez que el servidor es verificado, ambas partes ayudan a generar una llave para la sesión utilizando el algoritmo de cifrado simétrico. Esta llave es enviada tanto al cliente como al servidor y sera utilizada para cifrar y descifrar los datos que se comparten entre ambos.

Imagen obtenida de: https://kinsta.com/

Autenticación del cliente

Por ultimo, la autenticación del cliente se realiza a partir del cifrado asimétrico, de la siguiente forma:

  1. El cliente empieza enviando su llave publica con la cual desea autenticarse en el servidor.
  2. El servidor verifica que esta llave se encuentre dentro de su archivo known_hosts.
  3. Si la llave se encuentra en el archivo el servidor genera un numero aleatorio y usa la llave publica del cliente para cifrarlo, una vez terminado lo envía de nuevo al cliente.
  4. El cliente obtiene el numero del servidor con ayuda de su llave privada.
  5. El cliente combina el numero obtenido con la llave de sesión obtenida en el proceso anterior y calcula el hash MD5 de este valor y lo envía al servidor como respuesta del paso 3.
  6. El servidor realiza el mismo proceso del paso 5 por cuenta propia y compara los valores, el que recibe del cliente y el generado por el mismo, si ambos son iguales entonces la identidad del cliente queda confirmada.

Una vez realizado dicho proceso se utiliza la clave MD5 generada para realizar toda la comunicación entre el cliente y el servidor durante lo que resta de la conexión, una vez terminada esta la llave es desechada y se debe crear otra para tener acceso nuevamente.

Imagen obtenida de: https://blogs.encamina.com/

¿Para que me puede servir SSH en mi vida desarrollador?
- Generar contribuciones y repositorios con copias remotas en Github, Gitlab, etc
- Conectarse de forma remota a un servidor
-¿Se te olvido la tarea en la computadora de tu casa? Accede y copia el archivo que necesitas a la computadora de tu escuela y entrégalo como si nada hubiera pasado.

Por esto y mas, el protocolo SSH es una herramienta muy útil que esta ahí para ayudarnos, es todo por el momento, gracias por leer este articulo.

Fuentes:
https://medium.com/@Magical_Mudit/understanding-ssh-workflow-66a0e8d4bf65
https://math.mit.edu/services/help/account/ssh

--

--