Funcionamiento normal de SSH

SSH permite autenticarnos a un servidor remoto indicando nuestro usuario y contraseña. Por ejemplo:

ssh usuario@servidor.com

También indicando la IP:

ssh usuario@192.168.1.1

La “desventaja” es que debemos escribir la contraseña cada vez que queremos hacerlo y que alguien podría hacer un ataque de fuerza bruta para autenticarse en nuestro servidor.

Con el tutorial de hoy vamos a usar criptografía asimétrica para autentificarnos sin contraseña y hacer más fuerte el proceso.

Resumen para generar claves

Si solo vienes a copiar y pegar, o a recordar el proceso, lo dejo súper resumido aquí:

# Genera tu par de claves si todavía no existen
ssh-keygen -t ed25519 -C "comentario"
# Cópialas al servidor. Recuerda que "usuario@servidor.com" son el usuario y host como si usaras SSH
ssh-copy-id usuario@servidor.com
# Seguramente se te pedirá la contraseña. No te preocupes, esta es la última vez. Ingrésala y luego intenta autenticarte
ssh usuario@servidor.com
# Lo de arriba ya no debería pedirte contraseña

Suponiendo que quieres autentificarte a otro servidor, la próxima vez solo harías:

ssh-copy-id usuario@otroservidor.com
# Aquí ingresas tu contraseña
ssh usuario@otroservidor.com
# Y arriba ya no se te pedirá contraseña

Eso sí, esto solo cambia la autenticación. Una vez dentro del servidor en caso de que quieras hacer algo con sudo se te va a pedir tu contraseña como normalmente se hace.

No es obligatorio que uses la misma clave privada, puedes generar y usar varias, ya solo necesitas indicarle a ssh-copy-id cuál clave quieres, por ejemplo:

ssh-copy-id -i /ubicación/clave/pública usuario@servidor.com

Así que en resumen es

  1. Genera tu par de claves
  2. Cópialas al servidor introduciendo tu contraseña cuando se te pida
  3. Autentificarte con ssh y ya no se te pedirá la contraseña

La próxima vez que quieras autentificarte ya solo debes seguir el paso 3

Sigue leyendo si quieres conocer más sobre este proceso

Evitar uso de contraseña

Existe una manera de evitar el uso de contraseña gracias a las claves privadas y públicas. Es más seguro y nos evitamos escribir la contraseña.

De este modo podemos automatizar procesos como rsync con crontab ya que no se va a solicitar la contraseña. Se me ocurre que con esto podemos beneficiarnos de lo siguiente:

  1. Autenticación SSH
  2. SCP para subir archivos
  3. Rsync para sincronizar y subir archivos de manera eficiente

Gracias a esto también podemos desactivar la autenticación por contraseña evitando ataques de fuerza bruta

Por cierto, este tutorial funciona perfectamente en Windows al usar MSYS2 e instalar las herramientas SSH.

Generando par de claves

Lo primero es generar un par de claves: una clave pública y una privada. Generamos este par de claves en nuestra computadora local, no en nuestro servidor:

ssh-keygen -t ed25519 -C "comentario"

En comentario podemos poner algo que identifique esa clave. Puede ser el nombre de tu PC local. Nos va a pedir una contraseña opcional y aquí es donde tú decides si pones una.

Si eliges una contraseña, se te pedirá cada vez que autentifiques. Esto elimina la automatización porque siempre se te va a pedir contraseña, pero será más seguro

Si no eliges una contraseña entonces todo será automático, pero toda la seguridad recaerá en la protección de tu clave privada

Yo pienso que si alguien tiene acceso a tu computadora (y por lo tanto a tus claves) entonces es lo mismo que si tuviera acceso SSH, así que recomiendo no elegir contraseña.

Con eso se habrá creado tu clave en ~/.ssh/nombre_clave (el asistente te dirá la ubicación de la misma) por ejemplo /home/parzibyte/.ssh/id_ed25519 que puede lucir así:

-----BEGIN OPENSSH PRIVATE KEY-----
aquí muchos caracteres
-----END OPENSSH PRIVATE KEY-----

Esa es tu clave privada. No la compartas con nadie. Junto con esa clave se habrá creado otra con el mismo nombre pero que termina en .pub, misma que es la clave pública y se ve así:

ssh-ed25519 aquí_letras_y_números comentario

Esta es la clave pública que vas a necesitar copiar al servidor. Podrías hacerlo manualmente pero para ello ya existe ssh-copy-id.

Copiar archivo con ssh-copy-id

La manera recomendada es subir la clave usando la herramienta incorporada ssh-copy-id. Su sintaxis es:

ssh-copy-id usuario@servidor.com

Recuerda: usuario@servidor.com es tu usuario y servidor que usarías como si te autenticaras con SSH.

Si tienes varias claves o deseas copiar una en específico puedes indicarlo así:

ssh-copy-id -i /ubicación/clave usuario@servidor.com

Copiar archivo manualmente

Si quisieras hacerlo manualmente tendrías que iniciar sesión en tu servidor, editar el archivo ~/.ssh/authorized_keys y añadir una nueva línea con el contenido de la clave pública.

Supongamos que tu archivo está vacío, ahora debe verse así:

ssh-ed25519 caracteres_aquí comentario

Y si ya tuviera claves, por ejemplo:

ssh-rsa aquí_caracteres rsa-key-20190108
ssh-rsa otros_caracteres parzibyte@newdonkcitypc

Ahora se vería así:

ssh-rsa aquí_caracteres rsa-key-20190108
ssh-rsa otros_caracteres parzibyte@newdonkcitypc
ssh-ed25519 caracteres_aquí comentario

Autentificación sin contraseña

Después de haber generado tus claves y subido la clave pública ya sea con ssh-copy-id o manualmente, ya podrás autentificarte usando exactamente el mismo comando que usabas antes:

ssh usuario@servidor.com

La única diferencia es que ahora no se te pedirá contraseña. Ya puedes automatizar procesos como rsync o scp.

Qué hacer si pierdes tu clave

Si ya no tienes tu clave privada o alguien la ha robado entonces remueve la clave pública de tu servidor por seguridad. Luego vuelve a generar otro par.

Nota sobre la ubicación de la generación

Anteriormente mencioné que el par de claves debe ser generado en nuestra computadora local, pues normalmente siempre nos conectamos desde nuestra PC local al servidor, pero así como podemos usar SSH desde nuestro servidor para conectarnos a otro servidor, también podemos generar las claves en un servidor para conectarnos a otro.

Lo dejo claro para que no creas que el uso es exclusivo en computadoras locales. De hecho no existe algo como computadora local y servidor, simplemente es lo que tomamos como cliente y como servidor, y un servidor puede ser también un cliente de otro.

Si el post ha sido de tu agrado te invito a que me sigas para saber cuando haya escrito un nuevo post, haya actualizado algún sistema o publicado un nuevo software. Facebook | X | Instagram | Telegram | También estoy a tus órdenes para cualquier contratación en mi página de contacto