Hemos visto como usar SSH para conectar un terminal seguro a nuestra Raspberry Pi. Es una de las herramientas más potentes y que más frecuentemente usaremos al trabajar con sistemas remotos.
Sin embargo, usar SSH nos obligará a introducir constantemente la contraseña. Lo cual, si la contraseña es larga (y por seguridad debería serlo) pues que queréis que os diga… es un auténtico peñazo 😄.
Tenemos una alternativa muy usada y recomendada que es generar un par de claves criptográficas para usar como sistema de autentificación SSH.
Este método utiliza un par de claves criptográficas asimétricas (una clave pública y una clave privada) para autenticarte, eliminando la necesidad de ingresar una contraseña cada vez que te conectas.
Vamos a ver como configurarlo.
Generar el par de claves SSH en el dispositivo cliente
En primer lugar, necesitamos un par de claves SSH. Este primer paso lo tenemos que hacer en el dispositivo cliente (es decir, en el equipo con el cuál nos conectaremos a la Raspberry Pi , por ejemplo tu PC).
Windows 10 en adelante, y la mayoría de distribuciones de Linux tienen SSH instalado (OpenSSH o similar)
Para ello, abrimos una terminal en tu dispositivo cliente (que puede ser Windows, Linux, o WSL, por ejemplo)
Ejecutamos el siguiente comando para generar un par de claves SSH:
ssh-keygen -t rsa -b 4096 -C "tu_email@example.com"
Donde,
- -t rsa: Especifica el tipo de algoritmo de cifrado, en este caso RSA
- -b 4096: Define el tamaño de la clave en bits (4096 es una longitud segura)
- -C
tu_email@example.com
: Opcional, añade un comentario para identificar la clave (por ejemplo un correo electrónico)
A continuación, el sistema nos pide que elijamos una ubicación para guardar la clave
Enter file in which to save the key (/home/usuario/.ssh/id_rsa):
Podemos dejar el nombre por defecto, o ponerle el que queramos. (por ejemplo la App, o el nombre del cliente).
O podemos pulsar Enter
para aceptar la ubicación predeterminada (la carpeta .ssh).
Independientemente del nombre del fichero que elijamos, si es conveniente dejar la ruta .ssh
Finalmente, el sistema nos permite opcionalmente añadir una contraseña (passphrase) para proteger la clave privada
Enter passphrase (empty for no passphrase):
Podemos dejarlo en blanco si preferimos no tener que introducir una contraseña cada vez que uses la clave SSH (es menos seguro, pero uno de nuestros objetivos es no tener que meter todo el rato contraseñas ¿no?)
Este proceso generará dos ficheros
id_rsa
, clave privada que debemos conservar en el cliente (y no dar nunca a nadie)id_rsa.pub
, clave pública que debemos copiar a la Raspberry Pi
Copiar la clave pública a la Raspberry Pi
Ahora que tenemos nuestro par de claves, tenemos que copiar la clave pública id_rsa.pub
a la Raspberry Pi.
El contenido de este fichero se tiene que añadir a la carpeta .ssh
dentro del home del usuario, en Raspberry Pi, en un fichero llamado authorized_keys
.
Para eso tenemos dos opciones:
Desde otro Linux
Si estamos trabajando con un cliente Linux (por ejemplo, tu ordenador es un Ubuntu o un WSL desde Windows) tendremos acceso a una utilidad llamada ssh-copy-id
que hace todo pro nosotros.
ssh-copy-id usuario@direccion_ip
Simplemente reemplaza con el nombre de usuario y la dirección IP de tu Raspberry Pi (por ejemplo, pi@192.168.1.100
)
Este comando copiará la clave pública desde tu dispositivo cliente al archivo ~/.ssh/authorized_keys
en tu Raspberry Pi. Durante este proceso, se te pedirá la contraseña de tu Raspberry Pi para completar la operación.
Si has cambiado el nombre del certificado (en lugar del de por defecto id_rsa), puedes especificar el nombre del fichero.
ssh-copy-id -i ~/.ssh/nombre_fichero.pub usuario@direccion_ip
Desde Windows
Si no tenemos disponible la herramienta ssh-copy-id
, tendremos que copiarlo “a mano”. Tampoco os preocupéis, que no es demasiado difícil.
Simplemente tenemos que añadir el contenido de la clave pública id_rsa.pub
al fichero ~/.ssh/authorized_keys
del usuario.
Por ejemplo, podéis copiarlo mediante scp
con este comando
scp id_rsa.pub usuario@direccion_ip:/home/nombre_usuario/id_rsa.pub
Y luego, conectándonos por ssh
, añadimos el contenido del id_rsa.pub
a ~/.ssh/authorized_keys
(por ejemplo, con el editor nano).
ssh usuario@direccion_ip
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
O también podríamos añadirlo así (yo prefiero copiarlo a mano con nano)
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
Finalmente, nos aseguramos de los permisos de los ficheros son correctos
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Borra el fichero id_rsa.pub
que has copiado de la Raspberry Pi, cuando hayas terminado de copiar su contenido a authorized_keys
Script de PowerShell para configurarlo en un paso:
$USER_AT_HOST="username@remote-machine-IP"
$PUBKEYPATH="$HOME\.ssh\id_nombre.pub"
$pubKey=(Get-Content "$PUBKEYPATH" | Out-String); ssh "$USER_AT_HOST" "mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo '${pubKey}' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Donde, antes de copiar, debes sutituir
- username@remote-machine-IP, por tu nombre de usuario en Raspberry Pi, y la IP de la Raspberry Pi (o su hostname)
- id_nombre.pub por el nombre que le hayas dado a tu fichero de claves :::
Verificar autentificación habilitada
Opcional, pero conviene verificar que la autenticación mediante clave pública está habilitada en la Raspberry Pi.
Para ello, debes editar el archivo /etc/ssh/sshd_config
y asegurarte de que las siguientes líneas estén descomentadas y tengan el valor “yes”:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
Si has cambiado algo, reinicia el servicio SSH en la Raspberry Pi para que los cambios surtan efecto
sudo systemctl restart ssh
Conectarse a la Raspberry Pi sin contraseña
Ya hemos hecho lo difícil. Ahora queda comprobar que todo funciona correctamente. Deberías poder conectarte a tu Raspberry Pi sin necesidad de introducir una contraseña,
ssh nombre_usuario@direccion_ip
Si todo ha ido bien, deberías iniciar sesión en tu Raspberry Pi automáticamente sin necesidad de ingresar una contraseña.
Configuración adicional (opcional)
Si deseas mejorar la seguridad de tu conexión SSH, podéis desactivar la autenticación por contraseña en tu Raspberry Pi. De este modo, que solo se permitirán hacer conexiones mediante claves SSH. Para hacerlo:
Abrimos el archivo de configuración de SSH en la Raspberry Pi:
sudo nano /etc/ssh/sshd_config
Busca la línea que dice #PasswordAuthentication yes
y cámbiala a:
PasswordAuthentication no
Guardamos los cambios y reinicia el servicio SSH:
sudo systemctl restart ssh
Tened en cuenta que, si os equivocáis en algo, podéis perder el acceso remoto a vuestra Raspberry Pi, y tendréis que conectaros físicamente a ella
Como medida, siempre está bien dejar al menos una de las cuentas de admin con acceso con contraseña