Volver
Featured image of post SSH para el día a día

SSH para el día a día

Introducción

SSH o Secure Shell Protocol, es un protocolo de comunicación así como pueda serlo los muy conocidos HTTP, HTTPS o FTP.

En el caso de SSH nos permite la comunicación entre dispositivos dentro de la red, así como controlar o modificar ordenadores remotos.

¿Que ofrece de nuevo entonces frente a otros protocolos de comunicación? Pues básicamente es un protocolo orientado a mejorar la seguridad de la comunicaciones encriptando los datos de modo que intrusos no puedan ver contenido protegido bajo el protocolo.

HTTPS puede sonar parecido a SSH, ambos son seguros y permiten la comunicación, pero la diferencia está en que HTTPS está pensado para la web y SSH para la shell (línea de comandos que usa desde un sistema operativo).

SSH pretende encriptar las comunicaciones entre cliente (dispositivo que se conecta al host) y host (servidor remoto al que accede el cliente)

Las conexiones SSH están muy presentes en nuestro día a día. En el caso de github utilizamos SSH para clonar, hacer push o hacer pull a sus servidores.

Como funciona la encriptación de SSH

Existen tres tipos principales de técnicas de encriptación usadas por SSH:

  1. Encriptación simétrica
  2. Encriptación asimétrica
  3. Hash

Encriptación simétrica

El ordenador A quiere mandarle al ordenador B un mensaje del estilo “hola, que tal?”, pero el ordenador A no quiere que nadie se entere de lo que está diciendo. Entonces utilizará una “llave” para alterar su mensaje y el “hola, que tal?” pasará a ser por ejemplo “EK25+5”. El ordenador B también tiene esa “llave”, por lo que es capaz de descifrar el mensaje alterando el mensaje cifrado para recuperar el original.

Así funciona el cifrado simétrico, quien tenga la llave es capaz de descifrar lo que se está transfiriendo.

La llave que conocen ambas partes de la comunicación no puede viajar a través de la red, ya que un atacante podría estar espiando y conseguir una copia de la llave, por lo que también podría descifrar la información que enviemos bajo el uso de dicha llave. Para evitar que la llave viaje de forma insegura se utiliza un algoritmo de intercambio de claves. Sería algo así como definir un algoritmo para que la llave pueda viajar por la red de forma segura ya que estará cifrada y la forma de descrifrarlo solo la conocen ambas partes interesadas en la comunicación. Esto será el siguiente punto que tratemos, la encriptación asimétrica.

Encriptación asimétrica

Para la encriptación asimétrica se utilizan dos llaves en ambas partes de la comunicación. Cada parte tiene una llave pública y una llave privada. Las claves públicas pueden ser compartidas con todo el mundo, no supone un riesgo para nuestra seguridad. Sin embargo, las claves privadas deben permanecer en secreto y no compartirlas con nadie. La clave pública está relacionada con una clave privada en término de funcionaliadad, aunque compartir la clave pública es seguro porque a partir de esta no es posible calcular la clave privada. Esto quiere decir que un mensaje que fue encriptado usando una clave pública, solo podrá ser desencriptado utilizando su respestiva clave privada.

El ordenador A y el ordenador B intercambian sus claves públicas. El ordenador A encripta un mensaje utilizando la clave pública del ordenador B, envía el mensaje y finalmente el ordenador B utiliza su propia clave privada para desencriptar el mensaje

diffie hellman key exchange

‎El algoritmo de intercambio de claves Diffie Hellman (DH) es un método para intercambiar de forma segura claves criptográficas a través de un canal de comunicaciones público. Las claves no se intercambian realmente, se derivan conjuntamente. Lleva el nombre de sus inventores Whitfield Diffie y Martin Hellman.‎ Mejora el intercambio de claves que hemos visto anteriormente en la encriptación simétrica y asimétrica utilizando cálculo matemáticos avanzados para que sea prácticamente imposible que un intruso en la comunicación sea capaz de descifrar la clave que permite acceder a los recursos.

Ejemplo

‎Si Alice y Bob desean comunicarse entre sí, primero acuerdan entre ellos un gran número primo n y un generador (o base) g (donde 0 < g < n).‎

‎Alice elige un entero secreto a (su clave privada) y luego calcula g^a mod n (que es su clave pública). Bob elige su clave privada b y calcula su clave pública de la misma manera.‎

‎Bob conoce b y g^a, por lo que puede calcular (g^a)^b mod n = g^ab mod n. Por lo tanto, tanto Alice como Bob conocen un secreto compartido g^ab mod n. Eva, una oyente maliciosa en la comunicación conoce n, g, la clave pública de Alice (g^a mod n) y la clave pública de Bob (g^b mod n). Ella es incapaz de calcular el secreto compartido a partir de estos valores, sería necesario conocer la clave privada.

Hash

Con esto ganamos que ningún intermediario malicioso se meta en la comunicación y suplante la identidad del host y del cliente aportando su propia clave púlica para así poder descifrar los mensajes.

Es una técnica de encriptación en la que para la mismta entrada (texto) siempre se produce la misma salida (texto encriptado). Desde el texto encriptado utilizando hash no seríamos capaces de llegar al texto como era en el inicio. Entonces solo la persona que sabe el secreto volverá a introducir la misma entrada y esta vez el servidor comprobara que se registra el mismo hash que guardó al principio, en caso de ser así, la persona estaría autorizada.

Con esta ténica se requiere una entrada segura, por ejemplo, si hablamos de contraseñas, una del estilo “1234” seguramente sea de las primera que prueban los atacantes, sin embargo, recurrir a algo más elaborado como “d56fg4583+*dfh347vfh” seguro que no será fácil de adivinar.

Ejemplo

El comando md5sum imprime una suma de comprobación de 32 caracteres (128 bits) del archivo dado, utilizando el algoritmo MD5.

Vamos a abrir una terminal UNIX y usaremos el comando md5sum para crear y comparar hashes entre ficheros:

Dos ficheros iguales, mismo hash

$ cat file1.txt
hello world
$ cat file2.txt
hello world
$ md5sum file1.txt
6f5902ac237024bdd0c176cb93063dc4 file1.txt
$ md5sum file2.txt
6f5902ac237024bdd0c176cb93063dc4 file2.txt

Dos ficheros distintos, distinto hash:

$ cat file1.txt
hello world
$ cat file2.txt
bye bye
$ md5sum file1.txt
6f5902ac237024bdd0c176cb93063dc4 file1.txt
$ md5sum file2.txt
b052b28f8360616ca92f434f497585ff file2.txt

Comprobación masiva de hashes:

$ cat file1.txt
hello world
$ cat file2.txt
bye bye
$ md5sum file1.txt file2.txt > hashes
$ md5sum –check hashes
file1.txt: OK
file2.txt: OK
$ echo “!” » file2.txt
$ md5sum –check hashes
file1.txt: OK
file2.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

Como configurar claves publicas en un servidor Ubuntu para conectar mediante SSH

Usando un proveedor de servidores como pueda ser Digital Ocean, vamos a crear un servidor ubuntu para accederlo vía SSH.

Tras haberlo creado vamos a escribir el siguiente comando en nuestro terminal para conectarnos al servidor que se encuentra en internet:

ssh {user}@{host}

Siendo user el usuario (cuenta) por defecto que nos ha creado el servidor para acceder y host el servidor al que queremos acceder, en ese campo podremos escribir una dirección IP o un nombre de dominio.

Veremos que estamos conectado desde la shell al servidor, por lo que podemos acceder a su sistema de archivos, ejecutar comandos, etc.

Vamos a utlizar RSA, que nos permitirá garantizar la identificación de los usuarios sin necesidad de utlizar una contraseña.

Desde la consola de nuestro ordenador local vamos a generar un par de claves (pública y privada) para utilizarlas posteriormente con el servidor.

ssh-keygen -C “test@gmail.com

  • -C Comment Provides a new comment

Tras esto nos pedirá donde queremos las claves. Por defecto lo hará en la ruta /Users/{your_user}/.ssh/id_rsa si solo presionamos enter, pero podemos especificar nosotros la ruta y el nombre de la clave privada también.

Nos iremos al servidor y nos conectaremos vía ssh. Nuestro proveedor de servidor no debería tener configurado por defecto el acceso mediante SSH solo para determinados usuarios, por lo que en teoría podríamos acceder en este momento con cualquier usuario.

ssh {user}@{host}

Y vamos a crear el folder .ssh en la ruta principal del usuario:

mkdir .ssh

Dentro de la ruta .ssh crearemos un archivo que se nombre exactamente authorized_keys, en donde pegaremos el contenido generado de la clave pública generada anteriormente.

Tras haber realizado lo anterior cuando queramos conectarnos al servidor vía ssh veremos que esta vez lo ha intentado mediante la public key pero ha fallado porque no podrá escoger correctamente la key, la que hemos copiado dentro del servidor

Para añadir la clave que nos interesa al comando ssh, tendremos que ejecutar lo siguiente :

ssh-add ~/.ssh/{your_private_key}

adds private key identities to the authentication agent

Y ahora sí que si volvemos a conectarnos vía ssh podremos haber accedido al servidor sin necesidad de introducir una contraseña, ya que este conocía nuestra clave pública y nos ha mando un mensaje de verificación de identidad que hemos sabido descrifrar ya que fue cifrado con nuestra clave pública que solo se puede descifrar con nuestra clave privada.

Para eliminar las claves que tiene el authentication agent:

ssh-add -D

Para listar las claves que tiene el authentication agent:

ssh-add -l

Como configurar SSH en Github

Lo primero será abrir la terminal y generar la clave pública que añadiremos posteriomente en Github

Github nos recomienda que la clave que generemos sea usando el algoritmo Ed25519

ssh-keygen -t ed25519 -C “your_email@example.com”

En el caso de que el sistema que estés usando no permita el algoritmo Ed25519, puedes recurrir al método más tradicional:

ssh-keygen -t rsa -b 4096 -C “your_email@example.com”

ed25519 pertenece a una rama de la criptografía llamada “criptografía de curva elíptica (ECC)”. RSA se basa en matemáticas bastante sencillas (multiplicación de enteros), mientras que ECC procede de una rama de las matemáticas mucho más complicada llamada “teoría de grupos”. En resumen: las claves ECC pueden ser mucho más cortas y ofrecer el mismo nivel de seguridad porque el problema matemático en el que se basan es mucho más complejo.

Para añadir una clave pública en github vete a https://github.com/settings/keys y añádela pulsando el botón verde de New SSH key.

Bonus track

Para mover archivos al servidor remoto podemos utilizar el comando rsync, que se usaría de la siguiente forma:

rsync -av {local_directory} {remote_user}@{remote_host}:{remote_directory}

  • -a (archive) It is a quick way of saying you want recursion and want to preserve almost everything
  • -v (verbose) This option increases the amount of information you are given during the transfer

Para copiar el contenido de un fichero desde terminal al portapeles podemos ejecutar desde linux:

cat {your_file.extension} | xsel –clipboard –input

Y para pegar el contenido del portapapeles sería ejecutar lo siguiente:

xsel –clipboard –output

Creado con Hugo
Tema Stack diseñado por Jimmy