Introducción
SSH, o shell seguro, es un protocolo encriptado que se utiliza para administrar y comunicarse con los servidores. Cuando se trabaja con un servidor Linux, lo más probable es que pase la mayor parte de su tiempo en una sesión de terminal conectada a su servidor a través de SSH.
Aunque hay algunas formas diferentes 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, pero extremadamente segura de iniciar sesión en su servidor. Por esta razón, este es el método que recomendamos para todos los usuarios.
¿Cómo funcionan las claves SSH?
Un servidor SSH puede autenticar a los clientes utilizando una variedad de métodos diferentes. El más básico de ellos es la autenticación por contraseña, que es fácil de usar, pero no es el más seguro.
Aunque las contraseñas se envían al servidor de forma segura, generalmente no son lo suficientemente complejas o largas como para ser resistentes a atacantes repetidos y persistentes. La potencia de procesamiento moderna, combinada con scripts automatizados, hace que la fuerza bruta de una cuenta protegida por contraseña sea muy posible. Aunque existen otros métodos para añadir seguridad adicional (fail2ban
, etc.), las claves SSH demuestran ser una alternativa fiable y segura.
Los pares de claves SSH son dos claves criptográficamente seguras que pueden utilizarse 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 la conserva el cliente y debe mantenerse en absoluto secreto. Cualquier compromiso de 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 precaución adicional, la clave puede cifrarse 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 utilizarse para cifrar mensajes que sólo la clave privada puede descifrar. Esta propiedad se emplea como una forma de autenticación utilizando el par de claves.
La clave pública se sube a un servidor remoto al que se quiere poder acceder con SSH. La clave se añade a un archivo especial dentro de la cuenta de usuario con la que se va a iniciar la sesión, llamado ~/.ssh/authorized_keys
.
Cuando un cliente intenta autenticarse usando claves SSH, el servidor puede probar al cliente 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.
Cómo crear claves SSH
El primer paso para configurar la autenticación con claves SSH en su servidor es generar un par de claves SSH en su equipo local.
Para ello, podemos utilizar 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, que está bien para la mayoría de los usos.
En su equipo local, genere un par de claves SSH escribiendo:
ssh-keygen
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. Por defecto, las claves se almacenarán en el directorio ~/.ssh
dentro del directorio principal de tu 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. Hacerlo 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 el valor predeterminado.
Si había generado previamente un par de claves SSH, puede ver un aviso que se parece a esto:
/home/username/.ssh/id_rsa already exists.Overwrite (y/n)?
Si elige sobrescribir la clave en el disco, ya no podrá autenticarse utilizando la clave anterior. Ten mucho cuidado cuando selecciones el sí, ya que se trata de un proceso destructivo que no se puede revertir.
Created directory '/home/username/.ssh'.Enter passphrase (empty for no passphrase):Enter same passphrase again:
A continuación, se te pedirá que introduzcas una frase de contraseña para la clave. Se trata de una frase de contraseña opcional que se puede utilizar para cifrar el archivo de la clave privada en el disco.
Tal vez se pregunte qué ventajas ofrece una clave SSH si todavía tiene que 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 sólo se utiliza 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á las claves privadas que no se guarden en directorios restringidos. La propia clave también debe tener permisos restringidos (lectura y escritura sólo disponibles para el propietario). Esto significa que otros usuarios del sistema no pueden fisgonear.
- Cualquier atacante que quiera descifrar la frase de contraseña de la clave privada SSH debe tener ya acceso al sistema. Esto significa que ya tendrán acceso a su cuenta de usuario o a la cuenta de root. Si se encuentra en esta posición, la frase de contraseña puede evitar que el atacante inicie inmediatamente la sesión 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 los permisos de archivo, este archivo nunca debería ser accesible para nadie más que usted (y el usuario root). 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 introduce una, tendrá que proporcionarla cada vez que utilice esta clave (a menos que esté ejecutando un software de agente SSH que almacene la clave descifrada). Recomendamos el uso de una frase de contraseña, pero si no desea establecer una frase de contraseña, puede simplemente presionar ENTER para omitir esta solicitud.
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_hostThe key's randomart image is:+------+| ..o || E o= . || o. o || .. || ..S || o o. || =o.+. ||. =++.. ||o=++. |+-----------------+
Ahora tiene una clave pública y privada que puede utilizar para autenticar. El siguiente paso es colocar la clave pública en su servidor para que pueda utilizar la autenticación de clave SSH para iniciar sesión.
Cómo incrustar su clave pública al crear su servidor
Si está iniciando un nuevo servidor de DigitalOcean, puede incrustar automáticamente su clave pública SSH en la cuenta raíz de su nuevo servidor.
Al final de la página de creación de Droplet, hay una opción para añadir claves SSH a tu servidor:
Si ya has añadido un archivo de clave pública a tu cuenta de DigitalOcean, lo verás aquí como una opción seleccionable (hay dos claves existentes en el ejemplo anterior: «Clave de trabajo» y «Clave de casa»). Para incrustar una clave existente, simplemente haz clic en ella y se resaltará. Puede incrustar varias claves en un solo servidor:
Si aún no tiene una clave SSH pública cargada en su cuenta, o si desea añadir una nueva clave a su cuenta, haga clic en el botón «+ Añadir clave SSH». Esto se expandirá a un aviso:
En el cuadro «Contenido de la clave SSH», pegue el contenido de su clave pública SSH. Suponiendo que hayas generado tus claves con el método anterior, puedes obtener el contenido de tu clave pública en tu ordenador local escribiendo:
cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNqqi1mHLnryb1FdbePrSZQdmXRZxGZbo0gTfglysq6KMNUNY2VhzmYN9JYW39yNtjhVxqfW6ewc+eHiL+IRRM1P5ecDAaL3V0ou6ecSurU+t9DR4114mzNJ5SqNxMgiJzbXdhR+j55GjfXdk0FyzxM3a5qpVcGZEXiAzGzhHytUV51+YGnuLGaZ37nebh3UlYC+KJev4MYIVww0tWmY+9GniRSQlgLLUQZ+FcBUjaqhwqVqsHe4F/woW1IHe7mfm63GXyBavVc+llrEzRbMO111MogZUcoWDI9w7UIm8ZOTnhJsk7jhJzG2GpSXZHmly/a/buFaaFnmfZ4MYPkgJD [email protected]
Pega este valor, en su totalidad, en la casilla más grande. En el cuadro «Comentario (opcional)», puede elegir una etiqueta para la clave. Esto se mostrará como el nombre de la clave en la interfaz de DigitalOcean:
Cuando crees tu Droplet, las claves públicas SSH que hayas seleccionado se colocarán en el archivo ~/.ssh/authorized_keys
de la cuenta del usuario root. Esto le permitirá iniciar sesión en el servidor desde el equipo con su clave privada.
Cómo copiar una clave pública en su servidor
Si ya tiene un servidor disponible y no incrustó claves al crearlo, aún puede subir 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 de los detalles de su configuración actual. Todos los métodos siguientes producen el mismo resultado final. El método más fácil y automatizado es el primero y los que siguen requieren pasos manuales adicionales si no puede utilizar los métodos anteriores.
Copiar su clave pública utilizando SSH-Copy-ID
La forma más fácil 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 herramienta ssh-copy-id
está incluida en los paquetes de OpenSSH en muchas distribuciones, por lo que es posible que la tengas disponible en tu sistema local. Para que este método funcione, ya debe tener acceso SSH con contraseña a su servidor.
Para utilizar la utilidad, sólo tiene que 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 pública SSH.
La sintaxis es:
ssh-copy-id username@remote_host
Es posible que vea un mensaje como este:
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 sólo significa que su equipo local no reconoce el host remoto. Esto ocurrirá la primera vez que te conectes a un nuevo host. Escriba «sí» y pulse 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 pedirá 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 [email protected]'s password:
Escriba la contraseña (lo que escriba no se mostrará por motivos de seguridad) y pulse ENTER. La utilidad se conectará a la cuenta en el host remoto usando la contraseña que usted proporcionó. A continuación, copiará el contenido de su clave ~/.ssh/id_rsa.pub
en un archivo en el directorio principal de la cuenta remota ~/.ssh
llamado authorized_keys
.
Verás una salida parecida a esta:
Number of key(s) added: 1Now try logging into the machine, with: "ssh '[email protected]'"and check to make sure that only the key(s) you wanted were added.
En este punto, tu id_rsa.pub
clave ha sido cargada en la cuenta remota. Puedes continuar con la siguiente sección.
Copiando tu clave pública usando SSH
Si no tienes ssh-copy-id
disponible, pero tienes acceso SSH con contraseña a una cuenta de tu servidor, puedes subir tus claves usando un método SSH convencional.
Podemos hacer esto sacando el contenido de nuestra clave pública SSH en nuestro ordenador local y canalizándolo a través de una conexión SSH al servidor remoto. En el otro lado, podemos asegurarnos de que el directorio ~/.ssh
existe bajo la cuenta que estamos utilizando y, a continuación, dar salida al contenido que hemos canalizado en un archivo llamado authorized_keys
dentro de este directorio.
Usaremos el símbolo de redirección >>
para añadir el contenido en lugar de sobrescribirlo. Esto nos permitirá añadir claves sin destruir las claves añadidas anteriormente.
El comando completo tendrá este aspecto:
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Es posible que veas un mensaje como este:
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 sólo significa que tu ordenador local no reconoce el host remoto. Esto ocurrirá la primera vez que te conectes a un nuevo host. Escriba «sí» y pulse ENTER para continuar.
Después, se le pedirá la contraseña de la cuenta a la que está intentando conectarse:
[email protected]'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 esto fue exitoso.
Copiando su Clave Pública Manualmente
Si no tiene disponible el acceso SSH con contraseña a su servidor, tendrá que hacer el proceso anterior manualmente.
El contenido de su archivo id_rsa.pub
tendrá que ser añadido a un archivo en ~/.ssh/authorized_keys
en su máquina remota de alguna manera.
Para mostrar el contenido de tu id_rsa.pub
clave, escribe esto en tu ordenador local:
cat ~/.ssh/id_rsa.pub
Verás el contenido de la clave, que puede ser algo parecido a esto:
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
Accede a tu host remoto usando cualquier método que tengas disponible. Por ejemplo, si tu servidor es un Droplet de DigitalOcean, puedes acceder usando la consola web del panel de control:
Una vez que tengas acceso a tu cuenta en el servidor remoto, debes asegurarte de que el directorio ~/.ssh
esté creado. Este comando creará el directorio si es necesario, o no hará nada si ya existe:
mkdir -p ~/.ssh
Ahora, puedes crear o modificar el archivo authorized_keys
dentro de este directorio. Puedes añadir el contenido de tu archivo id_rsa.pub
al final del archivo authorized_keys
, creándolo si es necesario, usando esto:
echo public_key_string >> ~/.ssh/authorized_keys
En el comando anterior, sustituye el public_key_string
por la salida del comando cat ~/.ssh/id_rsa.pub
que ejecutaste en tu sistema local. Debe comenzar con ssh-rsa AAAA...
.
Si esto funciona, puede pasar a intentar autenticarse sin contraseña.
Autenticarse en su servidor utilizando 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 básico es el mismo:
ssh username@remote_host
Si es la primera vez que se conecta a este host (si utilizó el último método anterior), puede ver 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 sólo significa que su equipo local no reconoce el host remoto. Escriba «sí» y pulse ENTER para continuar.
Si no ha suministrado una frase de contraseña para su clave privada, se iniciará la sesión inmediatamente. Si proporcionó una frase de contraseña para la clave privada cuando creó la clave, se le pedirá que la introduzca ahora. Después, se debería generar 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.
Desactivación de la autenticación por contraseña en su servidor
Si pudo iniciar sesión en su cuenta utilizando SSH sin una contraseña, ha configurado con éxito la autenticación basada en clave SSH para su cuenta. Sin embargo, su mecanismo de autenticación basado en contraseñas 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 claves SSH para la cuenta raíz de este servidor o, preferiblemente, que tiene configurada la autenticación basada en claves SSH para una cuenta de este servidor con sudo
acceso. Este paso bloqueará los inicios de sesión basados en contraseñas, por lo que es esencial asegurarse de que aún podrá obtener acceso administrativo.
Una vez que las condiciones anteriores sean ciertas, 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
. Es posible que esté comentada. Descomente la línea y ponga el valor en «no». Esto deshabilitará su capacidad para iniciar sesión a través de SSH utilizando las contraseñas de las cuentas:
PasswordAuthentication no
Guarda y cierra el archivo cuando hayas terminado. Para aplicar realmente los cambios que acabamos de hacer, debes reiniciar el servicio.
En máquinas Ubuntu o Debian, puedes emitir este comando:
sudo service ssh restart
En máquinas CentOS/Fedora, el demonio se llama sshd
:
sudo service sshd restart
Después de completar este paso, has hecho una transición exitosa de tu demonio SSH para que sólo responda a claves SSH.
Conclusión
Ahora debería tener la autenticación basada en claves SSH configurada y funcionando en su servidor, permitiéndole iniciar sesión sin proporcionar una contraseña de cuenta. A partir de aquí, hay muchas direcciones a las que puedes dirigirte. Si quieres aprender más sobre cómo trabajar con SSH, echa un vistazo a nuestra guía de fundamentos de SSH.