SSH sin contraseñas (y seguro)

Es posible establecer conexiones SSH a servidores Linux sin necesidad de ingresar una contraseña cada vez. Para esto debemos:

  • Crear nuestro par de claves pública y privada
  • Copiar nuestra clave pública en el servidor SSH
  • Utilizar la clave privada al establecer la conexión SSH

Dependiendo si estamos utilizando Windows o Linux, tendremos varias formas de llevar a cabo estos pasos.

Creación de las llaves

Para comenzar a utilizar claves pública/privadas desde nuestro cliente SSH, debemos generarlas antes.

Yo las creé utilizando el algoritmo RSA en lugar de DSA, principalmente por el tamaño de la clave, a pesar que DSA es el estándar del gobierno federal de los Estados Unidos. Pero de todas formas, ambos son ampliamente aceptados y por lo que leí,
no hay demasiadas ventajas entre uno o el otro. En este link hay un poco de información interesante y actual.

En Linux

En Linux las generamos utilizando el comando ssh-keygen. Utilizaremos la mayoría de las opciones por defecto, pero se puede consultar las páginas man del comando por más información.

Para generar el par de claves RSA utilizamos el comando:

ssh-keygen -t rsa

Nos pide ingresar algunas opciones, que podemos dejar todo por defecto (notar que para conectarse sin ingresar claves, no se debe ingresar passphrase).
La ejecución va a tener una salida similar a la siguiente:

[~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty 
for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX root@CentosVM
The key's randomart image is:
+--[ RSA 2048]----+
|  o....  .       |
|   o..+=Eo.      |
|     .*B=o.      |
|     ****        |
|      ...        |
|       o o       |
|        .        |
|                 |
|                 |
+-----------------+
[~]#

Esto genera 2 archivos en nuestro directorio home: ~/.ssh/id_rsa y ~/.ssh/id_rsa.pub. El primero contiene la clave privada, que debemos mantener segura y no compartir. El segundo archivo contiene la clave pública, que compartiremos con los servidores SSH a los que querramos conectarnos.

En Windows

Para crear el par de claves en Windows se puede utilizar puttygen (se puede descargar aquí: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html).
Basta con iniciar el programa, seleccionar “SSH-2 RSA“, 2048 bits de largo de clave y clickear Generate. Nos va a pedir mover el puntero del mouse para generar suficiente aleatoriedad en la generación de las claves.



Luego de eso podemos guardar las claves, teniendo en cuenta las mismas precauciones que si la generamos en un Linux: la clave privada no se comparte con nadie, la clave pública si.


Copiar llaves al servidor SSH

Luego de generar las claves debemos compartir nuestra clave pública con el servidor SSH al que queremos conectarnos.

En Linux

[~]# ssh-copy-id -i ~/.ssh/id_rsa.pub usuario@servidor

Nos preguntará la contraseña de usuario en servidor, para luego agregar nuestra clave pública al final del archivo .ssh/authorized_keys del directorio home de usuario en servidor.

En Windows

Parece que no hay un equivalente a ssh-copy-id en Windows (link a ServerFault), por lo que hacemos este proceso a mano.

Con PuTTY o cualquier programa similar debemos agregar el
contenido de nuestra llave pública en el archivo .ssh/authorized_keys del servidor SSH. Debemos copiar nuestra llave pública (sin incluir los comentarios de "---- BEGIN SSH2 PUBLIC KEY ----" y "---- END SSH2 PUBLIC KEY ----") a una nueva línea con el siguiente formato:

ssh-rsa llave_pública [comentario]

El [comentario] es opcional, y sirve simplemente para identificar nuestra clave en el archivo, dado que se muy posible que existan otras claves públicas listadas.

Si no existe el directorio o el archivo se pueden crear, asegurándonos que queden con permisos de lectura y escritura sólo para el dueño (chmod 600 .ssh/authorized_keys).

Conexión utilizando clave pública/privada

En Linux

Luego de la instalación de la clave, si utilizamos los nombres de las claves por defecto la conexión desde Linux al servidor SSH es tan simple como ejecutar:

[~]# ssh -i ~/.ssh/id_rsa usuario@servidor

En Windows

La forma de utilizar nuestro nuevo par de claves generado dependerá del programa que vayamos a utilizar. En PuTTY lo configuramos de la siguiente forma:

Navegamos hasta la sección “Auth” del árbol de opciones e ingresamos la ruta del archivo de nuestra clave privada en “Private key file for authentication

Más información

Etiquetado , . Bookmark the permalink.

5 respuestas a SSH sin contraseñas (y seguro)

  1. Buen post José.
    Solo agregaría que una de las grandes ventajas de usar claves públicas es que permite automatizar. Sin claves públicas si queremos hacer un script automático de respaldo tenemos que ponerle la password en el script (lo cual no está nada bueno) en cambio con claves públicas no, simplemente generamos la clave y la agregamos como autorizada, y desde entonces scp no nos pide más clave. Obvio que para que eso sea así además la clave privada no debe tener una password, sino estamos es la misma.
    Otro uso es el establecimiento de túneles, también automáticos, para eso existe una herramienta llama autossh (post en proceso 😉 ) que hace eso mismo.

  2. Pingback: » Howto: autossh – Cómo hacer túneles ssh con reconexión automática desde linea de comando KiovNET

  3. Pingback: Como usar ssh para acceder a servidores - Jvare Blog

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *