SSH (Secure SHell) es el nombre de un protocolo que utilizamos para acceder remotamente a un servidor a través de un canal seguro, donde toda la información está encriptada. Como sabes, los protocolos son lenguajes que utilizan las máquinas para comunicarse entre sí.
En mi curso de iniciación al desarrollo web hablé del protocolo HTTP y de su versión segura, HTTP, que son los protocolos que utilizamos para enviar archivos HTML, CSS y JS. Otro protocolo comúnmente utilizado es FTP (File Transfer Protocol), que nos sirve para enviar otro tipo de archivos.
Como ocurre con estos protocolos, SSH nos permite conectar dos máquinas a través de Internet. Su principal característica es que ofrece una forma segura de conectar ambos sistemas. Además, utiliza una CLI (Command Line Interface). De hecho, nos permite usar nuestra propia consola como si se tratara de la consola del servidor.
¿Cómo puede ayudarme SSH como desarrollador/a?
SSH es crucial para trabajar en remoto. Te ofrecerá acceso a ordenadores remotos, así como a utilizar servicios como GitHub adecuadamente. Además, este es el protocolo que emplearás para desplegar aplicaciones en servidores remotos. De modo que conocer SSH es imprescindible.
¿Cómo utilizamos SSH?
Usar SSH es bastante sencillo. Lo único que tenemos que hacer es usar la consola del host como utilizaríamos la nuestra en nuestro propio ordenador. La única diferencia es que tendremos que apuntar a una dirección IP en lugar de una ruta, como hacemos al emplear nuestra consola en local.
ssh {usuario}@{host}
El único problema es que si estás usando un sistema operativo Windows necesitarás un cliente SSH. El más popular es “PuTTY”, y aquí tienes una guía sobre cómo funciona.
Recuerda: cuando accedes a un servidor remoto vía SSH estás utilizando su sistema operativo. Esto significa que podrían faltarte algunos paquetes o instalaciones, como git o node, en cuyo caso tendrás que instalarlos manualmente:
sudo apt-get git
El ejemplo anterior te permitiría instalar git en un sistema operativo basado en Linux, a fin de clonar tu repositorio. Recuerda también que, dependiendo del servidor que estés utilizando, es posible que algunos servicios populares como git, node.js o npm ya estén instalados.
En resumen, utilizar SSH no es muy diferente de usar tu consola en local, más allá de las diferencias eventuales que pueda haber en el sistema operativo de la máquina y los paquetes y aplicaciones que tenga instalados.
¿Cómo funciona SSH?
SSH se basa en tres técnicas de encriptación:
- Encriptación Simétrica (Symmetrical Encryption).
- Encriptación Asimétrica (Assymetrical Encryption).
- Hashing.
Encriptación Simétrica
Como sabes, la encriptación es una técnica que nos permite cambiar un mensaje de tal modo que un tercero no autorizado sea incapaz de leerlo sin desencriptarlo. En la Encriptación Simétrica, ambas partes (encriptador y desencriptador) utilizan la misma clave. Y esta clave se renovará en cada sesión.
Por supuesto, el problema de la Encriptación Simétrica es que cualquiera que tenga la clave podrá desencriptar el mensaje. Y en el momento de establecer la conexión se debe intercambiar la misma, así que podría ser interceptada. Por eso es importante mantener esta clave a salvo, lo que podemos hacer con un Algoritmo de Intercambio de Clave (Key Exchange Algorithm).
El Algoritmo de Intercambio de Clave es seguro porque cliente y servidor no necesitan compartir su llave. Solo manipulan piezas de información pública para generar sus llaves independientemente.
Encriptación Asimétrica
El Algoritmo de Intercambio de Clave se basa en la Encriptación Asimétrica. Esta técnica se caracteriza por utilizar claves diferentes para la encriptación y la desencriptación. En la Encriptación Asimétrica, cada parte tiene una llave pública y otra privada.
Hay una relación unilateral entre las claves pública y privada de cada parte. De modo que el mensaje encriptado por una llave pública solo puede desencriptarse con la llave privada de la misma máquina.
De este modo, cada parte puede compartir su clave pública, de tal modo que la otra pueda utilizarla para encriptar el mensaje. Mensaje que solo podrá desencriptarse utilizando la llave privada de la primera parte. Y de este modo hemos alcanzado una forma de establecer una comunicación segura entre ambas máquinas.
SSH utiliza la Encriptación Asimétrica para generar la clave de sesión que ambas partes utilizarán para mantener su conexión segura. Desde ese momento, ambas máquinas utilizarán la Encriptación Simétrica, pues ya dispondrán de dos claves seguras e idénticas. Para generar estas claves, la Encriptación Asimétrica utiliza el algoritmo de Diffie Hellman:
Hashing
El hashing es otra técnica de criptografía utilizada en las conexiones SSH. Al hashear un mensaje lo convertimos en una cadena de texto única, con una longitud determinada. Este proceso no puede invertirse, por lo que su objetivo no es cifrar datos, sino obtener una cadena de texto que sea siempre idéntica para el mismo input y diferente si este input cambia.
De este modo, cada parte crea un hash con la información que se envíe y su clave. La otra parte también tiene la clave, así que cuando le llegue el mensaje podrá crear su propio hash y compararlo con el que ha recibido. Si coinciden, implicará que tanto el mensaje como la clave utilizada son legítimos.
Resumen
En resumen, SSH utiliza la Encriptación Asimétrica para compartir una clave pública y, con ella, generar una clave de sesión que compartan ambos equipos. A partir de este momento, ambas partes cuentan con una clave común que les permite utilizar la Encriptación Simétrica para cifrar sus mensajes. Sistema que se refuerza con un servicio de hashing: si el hash emitido y recibido difiere, significará que la clave, el mensaje o ambos han sido comprometidos.
El último paso para establecer una comunicación SSH será autenticar a los usuarios. De este modo, las partes conocerán los permisos de la otra parte, para permitirle o denegarle el acceso a recursos y servicios.
La autenticación de usuarios
SSH puede autenticar usuarios mediante una contraseña (no recomendable, por su vulnerabilidad a ataques de fuerza bruta o a contraseñas endebles) o mediante una RSA. La RSA (Rivest, Shamir y Adleman) es un sistema criptográfico empleado tanto para encriptar como para firmar digitalmente.
Nuestro equipo tiene una carpeta .ssh donde se almacenan claves RSA en los archivos id_rsa e id_rsa.pub (siendo las últimas las públicas). Para crear un par de llaves podemos utilizar el siguiente comando:
ssh-keygen -t -rsa -b 4096 -C “your@email.com”
Una vez disponemos de nuestro par de claves, podemos insertarlas en la carpeta .ssh del servidor remoto. La primera vez que lo hagamos, es posible que debamos seleccionar nuestra clave en la carpeta .ssh:
ssh-add ‘public key path’