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'