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

Introducción
SSH, o secure shell, es un protocolo cifrado que se utiliza para administrar y comunicarse con servidores. Cuando se trabaja con un servidor Linux, es posible que se pase gran parte del tiempo en una sesión de terminal conectada al servidor a través de SSH.
Si bien existen diferentes formas de iniciar sesión en un servidor SSH, en esta guía nos centraremos en configurar claves SSH. Las claves SSH brindan una forma extremadamente segura de iniciar sesión en su servidor. Por este motivo, este es el método que recomendamos para todos los usuarios.
Simplifique la implementación de aplicaciones en servidores con la plataforma de aplicaciones DigitalOcean . Implemente directamente desde GitHub en minutos.
¿Cómo funcionan las claves SSH?
Un servidor SSH puede autenticar a los clientes mediante distintos métodos. El más básico de ellos es la autenticación con contraseña, que es fácil de usar, pero no la más segura.
Aunque las contraseñas se envían al servidor de forma segura, por lo general no son lo suficientemente complejas ni largas como para resistir a los ataques persistentes y repetidos. La potencia de procesamiento moderna combinada 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 resultan ser una alternativa confiable y segura.
Los pares de claves SSH son dos claves criptográficamente seguras que se pueden utilizar para autenticar un cliente en un servidor SSH. Cada par de claves consta de una clave pública y una clave privada.
El cliente conserva la clave privada y debe mantenerse en absoluto secreto. Cualquier violación de la clave privada permitirá al atacante iniciar 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 consecuencias negativas. La clave pública se puede utilizar para cifrar mensajes que solo la clave privada puede descifrar. Esta propiedad se utiliza como forma de autenticación mediante el par de claves.
La clave pública se carga en un servidor remoto al que desea poder acceder 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 mediante 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.
Paso 1: creación de 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 ello, podemos utilizar una utilidad especial llamada ssh-keygen
, que se incluye en 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:
- ssh-keygen
OutputGenerating 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. De manera predeterminada, las claves se almacenarán en el ~/.ssh
directorio dentro del directorio de inicio de su usuario. Se llamará a la clave privada id_rsa
y a la clave pública asociada id_rsa.pub
.
Por lo general, es mejor quedarse con la ubicación predeterminada en esta etapa. De esta manera, su cliente SSH podrá encontrar 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 ya ha generado un par de claves SSH, es posible que vea un mensaje como 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 se trata de un proceso destructivo que no se puede revertir.
OutputCreated directory '/home/username/.ssh'.Enter passphrase (empty for no passphrase):Enter same passphrase again:
A continuación, se le solicitará que ingrese una contraseña para la clave. Esta es una contraseña opcional que se puede usar para cifrar el archivo de clave privada en el disco.
Quizás te preguntes qué ventajas ofrece una clave SSH si aún necesitas introducir una frase de contraseña. Algunas de las ventajas son:
- La clave SSH privada (la parte que se puede proteger con una frase de contraseña) nunca se expone en la red. La frase de contraseña solo se utiliza para descifrar la clave en la máquina local. Esto significa que no será posible realizar ataques de fuerza bruta basados en la red contra la frase de contraseña.
- La clave privada se guarda en un directorio restringido. El cliente SSH no reconocerá claves privadas que no se guarden en directorios restringidos. La clave en sí también debe tener permisos restringidos (lectura y escritura disponibles solo para el propietario). Esto significa que otros usuarios del sistema no pueden espiar.
- Cualquier atacante que desee descifrar la contraseña de la clave SSH privada ya debe tener acceso al sistema. Esto significa que ya tendrá acceso a su cuenta de usuario o a la cuenta raíz. Si se encuentra en esta situación, la contraseña puede impedir 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 a 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 (y el usuario root ) debería poder acceder a este archivo. La frase de contraseña sirve como una capa adicional de protección en caso de que se vulneren estas condiciones.
La frase de contraseña es un elemento opcional. Si ingresa una, deberá proporcionarla cada vez que use 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 configurar una, puede presionar ENTER
para omitir este mensaje.
OutputYour 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@hostnameThe 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 tienes una clave pública y una privada que puedes usar para autenticarte. El siguiente paso es colocar la clave pública en tu servidor para que puedas usar la autenticación con clave SSH para iniciar sesión.
Paso 2: Copiar una clave pública SSH a su servidor
Nota: una versión anterior de este tutorial contení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 .
Existen 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.
Los siguientes métodos dan el mismo resultado final. Primero se describe el método más simple y automatizado, y los siguientes requieren pasos manuales adicionales. Debe seguirlos solo si no puede utilizar los métodos anteriores.
Copiar su clave pública usandossh-copy-id
La forma más sencilla de copiar su clave pública a un servidor existente es utilizar una utilidad llamada ssh-copy-id
. Debido a su simplicidad, se recomienda este método si está disponible.
La ssh-copy-id
herramienta está incluida en los paquetes OpenSSH de muchas distribuciones, por lo que es posible que ya la tengas disponible en tu sistema local. Para que este método funcione, debes tener acceso SSH a tu servidor mediante contraseña.
Para utilizar la utilidad, debe especificar el host remoto al que desea conectarse y la cuenta de usuario a la que tiene acceso SSH con contraseña. Esta es la cuenta en la que se copiará su clave SSH pública.
La sintaxis es:
- ssh-copy-id username@remote_host
Es posible que veas un mensaje como este:
OutputThe 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 id_rsa.pub
clave que creamos anteriormente. Cuando encuentre la clave, le solicitará 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 keysusername@203.0.113.1's password:
Escriba la contraseña (no se mostrará lo que escriba por motivos de seguridad) y presione ENTER
. La utilidad se conectará a la cuenta en el host remoto utilizando la contraseña que proporcionó. Luego, copiará el contenido de su ~/.ssh/id_rsa.pub
clave en un archivo en el directorio de inicio de la cuenta remota ~/.ssh
llamado authorized_keys
.
Verá un resultado parecido a esto:
OutputNumber of key(s) added: 1Now 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 id_rsa.pub
clave se ha cargado en la cuenta remota. Puede continuar con la siguiente sección.
Copiar su clave pública mediante 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 usando un método SSH convencional.
Podemos hacer esto enviando el contenido de nuestra clave SSH pública a nuestra computadora local y enviándolo a través de una conexión SSH al servidor remoto. Por otro lado, podemos asegurarnos de que el ~/.ssh
directorio exista bajo la cuenta que estamos usando y luego enviar el contenido que enviamos 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í:
- cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh cat ~/.ssh/authorized_keys"
Es posible que veas un mensaje como este:
OutputThe 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 te solicitará la contraseña de la cuenta a la que intentas conectarte:
Outputusername@203.0.113.1's password:
Después de introducir su contraseña, el contenido de su id_rsa.pub
clave se copiará al final del authorized_keys
archivo de la cuenta del usuario remoto. Continúe con la siguiente sección si la operación se realizó correctamente.
Copiar su clave pública manualmente
Si no tiene acceso SSH basado en contraseña a su servidor, tendrá que realizar el proceso anterior manualmente.
El contenido de su id_rsa.pub
archivo deberá agregarse ~/.ssh/authorized_keys
de alguna manera a un archivo en su máquina remota.
Para mostrar el contenido de su id_rsa.pub
clave, escriba esto en su computadora local:
- cat ~/.ssh/id_rsa.pub
Verá el contenido de la clave, que puede verse así:
~/.ssh/id_rsa.pub
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 mediante cualquier método que tenga disponible. Puede ser una consola basada en web proporcionada por su proveedor de infraestructura.
Nota: si está utilizando un Droplet de DigitalOcean, consulte la documentación de nuestra Consola de recuperación en la documentación del producto DigitalOcean .
Una vez que tenga acceso a su cuenta en el servidor remoto, debe asegurarse de que ~/.ssh
se haya creado el directorio. Este comando creará el directorio si es necesario o no hará nada si ya existe:
- mkdir -p ~/.ssh
Ahora, puedes crear o modificar el authorized_keys
archivo dentro de este directorio. Puedes agregar el contenido de tu id_rsa.pub
archivo al final del authorized_keys
archivo, creándolo si es necesario, usando esto:
- echo public_key_string ~/.ssh/authorized_keys
En el comando anterior, sustituya el public_key_string
por el resultado del cat ~/.ssh/id_rsa.pub
comando que ejecutó en su sistema local. Debe comenzar con ssh-rsa AAAA...
o algo similar.
Si esto funciona, puedes continuar para probar tu nueva autenticación SSH basada en clave.
Paso 3: Autenticación en su servidor mediante claves SSH
Si ha completado 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 básicamente el mismo:
- ssh username@remote_host
Si es la primera vez que se conecta a este host (si utilizó el último método mencionado anteriormente), es posible que vea algo como esto:
OutputThe 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. Escriba yes
y luego presione ENTER
para continuar.
Si no proporcionó una contraseña para su clave privada, iniciará sesión inmediatamente. Si proporcionó una contraseña para la clave privada cuando creó la clave, se le solicitará que la ingrese ahora. Luego, se creará una nueva sesión de shell para usted con la cuenta en el sistema remoto.
Si tiene éxito, continúe para descubrir 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 mediante SSH sin 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 sigue activo, lo que significa que su servidor sigue expuesto a ataques de fuerza bruta.
Antes de completar los pasos de esta sección, asegúrese de que tiene configurada la autenticación basada en clave SSH para la cuenta raíz en este servidor o, preferiblemente, de que tiene configurada la autenticación basada en clave SSH para una cuenta en este servidor con sudo
acceso. Este paso bloqueará los inicios de sesión basados en contraseña, por lo que es esencial asegurarse 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 sudo
privilegios. Abra el archivo de configuración del demonio SSH:
- sudo nano /etc/ssh/sshd_config
Dentro del archivo, busque una directiva llamada PasswordAuthentication
. Puede que esté comentada. Quite los comentarios de la línea eliminando cualquier #
al principio de la misma y establezca el valor en no
. Esto deshabilitará su capacidad de iniciar sesión a través de SSH usando contraseñas de cuenta:
/etc/ssh/sshd_config
PasswordAuthentication no
Guarde y cierre el archivo cuando haya terminado. Para implementar los cambios que acabamos de realizar, debe reiniciar el servicio.
En la mayoría de las distribuciones de Linux, puedes ejecutar el siguiente comando para hacerlo:
- sudo systemctl restart ssh
Después de completar este paso, habrá realizado con éxito la transición de su demonio SSH para que solo responda a claves SSH.
Conclusión
Ahora deberías tener la autenticación basada en clave SSH configurada y ejecutándose en tu servidor, lo que te permitirá iniciar sesión sin proporcionar una contraseña de cuenta. A partir de aquí, hay muchas direcciones que puedes seguir. Si quieres aprender más sobre cómo trabajar con SSH, consulta nuestra guía de conceptos básicos de SSH .
Deja una respuesta