Conectarse a ssh sin introducir la clave cada vez - Usar una llave ssh

Cuando te conectas a un equipo a través de ssh debes indicar siempre tu contraseña:

$ ssh gorka@192.168.1.135'
gorka@192.168.1.135's password:

Para no tener que recordar un montón de contraseñas (y no tener que usar la misma en todos los sitios) podemos usar lo que se llama una llave ssh.

El acceso a un servidor a través ssh con una llave ssh (ssh key en inglés) es más cómodo y más seguro.

Una contraseña ssh se puede descifrar usando un método de fuerza bruta. Sin embargo las ssh-keys son mucho más difíciles de descifrar.

Una llave ssh se compone de dos partes: la pública y la privada.

La parte pública de la llave se copia en el servidor. La parte privada nunca, nunca, nunca, debes compartirla. Cuando vas a acceder a través de ssh se busca en tu ordenador si tienes una llave privada. Con ella se prepara el acceso al servidor. Si las llaves pública y privada concuerdan se permite el acceso al servidor.

Creación del par de llaves para ssh

La creación de la llave se hace a través del siguiente comando:

$ ssh-keygen -t rsa -b 4096

La opción -t es para indicar el tipo de algoritmo que queremos usar para generar la llave. En nuestro caso estamos usando el algoritmo RSA (RSA son las siglas de sus creadores).

La opción -b sirve para indicar el número de bits que va a tener la clave. A mayor número de bits más segura, pero también tardará más en procesarse. Según la página man de ssh-keygen se considera que 2048 bits son suficientes. Yo prefiero un poco de seguridad extra así que suelo poner 4096 bits.

A continuación vamos a ver las preguntas que nos hace el comando ssh-keygen.

Especificar el fichero donde se va a guardar la clave ssh

Por defecto las llaves (privada y pública) RSA se guardan en /home/user/.ssh/id_rsa. Al generar la clave se nos da la opción de guardarlas con un nombre diferente. Esto puede venir bien si queremos usar distintas llaves para distintas cosas. Si no es así podemos dejar el valor por defecto, en mi caso:

Enter file in which to save the key (/home/gorka/.ssh/id_rsa):

Elegir una Passphrase

El siguiente paso es elegir una PassPhrase (algo así como la frase contraseña):

Enter passphrase (empty for no passphrase):

Como puedes ver es opcional. ¿Qué ventaja tiene usar esta contraseña si es opcional? Viene bien en los siguientes casos:

  • Imagina que alguien se consigue colar en tu equipo a través de la red y te roba la clave pública. Podría acceder a todos los servidores a los que accedes con esta llave.
  • Otro caso puede ser que pierdas tu equipo o alguien con mala leche tenga acceso físico a tu ordenador. Podría entrar en un servidor a través de tu ordenador sin necesidad de introducir ninguna clave.

Para evitar estas situaciones podemos usar la passphrase. Esto hará que se nos pida esta contraseña cuando alguien quiera hacer uso de esta llave. Tranquilo, solo se nos pedirá una vez por sesión, no cada vez que usemos la llave (gracias a un programa que se ejecuta en segundo plano llamado ssh-agent).

Claro está, que si introduces la contraseña y dejas tu ordenador accesible a cualquiera sin bloquearlo cuando no estás delante tienes el riesgo de que alguien lo use. Ser un poco paranoico nunca está de más.

¿Cuándo no usar una passphrase? Si vas a usar esta llave para algún script automatizado (un cron o similar) entonces puede ser mejor idea dejar la passphrase en blanco.

Tus claves ssh privada y pública

Una vez contestadas estas dos preguntas de ssh-keygen se generan dos ficheros:

  • id_rsa (esta es tu clave privada, para tí y para nadie más, no la compartas nunca con nadie).
  • id_rsa.pub (esta es tu clave privada, es la que tienes que enviar al servidor donde quieras conectarte con tu nueva llave).

Copiar la llave pública al servidor

El último paso es comunicarle al servidor cuál es la llave pública que debe usar para comprobar nuestra identidad.

ssh-copy-id gorka@192.168.1.135

NOTA: Creo que sobra decirlo, pero donde pone gorka debes poner tu nombre de usuario en el servidor y donde pone 192.168.1.135 debes poner la IP del mismo.

NOTA 2: Si esto no funcionara puedes hacerlo de esta otra forma:

cat ~/.ssh/id_rsa.pub | ssh gorka@192.168.1.135 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

NOTA: No te equivoques, usa el fichero .pub, no el que no tiene extensión (te recuerdo, una vez más, que el fichero sin extensión es tu clave privada).

A partir de este momento podemos acceder al servidor 145.25.32.43 sin necesidad de introducir nuestra contraseña para el usuario gorka. Cuando te conectes la primera vez verás un mensaje similar a éste:
$ ssh gorka@192.168.1.135

The authenticity of host '192.168.1.135 (192.168.1.135)' can't be established.
RSA key fingerprint is c4:3d:4f:2d:3e:45:3d:2a:f2:c8:c3:d1:44:42:b6:c1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.135' (RSA) to the list of known hosts.
gorka@192.168.1.135's password: 

Now try logging into the machine, with "ssh 'gorka@192.168.1.135'", and check in:

~/.ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting.

NOTA: Los datos de la IP y el fingerprint me los he inventado... por si acaso.

Después de esta primera vez las siguientes entrarás directamente.

Usar una clave diferente para conectarte

Si tienes más de una llave y quieres conectarte a un servidor con una llave diferente puedes usar la opción -i:

$ ssh -i /home/gorka/.ssh/otra_clave.pub gorka@192.168.1.135

Recomendaciones finales

En unos días publicaré un artículo con unas recomendaciones para dar más seguridad a las conexiones ssh a tu servidor (por ejemplo, desactivar el acceso root u obligar a usar llaves ssh).

Autor:
Nivel: Principiante
Palabras clave:
Fecha publicado:
Fecha actualizado: 23-08-2016

Otros capítulos de la misma serie

Este capítulo es parte de la serie: Configuración de un servidor.

Y muchos más en preparación.

Disponible en los planes: Laravel hero PHP a tope