Tutorial

Cómo configurar la autenticación basada en claves de SSH en un servidor Linux

Linux BasicsGetting StartedSecuritySystem Tools

Introducción

SSH, o shell seguro, es un protocolo cifrado que se usa para administrar servidores y comunicarse con ellos. Al trabajar con un servidor de Linux, es probable que pase la mayor parte de su tiempo en una sesión de terminal conectada a su servidor a través de SSH.

Aunque existen varias formas de iniciar sesión en un servidor SSH, en esta guía nos centraremos en la configuración de las claves SSH. Las claves SSH proporcionan una forma fácil y extremadamente segura de iniciar sesión en su servidor. Por este motivo, este es el método que recomendamos a todos los usuarios.

¿Cómo funcionan las claves SSH?

Un servidor SSH puede autenticar a los clientes usando varios métodos diferentes. El más básico de estos es la autenticación por contraseña, que es fácil de usar, pero no es la más segura.

A pesar de que las contraseñas se envían al servidor de forma segura, generalmente no son lo suficientemente complejas o largas como para resistir a los constantes y persistentes atacantes. La potencia de procesamiento moderna combinada con scripts automatizados hace que sea muy posible forzar una cuenta protegida con una contraseña. A pesar de que existen otros métodos para añadir seguridad adicional (fail2ban, etc.), las claves SSH son una alternativa confiable y segura.

Los pares de claves SSH son dos claves criptográficamente seguras que pueden usarse para autenticar a un cliente a un servidor SSH. Cada par de claves está compuesto por una clave pública y una clave privada.

El cliente mantiene la clave privada y debe mantenerla en absoluto secreto. Poner en riesgo la clave privada permitirá al atacante iniciar sesión en los servidores que están configurados con la clave pública asociada sin autenticación adicional. Como medida de precaución adicional, puede cifrar la clave en el disco con una frase de contraseña.

La clave pública asociada puede compartirse libremente sin ninguna consecuencia negativa. La clave pública puede usarse para cifrar mensajes que solo la clave privada puede descifrar. Esta propiedad se emplea como forma de autenticación mediante el uso del par de claves.

La clave pública se carga a un servidor remoto, en el que quiere iniciar sesión con SSH. La clave se añade a un archivo especial dentro de la cuenta de usuario con la que iniciará sesión, llamada ~/.ssh/authorized_keys.

Cuando un cliente intente autenticarse usando claves SSH, el servidor puede comprobar si el cliente posee la clave privada. Si el cliente puede demostrar que posee la clave privada, se genera una sesión de shell o se ejecuta el comando solicitado.

Cómo crear claves SSH

El primer paso para configurar la autenticación con clave SSH en su servidor es generar un par de claves SSH en su computadora local.

Para ello, podemos usar una utilidad especial llamada ssh-keygen, que se incluye con el conjunto de herramientas estándar de OpenSSH. Por defecto, esto creará un par de claves RSA de 2048 bits, lo cual es muy útil para la mayoría de usos.

En su computadora local, genere un par de claves SSH escribiendo lo siguiente:

ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):

La utilidad le solicitará que seleccione una ubicación para las claves que se generarán. Por defecto, las claves se almacenarán en el directorio ~/.ssh dentro del directorio de inicio de su usuario. La clave privada se llamará id_rsa, y la clave pública asociada se llamará id_rsa.pub.

Normalmente, es mejor que conserve la ubicación predeterminada en esta etapa. Hacerlo permitirá a su cliente SSH encontrar automáticamente sus claves SSH al intentar autenticarse. Si desea elegir una ruta no estándar, introdúzcala ahora, de lo contrario, presione ENTER para aceptar la predeterminada.

Si generó previamente un par de claves SSH, es posible que vea un mensaje como el siguiente:

/home/username/.ssh/id_rsa already exists.
Overwrite (y/n)?

Si elige sobrescribir la clave en el disco, ya no podrá autenticar usando la clave anterior. Tenga mucho cuidado al convalidar la operación, ya que este es un proceso destructivo que no puede revertirse.

Created directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

A continuación, se le solicitará que introduzca una frase de contraseña para la clave. Esta es una frase de contraseña opcional que puede usarse para cifrar el archivo de clave privada en el disco.

Es posible que se esté preguntando qué ventajas ofrece una clave SSH si aún así necesita introducir una frase de contraseña. Algunas de las ventajas son las siguientes:

  • La clave SSH privada (la parte que puede protegerse con una frase de contraseña), nunca se expone en la red. La frase de contraseña solo se usa para descifrar la clave en la máquina local. Esto significa que los ataques de fuerza bruta basada en la red no podrán contra la frase de contraseña.
  • La clave privada se guarda dentro de un directorio restringido. El cliente SSH no reconocerá claves privadas que no estén guardadas en directorios restringidos. La propia clave también debe tener permisos restringidos (de lectura y escritura solo disponibles para el propietario). Esto significa que otros usuarios del sistema no pueden espiar.
  • Cualquier atacante que desee descifrar la frase de contraseña de la clave SSH privada debe tener acceso previo al sistema. Esto significa que ya tendrán acceso a su cuenta de usuario o a la cuenta root. Si se encuentra en esta posición, la frase de contraseña puede evitar que el atacante inicie sesión de inmediato en sus otros servidores. Esto le dará tiempo para crear e implementar un nuevo par de claves SSH y eliminar el acceso de la clave comprometida.

Dado que la clave privada nunca se expone a la red y está protegida mediante permisos de archivo, nadie más que usted debería tener acceso a este archivo (y el usuario root). La frase de contraseña sirve como capa de protección adicional en caso de que estas condiciones se vean comprometidas.

Una frase de contraseña es un complemento opcional. Si introduce una, deberá proporcionarla cada vez que utilice esta clave (a menos que esté ejecutando un software de agente SSH que almacene la clave descifrada). Recomendamos usar una frase de contraseña, pero si no desea establecer una frase de contraseña, puede simplemente pulsar ENTER para omitir esta pregunta.

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:
a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_host
The key's randomart image is:
+--[ RSA 2048]----+
|     ..o         |
|   E o= .        |
|    o. o         |
|        ..       |
|      ..S        |
|     o o.        |
|   =o.+.         |
|. =++..          |
|o=++.            |
+-----------------+

Ahora dispondrá de una clave pública y privada que puede usar para realizar la autenticación. El siguiente paso es ubicar la clave pública en su servidor, a fin de poder utilizar la autenticación basada en la clave SSH para iniciar sesión.

Cómo incorporar su clave pública al crear su servidor

Si está iniciando un nuevo servidor de DigitalOcean, puede incorporar automáticamente su clave pública SSH en la cuenta root de su nuevo servidor.

En la parte inferior de la página de creación de Droplet, existe una opción para añadir claves SSH a su servidor:

Clave SSH incorporada

Si ya ha añadido un archivo de clave pública a su cuenta de DigitalOcean, lo verá aquí como una opción seleccionable (hay dos claves existentes en el ejemplo anterior: “clave de trabajo” y “clave de inicio”). Para incorporar una clave existente, simplemente haga clic en ella y se resaltará Puede incorporar múltiples claves en un solo servidor:

Selección de clave SSH

Si aún no tiene una clave SSH pública cargada en su cuenta o si quiere añadir una nueva clave a su cuenta, haga clic en el botón “+ Add SSH Key” (+ Añadir clave SSH). Esto se ampliará a un mensaje:

Mensaje de clave SSH

Pegue su clave pública SSH en el cuadro “Contenido de la clave SSH”. Suponiendo que haya generado sus claves usando el método anterior, puede obtener el contenido de la clave pública en su computadora local escribiendo lo siguiente:

cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNqqi1mHLnryb1FdbePrSZQdmXRZxGZbo0gTfglysq6KMNUNY2VhzmYN9JYW39yNtjhVxqfW6ewc+eHiL+IRRM1P5ecDAaL3V0ou6ecSurU+t9DR4114mzNJ5SqNxMgiJzbXdhR+j55GjfXdk0FyzxM3a5qpVcGZEXiAzGzhHytUV51+YGnuLGaZ37nebh3UlYC+KJev4MYIVww0tWmY+9GniRSQlgLLUQZ+FcBUjaqhwqVqsHe4F/woW1IHe7mfm63GXyBavVc+llrEzRbMO111MogZUcoWDI9w7UIm8ZOTnhJsk7jhJzG2GpSXZHmly/a/buFaaFnmfZ4MYPkgJD username@example.com

Pegue este valor completo en el cuadro más grande. En el cuadro “Comment (optional)” (Comentario [opcional]), puede elegir una etiqueta para la clave. Esta se mostrará como el nombre de la clave en la interfaz de DigitalOcean:

Nueva clave SSH

Cuando cree su Droplet, las claves SSH públicas que haya seleccionado se ubicarán en el archivo ~/.ssh/authorized_keys de la cuenta del usuario root. Esto le permitirá iniciar sesión en el servidor desde la computadora con su clave privada.

Cómo copiar una clave pública en su servidor

Si ya tiene un servidor disponible y no incorporó claves al crearlo, aún puede cargar su clave pública y usarla para autenticarse en su servidor.

El método que utilice depende en gran medida de las herramientas que tenga disponibles y los detalles de su configuración actual. Todos los siguientes métodos producen el mismo resultado final. El método más fácil y automatizado es el primero y los que se siguen requieren pasos manuales adicionales si no puede usar los métodos anteriores.

Cómo copiar su clave pública con SSH-Copy-ID

La forma más sencilla de copiar su clave pública a un servidor existente es usar una utilidad llamada ssh-copy-id. Debido a su simplicidad, se recomienda este método si está disponible.

La herramienta ssh-copy-id está incluida en los paquetes de OpenSSH en muchas distribuciones, por lo que es posible que esté disponible en su sistema local. Para que este método funcione, ya debe disponer de acceso con SSH basado en contraseña en su servidor.

Para usar la utilidad, solo necesita especificar el host remoto al que desee conectarse y la cuenta de usuario a la que tenga acceso SSH con contraseña. Esta es la cuenta donde se copiará su clave SSH pública.

La sintaxis es la siguiente:

ssh-copy-id username@remote_host

Es posible que vea un mensaje como el siguiente:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

Esto solo significa que su computadora local no reconoce el host remoto. Esto sucederá la primera vez que establezca conexión con un nuevo host. Escriba “yes” y presione ENTER para continuar.

A continuación, la utilidad analizará su cuenta local en busca de la clave id_rsa.pub que creamos antes. Cuando la encuentre, le solicitará la contraseña de la cuenta del usuario remoto:

/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
username@111.111.11.111's password:

Escriba la contraseña (por motivos de seguridad, no se mostrará lo que escriba) y presione ENTER. La utilidad se conectará a la cuenta en el host remoto usando la contraseña que proporcionó. Luego, copie el contenido de su clave ~/.ssh/id_rsa.pub a un archivo en el directorio principal de la cuenta remota ~/.ssh, llamado authorized_keys.

Verá un resultado similar a este:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'username@111.111.11.111'"
and check to make sure that only the key(s) you wanted were added.

En este punto, su clave id_rsa.pub se habrá cargado en la cuenta remota. Puede continuar con la siguiente sección.

Cómo copiar la clave pública con SSH

Si no tiene ssh-copy-id disponible, pero tiene acceso de SSH basado en contraseña a una cuenta de su servidor, puede cargar sus claves usando un método de SSH convencional.

Para ello, podemos extraer el contenido de nuestra clave pública SSH en nuestra computadora local y canalizarlo a través de una conexión SSH al servidor remoto. Por otro lado, podemos asegurarnos de que el directorio ~/.sh exista bajo la cuenta que estamos usando y luego salga el contenido que canalizamos en un archivo llamado authorized_keys dentro de este directorio.

Usaremos el símbolo de redireccionamiento >> para añadir el contenido en lugar de sobrescribirlo. Esto nos permitirá agregar claves sin eliminar las claves previamente agregadas.

El comando completo tendrá el siguiente aspecto:

cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Es posible que vea un mensaje como el siguiente:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

Esto solo significa que su computadora local no reconoce el host remoto. Esto sucederá la primera vez que establezca conexión con un nuevo host. Escriba “yes” y presione ENTER para continuar.

A continuación, se le solicitará la contraseña de la cuenta a la que está intentando conectarse:

username@111.111.11.111's password:

Una vez que ingrese su contraseña, el contenido de su clave id_rsa.pub se copiará al final del archivo authorized_keys de la cuenta del usuario remoto. Continúe con la siguiente sección si se realizó exitosamente.

Copiar su clave pública de forma manual

Si no dispone de acceso SSH con contraseña a su servidor, deberá completar el proceso anterior de forma manual.

El contenido de su archivo id_rsa.pub deberá agregarse a un archivo en ~/.ssh/authorized_keys en su máquina remota de alguna forma.

Para mostrar el contenido de su clave id_rsa.pub, escriba esto en su computadora local:

cat ~/.ssh/id_rsa.pub

Verá el contenido de la clave, que debería tener un aspecto similar a este:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test

Acceda a su host remoto usando el método que esté a su disposición. Por ejemplo, si su servidor es un Droplet de DigitalOcean, puede iniciar sesión usando la consola web del panel de control:

Acceso a la consola de DigitalOcean

Una vez que tenga acceso a su cuenta en el servidor remoto, debe asegurarse de que el directorio ~/.ssh haya sido creado. Con este comando se creará el directorio, si es necesario. Si este último ya existe, no se creará:

mkdir -p ~/.ssh

Ahora, podrá crear o modificar el archivo authorized_keys dentro de este directorio. Puede agregar el contenido de su archivo id_rsa.pub al final del archivo authorized_keys y, si es necesario, crearlo usando el siguiente comando:

echo public_key_string >> ~/.ssh/authorized_keys

En el comando anterior, reemplace public_key_string por el resultado del comando cat ~/.ssh/id_rsa.pub que ejecutó en su sistema local. Debería iniciar con ssh-rsa AAAA....

Si esto funciona, puede continuar con la autenticación sin contraseña.

Autenticación en su servidor con claves SSH

Si completó con éxito uno de los procedimientos anteriores, debería poder iniciar sesión en el host remoto sin la contraseña de la cuenta remota.

El proceso básico es el mismo:

ssh username@remote_host

Si es la primera vez que establece conexión con este host (si empleó el último método anterior), es posible que vea algo como esto:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

Esto solo significa que su computadora local no reconoce el host remoto. Escriba “yes” y presione ENTER para continuar.

Si no proporcionó una frase de contraseña para su clave privada, se iniciará sesión de inmediato. Si proporcionó una frase de contraseña para la clave privada al crearla, se le solicitará que la introduzca ahora. A continuación, se debería generar una nueva sesión de shell con la cuenta en el sistema remoto.

Si lo realiza con éxito, continúe para averiguar cómo bloquear el servidor.

Desactivar la autenticación por contraseña en el servidor

Si pudo iniciar sesión en su cuenta usando SSH sin una contraseña, habrá configurado con éxito la autenticación basada en claves de SSH para su cuenta. Sin embargo, su mecanismo de autenticación basado en contraseña sigue activo. Esto significa que su servidor sigue expuesto a ataques de fuerza bruta.

Antes de completar los pasos de esta sección, asegúrese de tener configurada la autenticación basada en claves SSH para la cuenta root en este servidor o, preferiblemente, la autenticación basada en clave SSH para una cuenta no root en este servidor con acceso sudo. Con este paso, se bloquearán los inicios de sesión basados en contraseñas. Por lo tanto, es fundamental que se asegure de que aún podrá obtener acceso administrativo.

Una vez que se cumplan las condiciones anteriores, inicie sesión en su servidor remoto con claves SSH, ya sea como root o con una cuenta con privilegios sudo. Abra el archivo de configuración del demonio SSH:

sudo nano /etc/ssh/sshd_config

Dentro del archivo, busque una directiva llamada PasswordAuthentication. Puede insertar comentarios sobre esto. Elimine los comentarios de la línea y fije el valor en “no”. Esto inhabilitará su capacidad de iniciar sesión a través de SSH usando contraseñas de cuenta:

PasswordAuthentication no

Guarde y cierre el archivo cuando termine. Para implementar realmente los cambios que acabamos de realizar, debe reiniciar el servicio.

En las máquinas Ubuntu o Debian, puede emitir este comando:

sudo service ssh restart

En las máquinas CentOS/Fedora, el demonio se llama sshd:

sudo service sshd restart

Después de completar este paso, ha trasladado correctamente a su demonio SHH para que responda únicamente a claves SSH.

Conclusión

De esta manera, la autenticación basada en claves SSH debería quedar configurada y funcionando en su servidor, lo que le permitirá iniciar sesión sin proporcionar una contraseña de cuenta. Desde aquí, hay muchas direcciones a las que puede dirigirte. Si desea obtener más información sobre cómo trabajar con SSH, consulte nuestra Guía de aspectos básicos de SSH.

Creative Commons License