Conexión SSH sin contraseña usando firmas digitales
In English  På Norsk  

Cuando nos conectamos por medio de SSH a un servidor, una manera de autenticarnos con el que no requiere que introduzcamos una contraseña es el uso de firmas digitales. Lo que hacemos en este caso es generar un par de llaves (una llave pública y una llave privada), y agregar nuestra llave pública a la lista de llaves autorizadas en el servidor al que queremos poder conectarnos.

Lo primero que hacemos es crear un par de llaves en la computadora que va a acceder al servidor de SSH:

ssh-keygen -t rsa -b 4096

Estro creará dos archivos, uno llamado id_rsa que es nuestra llave privada, y uno llamado id_rsa.pub que es nuestra llave pública. Después de esto, solo necesitamos agregar nuestra llave privada a la lista de llaves autorizadas en el servidor de SSH. Este archivo se encuentra en ~/.ssh/authorized_keys

Una manera de hacer esto es simplemente subir el archivo id_rsa.pub al servidor, y entonces concatenar el contenido de este archivo en el archivo ~/.ssh/authorized_keys. Si el archivo authorized_keys, o la carpeta .ssh no existen, puedes crear la carpeta con mkdir y el archivo con touch, aunque el comando cat puede crear el archivo por si mismo si este no existe previamente.

scp ~/.ssh/id_rsa.pub usuario@dominio:~/
ssh usuario@dominio
ls -d .ssh || mkdir .ssh
cat id_rsa.pub >> ~/.ssh/authorized_keys
rm id_rsa.pub

Otra manera de hacerlo es juntar los comandos en uno solo (pero largo) comando:

cat ~/.ssh/id_rsa.pub | ssh usuario@dominio 'ls -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys'

Una vez hecho esto, no olvides darle a esta carpeta y a este archivo los permisos apropiados, de otra manera otro usuario en el mismo sistema que tu podría agregar una llave a tu archivo de llaves permitidas y podría entonces conectarse como tu por medio de SSH.

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Y terminamos, en el futuro escribiré una explicación extensiva de como funciona esto, con imágenes y todo, pero por el momento lo importante aquí es que, la información que es cifrada con nuestra llave privada solo puede ser descifrada con nuestra llave pública, y la información que es cifrada con nuestra llave pública solo puede ser descifrada por nuestra llave privada.

Profundizando más

Como quizá ya sabes, existen dos protocolos de SSH, la vieja implementación (protocolo 1) y la más reciente y mejor implementación (protocolo 2). No estoy seguro de por que alguien pueda continuar permitiendo acceso a alguna vieja aplicación de SSH que solo use el primer protocolo, pero, estoy seguro que a alguien le resulta útil. Personalmente yo solo permito el segundo protocolo.

Hay diferentes algoritmos para las firmas digitales que pueden ser utilizados para autenticación, en SSH hay RSA (Rivest, Shamir y Adleman; tiene los nombres de sus creadores), DSA (Algoritmo de Firma Digital) y ECDSA (Algoritmo de Firma Digital de Curva Eliptica). Para no hacer esto largo (creo que esto debería de tener un artículo dedicado):

  • DSA se sabe que utiliza un RNG (Generador de Números Aleatorios - Random Number Generator) con una falla seria, ya no es aceptado por default despues de openSSH versión 7.0, no recomiendo utilizarlo.
  • ECDSA nos permite tener llaves más pequepas y por lo tanto toma menos tiempo hacer los cálculos. Una llave pública de curva elíptica de 256 bits provee una seguridad comparable a una llave pública RSA de 3072 bits.
  • RSA es fuerte, si utilizas una llave RSA de 4096 bits estarás seguro. Una ventaja es que RSA está implementado basicamente en todas partes, mientras que una llave de ECDSA no lo está (aunque debería de estarlo, en estos días son pocas las posibilidades de que no encuentres sistemas donde esto no funcione).

El uso de estas llaves es solamente para la autenticación con el servidor al conectarse, una ves conectado al servidor se utiliza otro tipo de cifrado para que lo que hagamos esté seguro de intromisiones.

Usando ECDSA en vez de RSA

Si prefieres usar ECDSA para autenticación con el servidor, puedes usar los siguientes comandos:

ssh-keygen -t ecdsa -b 521

Esto generará los archivos id_ecdsa (tu llave privada) y id_ecdsa.pub (tu llave pública), y entonces solo añadimos la llave al archivo authorized_keys por el primer método:

scp ~/.ssh/id_ecdsa.pub usuario@dominio:~/
ssh usuario@dominio
ls -d .ssh || mkdir .ssh
cat id_dsa.pub >> ~/.ssh/authorized_keys
rm id_dsa.pub

O el segundo método:

cat ~/.ssh/id_ecdsa.pub | ssh usuario@dominio 'ls -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys'