Necesitas un desarrollador para tu proyecto? Envíame un mensaje

Autenticación SSH a través de clave pública

Como establecer una conexión SSH con un sistema remoto utilizando clave pública y sin necesidad de introducir una contraseña.

Que es una clave pública?

La criptografía se utiliza para establecer una conexión segura entre dos partes, cifrando el contenido de los mensajes de modo que si los mismos son interceptados por un tercero este no pueda acceder al contenido de los mismos.
Mientras que la criptografía simétrica utiliza una clave única tanto para cifrar como para descifrar los mensajes, la asimétrica utiliza un par de ellas, una clave pública y otra privada.

El principio es el siguiente:

  • Ambas claves son generadas por la misma persona.
  • La clave pública se entrega a cualquiera con quien se quiera establecer una comunicación segura.
  • La clave privada como su nombre lo indica solo debe ser conocida por quien la genera.
  • La persona que envía el mensaje cifra el mensaje con la llave pública.
  • El mensaje solo puede ser descifrado con la clave privada (solo conocida por quien genera el par).

Por ejemplo:

  • Juan genera su par de claves y le envía la clave pública a María.
  • María utiliza dicha llave para cifrar los mensajes que le envía a Juan.
  • Los mensajes solo pueden ser descifrados por Juan quien es el único que conoce la llave privada.

Nota: "clave", "llave" y "key" (llave en inglés) se refieren a lo mismo, cualquiera de estos términos pueden ser utilizados indistintamente al hablar de criptografía.

Que ventajas ofrece la autenticación SSH por clave pública?

La autenticación por clave pública proporciona varias ventajas, en lo que se refiere estrictamente a la seguridad:

  • Las claves SSH son mucho más extensas (en número de caracteres) que lo que cualquier contraseña puede ser.
  • Eliminan la predictibilidad de los passwords: "Juan1982", "password123456", etc, esto sumado al punto anterior incrementa exponencialmente la seguridad ante ataques por fuerza bruta.
  • La clave privada no se trasmite, a diferencia del método convencional donde tenemos que enviar la contraseña al iniciar cada sesión.
  • El punto débil si se quiere es que la clave privada debe permanecer almacenada en nuestro lado lo que es una vulnerabilidad en caso de que nuestro sistema se encuentre comprometido, aunque ya veremos como mitigarlo.

Si almacenamos la clave privada sin encriptar obtenemos algunas ventajas desde lo práctico:

  • Estaremos autenticados en el sistema remoto solo con establecer la conexión.
  • Es muy útil en caso de que usemos scripts que utilicen conexiones remotas

Generando el par de claves

javier@debian:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/javier/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/javier/.ssh/id_rsa.
Your public key has been saved in /home/javier/.ssh/id_rsa.pub.
The key fingerprint is: SHA256:YhV4rtDk9j2x0zyJzdKm01BH8Px89R6ZpHU3Go2MpzI javier@debian
The key's randomart image is:
+---[RSA 2048]----+
| o x o .o+ z     |
| E O * .         |
| o X o +.        |
| = = .o.         |
| + S + . +.      |
| . + * O . ..    |
| . B X .         |
| o = .           |
| .               |
+----[SHA256]-----+

Como vemos el comando a ejecutar es ssh-keygen.

Lo primero que nos pregunta es donde deseamos guardar la clave, ENTER para utilizar la ruta por defecto.

Luego nos pide una passphrase. Antes mencioné que la contra de este método es que se debe almacenar la clave privada en el sistema, bien, la passphrase es una especie de contraseña que se utiliza para cifrarla. Si decides cifrar la clave deberás ingresar la passphrase cada vez que inicies una sesión, básicamente obtienes una autenticación de doble factor, lo cual por supuesto refuerza sensiblemente la seguridad, de otra forma presiona ENTER para dejarla en blanco y obtendrás acceso automático al host remoto con solo establecer la conexión.

Luego nos dice donde se guardó la clave y acto seguido nos da el key fingerprint que es el hash de la llave pública y el randomart que es una representación gráfica de la clave generada.
Estos dos últimos items son de utilidad para evitar ataques de tipo man-in-the-midle.

Copiando la clave pública al servidor remoto

Por ultimo solo nos queda copiar la clave pública al servidor remoto

javier@debian:~$ ssh-copy-id -i .ssh/id_rsa.pub javier@86.162.222.100
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
javier@86.162.222.100's password:
Number of key(s) added: 1 Now try logging into the machine, with: "ssh javier@86.162.222.100" and check to make sure that only the key(s) you wanted were added.

Y eso es todo, como en mi caso no utilicé passphrase con solo conectar al host remoto ya estaré autenticado.