Configurar conexión SSH con llaves en servidor Linux

Vamos a mejorar la seguridad utilizando claves SSH en nuestro servidor Linux, donde la clave pública está alojada en el servidor y la llave privada estará bajo tu control y, claro, responsabilidad. Además, deshabilitamos el inicio de sesión de root a través de SSH para mejorar la seguridad.

Estuve leyendo qué tipo de algoritmo de cifrado usar, algunos recomiendan Ed25519 por su mejor rendimiento y velocidad. Otros recomiendan el clásico RSA 4096 por su nivel de complejidad para descifrarlo.

Aunque muchos expertos pueden defender su punto, en la práctica, estos métodos son tan complicados de descifrar con la tecnología actual que son igual de seguros, quizá con el método RSA por la cantidad de sus Bytes tome más tiempo que los algoritmos de Ed25519, pero no te compliques, ambos son completamente viables y seguros. Además el rendimiento que le atribuyen a Ed25519 es imperceptible para nosotros, así que elige el que prefieras.

Puedes hallar mayor información en los siguientes enlaces:

https://security.stackexchange.com/questions/90077/ssh-key-ed25519-vs-rsa

https://serverfault.com/questions/1081266/ssh-keys-ed25519-vs-rsa-performance-demystified

La única diferencia entre estos tipos de llaves a nivel de configuración está en el comando inicial que veremos más adelante.

Pre-requisitos:

  1. Permiso sudo o root

Paso 1:

Una vez que iniciemos sesión en nuestro servidor, si decidimos usar el algoritmo ed25519 usaremos el siguiente comando:

ssh-keygen -t ed25519

Para RSA:

ssh-keygen -t rsa 

Nota: Esa es la única diferencia, luego los pasos siguientes serán los mismos para ambos tipos de claves.

Paso 2:

Luego aparecerá una línea de diálogo que le pedirá indicar en que ruta desea almacenar las llaves. Por defecto se guardará en: /home/username/.ssh/id_rsa que estará especificado en la misma consola. Si no tienes una ruta diferente en mente, solo dale “Enter”.

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

Paso 3:

Posteriormente nos pedirá que ingresemos una contraseña para las nuevas claves. En caso no desees usar una contraseña solo debes darle “Enter”, pero te recomiendo que le asignes una. Aunque estas llaves criptográficas en sí ya son más seguras que las contraseñas, si alguien logra robar la llave privada podría acceder a tu servidor si no tiene una contraseña asignada.

Enter passphrase (empty for no passphrase):

Paso 4:

Una vez le asignemos (o no) la contraseña tendremos, se mostrará algo similar a lo siguiente:

ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is:
4a:dd:0a:c6:35:4e:3f:ed:27:38:8c:74:44:4d:93:67 username@adminlogs.net
The key's randomart image is:
+--[ RSA 2048]----+
|          .oo.   |
|         .  o.E  |
|        +   .  o |
|  .... = = .     |
|      = S . = .  |
|   ooo + = +     |
|      . o + o .  |
|           . o   |
|                 |
+-----------------+

Tal como la descripción lo indica, nuestras claves serán las siguientes:

Clave Pública: /home/username/.ssh/id_rsa
Clave Privada: /home/username/.ssh/id_rsa.pub

IMPORTANTE: Tener en cuenta que solo la llave pública irá del lado del servidor, además deberemos ser muy cuidadosos con nuestra llave privada ya que si terceros tienen acceso estaremos en aprietos.

Paso 5:

Si la llave será usada en el mismo servidor donde fue generada, yo uso el siguiente comando para copiar la llave pública en la ruta predeterminada del servidor:

ssh-copy-id username@127.0.0.1

Por otro lado, si queremos copiar dicha llave pública en un servidor remoto debemos cambiar la IP por la del servidor:

ssh-copy-id username@IPDELSERVIDOR

Como sea, obtendremos algo similar a:

The authenticity of host 'IPDELSERVIDOR (IPDELSERVIDOR)' can't be established.
RSA key fingerprint is xx:aa:33:xx:ce:35:4d:5f:69:a8:cd:c0:c4:03:14:16.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'IPDELSERVIDOR' (RSA) to the list of known hosts.
username@IPDELSERVIDOR's password:
Now try logging into the machine, with "ssh 'username@IPDELSERVIDOR'", and check in:
  ~/.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.

Paso 6:

Ahora deshabilitamos el login de root con contraseña a través de SSH. Para ello debemos ingresar al archivo de configuración del servicio SSH y agregar lo siguiente en la línea correspondiente:

PermitRootLogin without-password

Tranquilo, el parámetro “without-password” no significa que el usuario root no tendrá ningún tipo de autenticación. Esto quiere decir que la autenticación usará un método alternativo a la contraseña. Para este caso, se usará el par de llaves que generamos. Así que si alguien conociera la clave root de tu servidor, no podría acceder si es que no tiene tu clave privada.

Paso 7:

Ahora lo único que nos faltaría es reiniciar el servicio SSH.

NOTA: Si usas la clave root del servidor para acceder a tus sistemas (cPanel/WHM) o si accedes de manera física al servidor, esta configuración no afectará tu autenticación. Ya que estos cambios solo afectarían al servicio SSH.

Paso 8:

Los comandos para iniciar sesión desde una terminal Windows o Linux serían las siguientes:

ssh -i rutadellaveprivada root@IPDELSERVIDOR -p puerto

Posibles errores:

Caso 1:

Si intentas conectarte desde tu PC Windows:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'private_key.key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "private_key.key": bad permissions
root@IPDELSERVIDOR's password:
Last failed login: Sun Dec 12 22:04:28 -05 2021 from 127.0.0.1 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Sun Nov 21 00:25:01 2021

Esta advertencia quiere decir que el archivo de tu llave privada es muy accesible y por tanto está desprotegida. Para eliminar este mensaje tienes que seguir los siguientes pasos:

  1. Ubicar tu llave privada >> clic derecho >> propiedades
  2. Ir a pestaña Seguridad >> Opciones avanzadas >> Deshabilitar herencia
  3. Si se borran todos los usuarios damos clic en Agregar >> ingresamos usuario de windows >> comprobar nombres >> aceptar

Al final solo debería figurar tu usuario con todos los permisos especiales.

Caso 2:

Copiar el contenido de mi llave privada y crear el archivo llaveprivada.key para conectarnos al servidor invocando nuestra nueva llave. Pero cuando trato de acceder al servidor tengo el siguiente mensaje de error:

Load key "llaveprivada.key": invalid format

Al parecer en el proceso de creación del archivo este deja de ser compatible con el cliente Openssh. Así que lo que me funcionó es descargar directamente el archivo desde el servidor, desde una conexión sftp e invocar nuevamente el archivo en nuestro comando.

Conclusión:

Con estos pasos podrás dormir un poco mejor, ya que estarás aumentando la seguridad de tu servidor. Recuerda siempre tener un backup de tus llaves en un lugar seguro.

Te recomiendo leer el siguiente artículo: https://adminlogs.net/2021/11/11/porque-debo-actualizar-la-version-php-de-mi-sitio-web/