Este artículo tomará un enfoque de alto nivel y de arriba hacia abajo para explicar cómo funciona SSH y cómo se usa para comunicarse de manera segura con computadoras remotas.

Veremos como una sesión de SSH es realmente "segura" y cómo las computadores establecen y configuran una sesión de SSH en primer lugar. También veremos los beneficios de usar SSH.

Nota: Esto está pensado como notas futuras para mí, ¡pero espero que tú también aprendas algo de ello!

¿Qué es SSH?

SSH es la abreviatura de 'secure shell'. Es un protocolo para compartir datos entre dos computadoras a través de Internet.

Un protocolo es esencialmente un conjunto de reglas que definen el lenguaje que las computadores pueden utilizar para comunicarse.

Típicamente, las dos computadores involucradas son tu computadora (el "cliente) y un servidor remoto (el "host).

¿Por qué nos importa?

Comunicación segura entre computadoras

Siempre que dos computadoras se comunican por Internet queremos estar seguros de que nuestros mensajes no pueden ser interceptados y entendidos por nadie que escuche los mensajes.

Imagina enviar tus datos bancarios a través de Internet para comprar algo en línea. Si tus mensajes no estuvieran cifrados, entonces cualquier computadora que estuviera escuchando o cualquier computadora que recibiera los mensajes para transmitirlos podría ver tu número de cuenta y tu contraseña. ¡Eso no es bueno!

Creo que es un concepto importante de entender para cualquiera que aspire a trabajar con tecnologías web.

Acceso seguro a computadoras remotas

El uso de SSH para comprobar la autenticación es una forma más segura de autenticación que el uso de una contraseña. A continuación exploraremos cómo funciona esto.

¿Cómo es SSH seguro?

SSH es una forma segura de enviar comunicaciones entre dos computadoras.

Por 'seguro', me refiero a una forma de codificar los mensajes en una computadora cliente de tal manera que la única otra computadora que puede decodificar los mensajes y entenderlos es el host. Esta codificación/decodificación se llama cifrado, así que lo que realmente queremos decir aquí es que SSH es seguro porque utiliza un canal de comunicación cifrado.

¿Cómo se establece una sesión de SSH?

Hay varios procesos que deben ocurrir entre dos computadoras para que comience una sesión de SSH.

  1. Primero necesitamos una forma de establecer un método seguro de intercambio de mensajes entre las computadoras. Necesitamos establecer un canal cifrado.
  2. Necesitamos una forma de comprobar que los datos recibidos por el host no han sido manipulados. Esto se llama verificación y aquí estamos verificando la integridad de los datos que son enviados por el cliente.
  3. Verificación (de nuevo). Necesitamos una forma de comprobar que la computadora con la que nos comunicamos no es un impostor. Esta es otra forma de verificación pero aquí estamos verificando la identidad de la computadora.

Después de estos tres pasos, ahora podemos comunicarnos de forma segura con una computadora remota.

Después de estos pasos, podemos compartir datos "secretos" de forma segura y también podemos comprobar si un cliente tiene permiso para acceder a un host de forma más segura que usando una contraseña. Este proceso se llama autenticación usando cifrado asimétrico.

Cada una de estas secciones a continuación entrará en más detalles sobre estos pasos.

Configurar un canal cifrado

Una parte esencial del protocolo SSH es que es seguro (¡está incluso en el nombre!), lo que significa que toda la información que se envía usando SSH está cifrada.

¿Cómo se cifra esta información?

Cifrar esencialmente sólo significa "mezclar las letras" usando algunas matemáticas inteligentes. Ambas computadoras necesitan tener una forma de cifrar la información para que sólo la otra computadora pueda descifrarla y entenderla.

¿Cómo funciona esto?

Ambas computadoras tienen una versión idéntica de una clave simétrica. La clave simétrica es sólo una cadena de letras almacenadas en algún lugar de las computadoras. Las computadoras pueden usar las claves simétricas para cifrar y también descifrar los mensajes que se les envían.

El uso de este enfoque de clave simétrica se llama cifrado simétrico. La parte "simétrica" viene del hecho de que la clave simétrica en cada computadora es idéntica. Este enfoque funciona muy bien... pero sólo funciona mientras ninguna otra computadora tenga acceso a la clave simétrica.

Un problema

¿Cómo saben ambas computadoras cuál es la clave simétrica?

Una computadora podría crearla y enviarla en un mensaje a través de Internet. Pero los mensajes no estarían cifrados todavía, así que cualquiera que intercepto los mensajes tendría instantáneamente la clave simétrica ... y podría descifrar todas las comunicaciones futuras. ¡Eso es malo!

Esto a veces se llama el problema del "intercambio de claves". Está claro que necesitamos agregar otro paso en el proceso antes de poder usar las claves simétricas.

Una solución

Una solución al problema del "intercambio de claves" mencionado anteriormente es que ambas computadoras compartan alguna información pública entre sí (es "pública", lo que significa que no les importa si alguien la intercepta) y la combinen con alguna información en su propia computadora para crear independientemente claves simétricas idénticas.

Estas claves simétricas pueden ser usadas en el cifrado simétrico de la manera descrita anteriormente.

Cómo funciona

Ambas computadoras tienen cada una su propia clave privada y su clave pública. Juntos forman un par de claves (key-pair). Las computadoras comparten sus claves públicas entre sí a través de Internet. Así que, en este punto del proceso cada computadora sabe

  • su propia clave privada,
  • su propia clave pública,
  • y la clave pública de la otra computadora.

Generando Claves Simétricas

Ambas computadoras usan estas tres piezas de información para generar independientemente una clave simétricas idéntica.

Cada computadora utiliza un algoritmo matemático que utiliza las 3 entradas mencionadas anteriormente. Este algoritmo es parte del algoritmo de intercambio de claves Diffie-Hellman. El algoritmo que se ejecutará en cada computadora es algo así:

Host
pub_2 = other computer's public key
pub_1 = my public key
pri_1 = my private key

f(pub_2, pub_1, pri_1) = abcdefg // Symmetric Key

Client:
f(pub_1, pub_2, pri_2) = abcdefg // Symmetric Key

Lo importante es que las computadoras sólo han compartido información pública a través de Internet, ¡pero aún así han sido capaces de crear claves simétricas!

El enfoque de utilizar pares de claves y compartir información pública para generar claves simétricas idénticas se llama cifrado asimétrico. Se llama "asimétrico" porque ambas computadoras comienzan con sus propios pares de claves, diferentes.

Hasta ahora: hemos visto cómo usar el cifrado asimétrico para generar independientemente claves simétricas idénticas en ambas computadoras de una manera segura (resolviendo el problema de intercambio de claves) y luego intercambiar información de manera segura entre las computadoras usando claves simétricas para el cifrado y descifrado.

Verificación

Así que podemos comunicarnos de forma segura. Pero la siguiente parte del proceso de establecer una sesión de SSH es verificar que los datos no han sido manipulados como han sido transmitidos y que la otra computadora es realmente quien dice ser.

¿Por qué necesitamos esto?

Otra computadora podría personificar otra de las computadoras e iniciar el intercambio de claves de arriba. Entonces, ¿cómo podemos averiguar con seguridad que el mensaje es realmente de la otra computadora y no de un impostor?

Hashing

Tenemos que usar una función de hash. Esta es sólo una función matemática que toma entradas y produce una cadena de un tamaño fijo.

La característica importante de esta función es que es virtualmente imposible calcular lo que las entradas fueron sólo usando salidas.

Después de que un cliente y un host hayan generado sus claves simétricas, el cliente usará una función hash para generar un HMAC. Esto sólo significa "código de autenticación de mensaje basado en hash" (hash-based message authenticacion code). El cliente enviará este HMAC al servidor para su verificación.

Los ingredientes de la función de hash son

  • La clave simétrica en el cliente
  • El número de secuencia del paquete (cada mensaje que se envía está contenido en un "paquete" de información)
  • El contenido (¡¡¡cifrado!!!) del mensaje

Un ejemplo con datos falsos:

symm_key       = abcdefg
pkge_no        = 13
encr_message   = encrypted_password

Hash(symm_key, pkge_no, encr_message) = *HMAC* // Hashed value

¿Cómo es que el host usa esta información?

Cuando el host recibe el HMAC, puede usar la misma función hash con estos tres ingredientes:

  • su propia copia de la clave simétrica (¡idéntica!),
  • el número de secuencia del paquete,
  • y el mensaje cifrado.

Si el valor calculado es el mismo que el HMAC que recibió del cliente, entonces hemos verificado que la computadora que se conecta es el mismo que tiene la clave simétrica.

Recuerde que sólo el host y el cliente saben lo que es la clave simétrica y ninguna otra computadora lo sabe.

Así que aquí no importa que el host no conozca el contenido decodificado del mensaje cifrado — ¡el host aún ha verifica la identidad de la computadora que se conecta!

La belleza de este enfoque es que no sólo hemos verificado la identidad del cliente y nos hemos asegurado de que los datos no han sido manipulados, sino que lo hemos hecho de forma segura (sin compartir ninguna información privada).

Resumen: hemos utilizado una función hash en el cliente y luego en el host para verificar la integridad de los datos y comprobar la identidad del cliente.

ej0rVm5QFV0xIuBr4f2Dm8CIAqxZTjkfl5jP

Autenticación

La parte final de la comunicación segura con las computadoras remotas es:

incluso si hemos generado claves simétricas con la computadora de conexión e

incluso si estamos usando las claves simétricas para comunicarnos de forma segura e

incluso si la computadora que se conecta es realmente el cliente que esperamos y no un impostor,

entonces hemos establecido una sesión de SSH... ¿pero la computadora que se conecta tiene permiso para acceder al contenido del host?

Esto se llama "autenticación": el acto de comprobar los permisos y derechos de acceso.

Hay dos formas para comprobar la autenticación:

1—Usando una contraseña

El cliente puede enviar al host un mensaje (cifrado) que contenga una contraseña. El host puede descifrar el mensaje y comprobar la contraseña en una base de datos para comprobar si el cliente tiene permiso para acceder al "usuario" (área de la computadora) especificado. Listo.

2 — Usando par de claves y cifrado asimétrico

Antes vimos cómo el cifrado asimétrico puede utilizar dos pares de claves para generar de forma segura claves simétricas idénticas tanto en el cliente como en el host. Usando ideas similares, el cliente puede iniciar sesión sin una contraseña.

Este es un enfoque de muy alto nivel de cómo funciona el proceso:

Preparación:

En el cliente, dirígete a la terminal y usa un comando para generar una clave pública y una clave privada (bajo la superficie utiliza "RSA", un algoritmo matemático) en el cliente. Copia la clave pública (¡NO la privada!) en el portapapeles.

Repito: Copia la clave PÚBLICANO LA CLAVE PRIVADA!) en el portapapeles.

Luego, en la terminal del cliente, usa una contraseña para ingresar remotamente al host. Pega la clave pública del cliente en la carpeta apropiada del host junto con cualquier otra clave pública.

Ahora, el host tiene

  • Su propio par de claves pública/privada
  • La clave pública del cliente

Mirando la sección anterior sobre el algoritmo de intercambio de claves, ¡se puede ver cómo el host tiene todos los ingredientes que necesita para generar una clave simétrica!

Desafiante:

Cuando el cliente quiere conectarse, el host puede emitir un "desafío" enviando un mensaje que ha sido cifrado (con la clave simétrica del host) y decir: "¡Sólo te autorizaré el acceso si puedes descifrar este mensaje!".

El cliente entonces tiene

  • su propia clave pública y privada
  • la clave pública del host
  • el mensaje cifrado

Así que ahora el cliente tiene todo lo necesario para generar una clave simétrica (idéntica) ... ¡y descifrar el mensaje! Puede descifrar el mensaje y enviar una confirmación de que ha "tenido éxito" en el desafío de vuelta al host.

El host está satisfecho de que el cliente que se conecta está autorizado y concede permiso para el acceso.

¿Por qué molestarse en usar el segundo enfoque?

Esto se considera más seguro que el simple uso de una contraseña, ya que un bot puede utilizar un enfoque de "fuerza bruta" para seguir usando muchas combinaciones para adivinar tu contraseña, pero no tendrá el par de claves correctos para que funcione el segundo enfoque.

Más lecturas:

SSH Tutorial for Beginners - How Does SSH Work
SSH, or Secure Shell, is a remote administration protocol that allows users to control and modify their remote servers…www.hostinger.com

https://www.udemy.com/the-complete-junior-to-senior-web-developer-roadmap/

Conclusión

SSH es una importante herramienta utilizada para controlar remotamente otras computadoras.

SSH es seguro porque ambas computadoras pueden cifrar y descifrar el mensaje usando idénticas claves simétricas (conocido como "cifrado simétrico").

Los principales pasos para iniciar una sesión de SSH son:

  1. Configurar un canal cifrado. Usando cifrado asimétrico para resolver el problema de intercambio de claves que genera independientemente claves simétricas idénticas en ambas computadoras sin compartir ninguna información privada.
  2. Verificación. Usando hashing en ambas computadoras para verificar la identidad de la computadora conectada.
  3. Verificación (otra vez). El uso de hashing en ambas computadoras para verificar la integridad de los datos no se ha visto comprometido en la transmisión.

Podemos usar SSH para enviar datos de forma segura entre las computadoras. Un caso de uso importante de esto es para la autenticación. Aunque se puede usar una contraseña, el uso de cifrado asimétrico para comprobar que el "cliente" que se conecta tiene permiso para acceder al "host" se considera más seguro.

Si estás interesado en subir el nivel de tu SSH, te recomiendo seriamente este curso. ¡He encontrado muy útil para perfeccionar algunas de mis habilidades! (descargo de responsabilidad: No tengo ningún vínculo o conexión con el autor o la plataforma. ¡Tomé el curso hace un tiempo y lo encontré realmente bueno!)

¡Gracias por leer!

Traducido del artículo de Sam Ollason - A top-down introduction to SSH and how it enables secure data-sharing