Búsqueda de sitios web

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


Introducción

SSH, o shell seguro, es un protocolo cifrado que se utiliza para administrar y comunicarse con los servidores. Cuando trabaja con un servidor Linux, a menudo puede pasar gran parte de su tiempo en una sesión de terminal conectada a su servidor a través de SSH.

Si bien existen algunas formas diferentes de iniciar sesión en un servidor SSH, en esta guía nos centraremos en configurar las claves SSH. Las claves SSH proporcionan una forma 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 clientes usando una variedad de métodos diferentes. La más básica de ellas es la autenticación con contraseña, que es fácil de usar, pero no la más segura.

Si bien las contraseñas se envían al servidor de manera segura, por lo general no son lo suficientemente complejas o largas como para ser resistentes a los ataques repetidos y persistentes. El poder de procesamiento moderno combinado con scripts automatizados hace que sea muy posible forzar una cuenta protegida por contraseña. Aunque existen otros métodos para agregar seguridad adicional (fail2ban, etc.), las claves SSH demuestran ser una alternativa confiable y segura.

Los pares de claves SSH son dos claves criptográficamente seguras que se pueden usar para autenticar a un cliente en un servidor SSH. Cada par de claves consta de una clave pública y una clave privada.

La clave privada es retenida por el cliente y debe mantenerse en absoluto secreto. Cualquier compromiso de la clave privada permitirá que el atacante inicie sesión en servidores que están configurados con la clave pública asociada sin autenticación adicional. Como precaución adicional, la clave se puede cifrar en el disco con una frase de contraseña.

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

La clave pública se carga en un servidor remoto en el que desea poder iniciar sesión con SSH. La clave se agrega a un archivo especial dentro de la cuenta de usuario en la que iniciará sesión llamado ~/.ssh/authorized_keys.

Cuando un cliente intenta autenticarse usando claves SSH, el servidor puede probar al cliente para saber si está en posesión de 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.

Paso 1: crear claves SSH

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

Para hacer esto, podemos usar una utilidad especial llamada ssh-keygen, que se incluye con el conjunto de herramientas estándar de OpenSSH. De forma predeterminada, esto creará un par de claves RSA de 3072 bits.

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

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

La utilidad le pedirá que seleccione una ubicación para las claves que se generarán. De forma predeterminada, 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.

Por lo general, es mejor quedarse con la ubicación predeterminada en esta etapa. Si lo hace, permitirá que su cliente SSH encuentre automáticamente sus claves SSH cuando intente autenticarse. Si desea elegir una ruta no estándar, escríbala ahora; de lo contrario, presione ENTER para aceptar la predeterminada.

Si había generado previamente un par de claves SSH, es posible que vea un mensaje similar a este:

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

Si elige sobrescribir la clave en el disco, ya no podrá autenticarse con la clave anterior. Tenga mucho cuidado al seleccionar sí, ya que este es un proceso destructivo que no se puede revertir.

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

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

Es posible que se pregunte qué ventajas ofrece una clave SSH si aún necesita ingresar una frase de contraseña. Algunas de las ventajas son:

  • La clave SSH privada (la parte que se puede proteger con 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 la fuerza bruta basada en la red no será posible contra la frase de contraseña.
  • La clave privada se mantiene dentro de un directorio restringido. El cliente SSH no reconocerá claves privadas que no se mantengan en directorios restringidos. La clave en sí también debe tener permisos restringidos (lectura y escritura solo disponibles para el propietario). Esto significa que otros usuarios del sistema no pueden husmear.
  • Cualquier atacante que desee descifrar la frase de contraseña de la clave SSH privada ya debe tener acceso al sistema. Esto significa que ya tendrán acceso a su cuenta de usuario o la cuenta raíz. Si se encuentra en esta posición, la frase de contraseña puede evitar que el atacante inicie sesión inmediatamente en sus otros servidores. Con suerte, 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 a través de permisos de archivo, nadie más que usted (y el usuario raíz) nunca debe tener acceso a este archivo. La frase de contraseña sirve como una capa adicional de protección en caso de que estas condiciones se vean comprometidas.

Una frase de contraseña es una adición opcional. Si ingresa una, deberá proporcionarla cada vez que use esta clave (a menos que esté ejecutando un software de agente SSH que almacena la clave descifrada). Recomendamos usar una frase de contraseña, pero si no desea establecer una frase de contraseña, puede presionar ENTER para omitir este aviso.

Output
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: SHA256:CAjsV9M/tt5skazroTc1ZRGCBz+kGtYUIPhRvvZJYBs username@hostname The key's randomart image is: +---[RSA 3072]----+ |o ..oo.++o .. | | o o +o.o.+... | |. . + oE.o.o . | | . . oo.B+ .o | | . .=S.+ + | | . o..* | | .+= o | | .=.+ | | .oo+ | +----[SHA256]-----+

Ahora tiene una clave pública y privada que puede usar para autenticarse. El siguiente paso es colocar la clave pública en su servidor para que pueda usar la autenticación de clave SSH para iniciar sesión.

Paso 2: Copiar una clave pública SSH en su servidor

Nota: una versión anterior de este tutorial tenía instrucciones para agregar una clave pública SSH a su cuenta de DigitalOcean. Esas instrucciones ahora se pueden encontrar en la sección Claves SSH de nuestra documentación del producto DigitalOcean.

Hay varias formas de cargar su clave pública en su servidor SSH remoto. El método que utilice depende en gran medida de las herramientas que tenga disponibles y de los detalles de su configuración actual.

Todos los métodos siguientes producen el mismo resultado final. Primero se describe el método más simple y automatizado, y los siguientes requieren pasos manuales adicionales. Debe seguir estos solo si no puede usar los métodos anteriores.

Copiando su clave pública usando ssh-copy-id

La forma más sencilla de copiar su clave pública en 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 se incluye en los paquetes de OpenSSH en muchas distribuciones, por lo que es posible que ya la tenga disponible en su sistema local. Para que este método funcione, debe tener actualmente acceso SSH basado en contraseña a su servidor.

Para usar la utilidad, debe especificar el host remoto al que desea conectarse y la cuenta de usuario a la que tiene acceso SSH basado en contraseña. Esta es la cuenta donde se copiará su clave SSH pública.

La sintaxis es:

  1. ssh-copy-id username@remote_host

Es posible que vea un mensaje como este:

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' 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 significa que su computadora local no reconoce el host remoto. Esto sucederá la primera vez que se conecte a un nuevo host. Escriba yes y presione ENTER para continuar.

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

Output
/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@203.0.113.1's password:

Escriba la contraseña (su escritura no se mostrará por motivos de seguridad) y presione ENTER. La utilidad se conectará a la cuenta en el host remoto utilizando la contraseña que proporcionó. A continuación, copiará el contenido de su clave ~/.ssh/id_rsa.pub en un archivo en el directorio de inicio ~/.ssh de la cuenta remota llamado authorized_keys.

Verá una salida que se ve así:

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

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

Copiar su clave pública usando SSH

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

Podemos hacer esto generando el contenido de nuestra clave SSH pública en nuestra computadora local y canalizándolo a través de una conexión SSH al servidor remoto. Por otro lado, podemos asegurarnos de que el directorio ~/.ssh existe en la cuenta que estamos usando y luego enviar el contenido que canalizamos a un archivo llamado authorized_keys dentro de este directorio.

Usaremos el símbolo de redirección >> para agregar el contenido en lugar de sobrescribirlo. Esto nos permitirá agregar claves sin destruir las claves agregadas previamente.

El comando completo se verá así:

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

Es posible que vea un mensaje como este:

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' 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 significa que su computadora local no reconoce el host remoto. Esto sucederá la primera vez que se conecte a un nuevo host. Escriba yes y presione ENTER para continuar.

Luego, se le solicitará la contraseña de la cuenta a la que intenta conectarse:

Output
username@203.0.113.1's password:

Después de ingresar 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 esto fue exitoso.

Copiar su clave pública manualmente

Si no tiene acceso SSH basado en contraseña a su servidor disponible, deberá realizar el proceso anterior manualmente.

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

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

  1. cat ~/.ssh/id_rsa.pub

Verá el contenido de la clave, que puede verse así:

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

Acceda a su host remoto usando cualquier método que tenga disponible. Esta puede ser una consola basada en web proporcionada por su proveedor de infraestructura.

Nota: si está utilizando un Droplet de DigitalOcean, consulte nuestra documentación de la Consola de recuperación en los documentos del producto de DigitalOcean.

Una vez que tenga acceso a su cuenta en el servidor remoto, debe asegurarse de que se haya creado el directorio ~/.ssh. Este comando creará el directorio si es necesario, o no hará nada si ya existe:

  1. mkdir -p ~/.ssh

Ahora, puede 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, creándolo si es necesario, usando esto:

  1. echo public_key_string >> ~/.ssh/authorized_keys

En el comando anterior, sustituya public_key_string con el resultado del comando cat ~/.ssh/id_rsa.pub que ejecutó en su local. sistema. Debe comenzar con ssh-rsa AAAA... o similar.

Si esto funciona, puede pasar a probar su nueva autenticación SSH basada en claves.

Paso 3: autenticarse en su servidor usando 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 es casi el mismo:

  1. ssh username@remote_host

Si es la primera vez que se conecta a este host (si usó el último método anterior), es posible que vea algo como esto:

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' 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 significa que su computadora local no reconoce el host remoto. Escribe yes y luego presiona ENTER para continuar.

Si no proporcionó una frase de contraseña para su clave privada, iniciará sesión de inmediato. Si proporcionó una frase de contraseña para la clave privada cuando creó la clave, se le pedirá que la ingrese ahora. Posteriormente, se creará una nueva sesión de shell para usted con la cuenta en el sistema remoto.

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

Paso 4: deshabilitar la autenticación de contraseña en su servidor

Si pudo iniciar sesión en su cuenta usando SSH sin una contraseña, ha configurado correctamente la autenticación basada en clave SSH en su cuenta. Sin embargo, su mecanismo de autenticación basado en contraseña aún está activo, lo que significa que su servidor aún está 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 clave SSH para la cuenta raíz en este servidor o, preferiblemente, que tenga configurada la autenticación basada en clave SSH para una cuenta en este servidor con acceso sudo. Este paso bloqueará los inicios de sesión basados en contraseña, por lo que es esencial asegurarse de que todavía 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:

  1. sudo nano /etc/ssh/sshd_config

Dentro del archivo, busque una directiva llamada PasswordAuthentication. Esto puede ser comentado. Descomente la línea eliminando cualquier # al principio de la línea y establezca el valor en no. Esto deshabilitará su capacidad para iniciar sesión a través de SSH usando contraseñas de cuenta:

PasswordAuthentication no

Guarde y cierre el archivo cuando haya terminado. Para implementar realmente los cambios que acabamos de hacer, debe reiniciar el servicio.

En la mayoría de las distribuciones de Linux, puede ejecutar el siguiente comando para hacerlo:

  1. sudo systemctl restart ssh

Después de completar este paso, ha realizado la transición con éxito de su demonio SSH para que solo responda a las claves SSH.

Conclusión

Ahora debería tener la autenticación basada en clave SSH configurada y ejecutándose en su servidor, lo que le permite iniciar sesión sin proporcionar una contraseña de cuenta. Desde aquí, hay muchas direcciones a las que puede dirigirse. Si desea obtener más información sobre cómo trabajar con SSH, consulte nuestra guía de aspectos básicos de SSH.