Conexión SSH sin contraseña usando firmas digitales

domingo 22 agosto 2010 | In English

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 2048

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 dos algoritmos para las firmas digitales que pueden ser usados para autenticación en SSH: RSA (Rivest, Shamir y Adleman; está nombrado por sus creadores) y DSA (Digital Signature Algorithm - Algoritmo de Firma Digital), ninguno de los algoritmos es obsoleto así que puedes utilizar cualquiera de ellos. Las llaves DSA son más rápidas al firmar, pero más lentas al verificar, que las llaves de RSA.

Para RSA, un par de llaves de 1536 bits es recomendado, ssh-keygen puede generar llaves de RSA de entre 768 y 2048 bits para el uso de los protocolos 1 y 2 de SSH, y puede generar llaves de DSA de 1024 bits (solamente de esté tamaño debido a una especificación) para el uso del protocolo 2 de SSH, por default se genera una llave de RSA para el uso del protocolo 2.

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 DSA en vez de RSA

Si prefieres usar DSA para autenticación con el servidor, puedes usar los siguientes comandos (si, puedes imaginarlos ahora, pero es más fácil copiar y pegar):

ssh-keygen -t dsa

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

scp ~/.ssh/id_dsa.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_dsa.pub | ssh usuario@dominio 'ls -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys'

Categorías: Comandos, FOSS, Linux, SSH