¿Cómo configurar claves SSH en un servidor Linux o implementar la autenticación con clave pública? Este artículo incluye una guía paso a paso de cómo configurar claves SSH en un servidor Linux para mejorar la seguridad al conectarse de forma remota.
Existen diferentes opciones para conectarse de forma remota y segura a un servidor según el sistema operativo que utilicemos. En el caso de Linux, el protocolo SSH es el más utilizado. Así que en este artículo queremos hablar sobre la configuración de claves SSH para mejorar aún más la seguridad al conectarnos a nuestros servidores. Empecemos por presentar brevemente SSH.
El protocolo SSH proporciona un método seguro para acceder a un recurso privado, mediante el uso de un usuario y una contraseña, de forma remota. Sin embargo, este sistema tiene un problema: la contraseña podría ser capturada por cualquier atacante, lo que pondría en riesgo la información que tengamos guardada en su interior. De ahí la importancia de usar un sistema de autenticación adicional: las claves SSH. Estas, al contrario que las contraseñas, son casi imposibles de descifrar.
¿Qué es la autenticación con clave pública?
La autenticación con clave pública es un método de seguridad alternativo a las contraseñas, mucho más difícil de hackear y, por lo tanto, más seguro. Este método de autenticación es recomendable usarlo para acceder tanto a servidores cloud como bare-metal.
¿Qué son las claves SSH?
La clave SSH consiste en la generación de un par de claves que proporcionan dos largas cadenas de caracteres —una pública y una privada—. La clave pública se instala en cualquier servidor y luego se desbloquea mediante la conexión con un cliente SSH que hace uso de la clave privada. Si las dos claves coinciden, el servidor SSH permite el acceso sin necesidad de utilizar una contraseña. No obstante, para añadir una capa de seguridad adicional, siempre podemos aumentar la protección de la clave privada usando una contraseña.
En este artículo vamos a explicar cómo configurar la autenticación con SSH con claves ed25519 y claves RSA. A continuación definimos brevemente en qué consisten estos sistemas criptográficos.
¿Qué es ed25519?
En la criptografía de clave pública, el algoritmo de firma digital de curva de Edwards o ed25519 es un esquema de firma digital que utiliza una variante de la firma Schnorr basada en curvas de Edwards. Está diseñado para ser más rápido que los esquemas de firma digital existentes, sin sacrificar la seguridad. El algoritmo de firma digital de curva de Edwards también se conoce como edDSA, del inglés Edwards-curve Digital Signature Algorithm.
¿Qué es RSA?
En la criptografía de clave pública, el sistema criptográfico RSA es el algoritmo basado en la factorización de números enteros más utilizado, tanto para cifrar como para firmar digitalmente. RSA es el acrónimo de Rivest, Shamir and Adleman, los apellidos de los creadores del algoritmo —Ron Rivest, Adi Shamir y Leonard Adleman—.
Configurar la autenticación con claves ed25519 paso a paso
A continuación explicamos paso a paso cómo crear las claves SSH para acceder de forma segura a servidores bare-metal o virtuales Linux, con un par de claves ed25519.
1º.- Crear el par de claves ed25519
El primer paso consiste en crear el par de claves ed25519 en la máquina cliente, que por lo general es el equipo que solemos utilizar. Para ello ejecutamos la siguiente instrucción en la línea de comandos:
$ ssh-keygen -t ed25519
Tras ejecutar la instrucción, obtendremos la siguiente respuesta, en la que se indica que la creación del par de claves pública y privada está en proceso:
Generating public/private ed25519 key pair.
2º.- Almacenar las claves
Una vez ejecutada la instrucción para generar las claves, se nos pedirá que indiquemos la ruta en la que queremos almacenar la clave.
Enter file in which to save the key (/home/demo/.ssh/id_ed25519):
Nota: Si no escribimos nada y pulsamos la tecla «Intro»
, la clave se almacenará en la ruta que aparece entre paréntesis.
3º.- Generar una contraseña para la clave privada
Tras indicar la ruta en la que se almacenará la clave, lo siguiente que tendremos que hacer es indicar una contraseña:
Enter passphrase (empty for no passphrase):
Este paso es opcional. Así que, si no queremos incluir una contraseña, podemos dejarlo en blanco (como se indica entre paréntesis en la línea de comandos) y pulsar «Intro»
. Sin embargo, es recomendable crear una contraseña para la clave privada, para añadir una capa de seguridad adicional. De este modo, aunque algún ciberdelincuente consiguiera la clave, no podría hacer uso de ella mientras no diera con la contraseña. Por supuesto, lo más recomendable es crear siempre contraseñas seguras.
Una vez finalizado este paso, si todo va bien, deberíamos ver en pantalla algo parecido a esto:
$ ssh-keygen -t ed25519 Generating public/private rsa key pair. Enter file in which to save the key (/home/demo/.ssh/id_ed25519): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/demo/.ssh/id_ed25519 Your public key has been saved in /home/demo/.ssh/id_ed25519.pub The key fingerprint is: SHA256:EGx5HEXz7EqKigIxHHWKpCZItSj1Dy9Dqc5cYae+1zc demo@xyz.local The key's randomart image is: +--[ED25519 256]--+ | o+o o.o.++ | |=oo.+.+.o + | |*+.oB.o. o | |*. + B . . | | o. = o S . . | |.+ o o . o . | |. + . ... . | |. . o. . E | | .. o. . . | +----[SHA256]-----+
- La clave pública se guardará en: /home/demo/.ssh/id_ed25519.pub.
- La clave privada se guardará en: /home/demo/.ssh/id_ed25519.
4º.- Copiar la clave pública
Tras haber generado las claves, es hora de colocar la clave pública en el servidor virtual donde la queremos utilizar. Podemos copiar la clave pública dentro del fichero «autorized_keys»
en el servidor virtual con la instrucción «ssh-copy-id»
. Para que se copie correctamente hay que indicar la dirección IP de la máquina, como se indica a continuación:
ssh-copy-id user@123.45.67.89
Una vez finalizado este paso, accede al servidor Linux para comprobar que la configuración se haya realizado correctamente. Al acceder al servidor, si hemos generado una contraseña para la clave privada, el cliente SSH solicitará que la introduzcamos. Si no lo hemos hecho, podremos acceder al servidor sin necesidad de contraseña; únicamente con el par de claves SSH.
5º.- Desactivar el acceso para el usuario root
Este último paso es opcional y sirve para mejorar aún más la seguridad. Una vez hayamos copiado las claves SSH en el servidor y nos hayamos asegurado de que podemos acceder, podemos restringir el acceso vía SSH al usuario root. Esto permite el acceso únicamente mediante las claves SSH que hemos generado. Para hacer esto tenemos que abrir el archivo de configuración de SSH:
$ sudo nano /etc/ssh/sshd_config
Dentro de este archivo buscamos la línea donde aparezca «PasswordAuthentication»
y la modificamos para asegurarnos de que solo se pueda acceder usando las claves SSH:
PasswordAuthentication no
Nota: Si la línea de «PasswordAuthentication»
no existe, tendremos que crearla.
Por último, guardamos los cambios y recargamos SSH para que se efectúen:
$ sudo systemctl reload sshd
Una vez completados todos los pasos, dispondremos de una máquina virtual más segura y solo podremos acceder a ella si disponemos de las claves SSH generadas. Asimismo, para más seguridad, antes de cerrar la sesión SSH, deberíamos probar la conexión desde otro terminal para verificar que funciona correctamente.
Configurar la autenticación con claves RSA paso a paso
Para los sistemas antiguos que no soportan las claves ed25519, a continuación explicamos paso a paso cómo crear las claves SSH con un par de claves RSA, para acceder de forma segura a servidores virtuales o bare-metal Linux.
1º.- Crear el par de claves RSA
El primer paso consiste en crear el par de claves RSA en la máquina cliente, que por lo general es el equipo que solemos utilizar. Para ello ejecutamos la siguiente instrucción en la línea de comandos:
$ ssh-keygen -t rsa
2º.- Almacenar las claves y la contraseña
Una vez hayamos ejecutado la instrucción para generar las claves, se nos pedirá que indiquemos en qué ruta queremos almacenar la clave:
Enter file in which to save the key (/home/demo/.ssh/id_rsa):
Nota: Si no escribimos nada y pulsamos la tecla «Intro»
, la clave se almacenará en la ruta que aparece entre paréntesis.
3º.- Generar una contraseña para la clave privada
Una vez indicada la ruta en la que se almacenará la clave, podemos incluir una contraseña:
Enter passphrase (empty for no passphrase):
Si no queremos usar una contraseña, podemos dejarlo en blanco como se indica entre paréntesis y pulsar «Intro»
. Sin embargo, es recomendable incluirla para añadir una capa de seguridad adicional. De este modo, aunque algún ciberdelincuente consiguiera la clave, no podrían hacer uso de ella mientras no diera con la contraseña. El único inconveniente de crear una contraseña es que habría que escribirla cada vez que se utilizara. Por supuesto, lo más recomendable es crear siempre contraseñas seguras.
Una vez finalizado este paso, si todo va bien, deberíamos ver en pantalla algo parecido a esto:
ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/demo/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/demo/.ssh/id_rsa. Your public key has been saved in /home/demo/.ssh/id_rsa.pub. The key fingerprint is: 4a:dd:0a:c6:35:4e:3f:ed:27:38:8c:74:44:4d:93:67 demo@xyz.local The key's randomart image is: +--[ RSA 2048]----+ | .oo. | | . o.E | | + . o | | . = = . | | = S = . | | o + = + | | . o + o . | | . o | | | +-----------------+
- La clave pública se guardará en: /home/demo/.ssh/id_rsa.pub.
- La clave privada se guardará en: /home/demo/.ssh/id_rsa.
4º.- Copiar la clave pública
Una vez hayamos generado las claves, es hora de colocar la clave pública en el servidor virtual donde la queremos utilizar. Podemos copiar la clave pública dentro del fichero «autorized_keys»
en el servidor virtual con la instrucción «ssh-copy-id»
. Para que se copie correctamente hay que indicar la dirección IP de la máquina, como se indica a continuación:
ssh-copy-id user@123.45.67.89
Otra alternativa es pegar la clave utilizando SSH:
cat ~/.ssh/id_rsa.pub | ssh user@123.45.67.89 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Independientemente del comando que utilicemos, deberíamos ver algo parecido a esto:
The authenticity of host '12.34.56.78 (12.34.56.78)' can't be established. RSA key fingerprint is b1:2d:33:67:ce:35:4d:5f:f3:a8:cd:c0:c4:48:86:12. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '12.34.56.78' (RSA) to the list of known hosts. user@12.34.56.78's password: Now try logging into the machine, with "ssh 'user@12.34.56.78'", and check in: ~/.ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting.
5º.- Desactivar el acceso para el usuario root
Este último paso es opcional y sirve para mejorar aún más la seguridad. Una vez hayamos copiado las claves SSH en el servidor y nos hayamos cerciorado de que podemos acceder, podemos restringir el acceso vía SSH al usuario root. Esto permite el acceso únicamente mediante las claves SSH que hemos generado. Para hacer esto tenemos que abrir el archivo de configuración de SSH:
sudo nano /etc/ssh/sshd_config
Dentro de este archivo buscamos la línea donde aparezca «PermitRootLogin»
y la modificamos para asegurarnos de que solo se pueda acceder usando las claves SSH:
PermitRootLogin without-password
Por último, recargamos SSH para que se efectúen los cambios:
reload ssh
Una vez completados todos los pasos, dispondremos de una máquina virtual más segura y solo podremos acceder a ella si disponemos de las claves SSH generadas. Asimismo, para más seguridad, antes de cerrar la sesión SSH, deberíamos probar la conexión desde otro terminal para verificar que funciona correctamente.
¿Necesitas ayuda con la administración de sistemas? Podemos ayudarte.