Pirobits
  

Cómo configurar un servidor SSH seguro en Linux

alberto avatar Alberto Sola · 6/7/2021 · 5 min

En este post quiero mostrar algunos consejos sobre configurar un servidor SSH. Vamos a ver la configuración mínima que todos deberíamos utilizar tras instalar un servidor SSH, para incrementar la seguridad de nuestro servidor y evitar sustos.

Antes de empezar, probablemente estés pensando: "Mi servidor SSH es seguro por defecto, nadie me va a atacar...". A continuación te muestro el log de una Raspberry Pi con un servidor SSH público en el puerto por defecto (22).

Feb 4 20:21:42 raspberrypi sshd[31344]: Invalid user guest from A.B.C.D port 53573
Feb 4 20:21:42 raspberrypi sshd[31344]: Connection closed by invalid user guest A.B.C.D port 53573 [preauth]
Feb 4 20:21:42 raspberrypi sshd[31349]: Invalid user odroid from A.B.C.D port 53896
Feb 4 20:21:43 raspberrypi sshd[31349]: Connection closed by invalid user odroid A.B.C.D port 53896 [preauth]
Feb 4 20:21:43 raspberrypi sshd[31354]: Invalid user ftp from A.B.C.D port 54161
Feb 4 20:21:43 raspberrypi sshd[31354]: Connection closed by invalid user ftp A.B.C.D port 54161 [preauth]
Feb 4 20:21:44 raspberrypi sshd[31360]: Invalid user chester from A.B.C.D port 54447
Feb 4 20:21:44 raspberrypi sshd[31360]: Connection closed by invalid user chester A.B.C.D port 54447 [preauth]
Feb 4 20:21:45 raspberrypi sshd[31366]: Connection closed by authenticating user root A.B.C.D port 54881 [preauth]
Feb 4 20:21:46 raspberrypi sshd[31369]: Invalid user orangepi from A.B.C.D port 55127
Feb 4 20:21:46 raspberrypi sshd[31369]: Connection closed by invalid user orangepi A.B.C.D port 55127 [preauth]

Como se ve en el log, hay muchos ataques por fuerza bruta en menos de un minuto...

Para el tutorial he utilizado Ubuntu, pero la configuración o los comandos van a ser muy parecidos para cualquier sistema. Vamos a empezar.

Instalación

Si ya tienes un servidor SSH instalado, puedes pasar al siguiente apartado.

Normalmente el daemon sshd se puede añadir por defecto en Ubuntu server. Lo primero es comprobar si ya lo tenemos instalado con el siguiente comando:

sudo systemctl status sshd

Si el servicio se está ejecutando, la salida será parecida a esto:

● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enab
Active: active (running) since Fri 2020-03-06 08:54:01 CET; 4 days ago
Main PID: 1459 (sshd)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/ssh.service
└─1459 /usr/sbin/sshd -D

En otro caso la salida será esta:

Unit sshd.service could not be found.

Pero no te preocupes, puedes instalarlo fácilmente ejecutando este comando:

$ sudo apt update
$ sudo apt install openssh-server

Una vez termine la instalación, puedes comprobar que el servicio se está ejecutando, utilizando los comandos que has aprendido anteriormente.

Si utilizas un firewall, como ufw u otro que te ofrezca tu proveedor cloud, no te olvides de abrir el puerto para el servidor SSH. Por defecto es el 22, pero es recomendable moverlo.

Configuración

La configuración del servidor SSH se encuentra en /etc/ssh/sshd_config. Puedes editar este archivo utilizando tu editor favorito, como vim o nano.

⚠️ Precacuión: si reinicias el servicio después de editar la configuración, corres el peligro de "dejarte las llaves dentro de casa", y no podrás volver a entrar. Para que esto no ocurra, deberías:

  • Añadir una regla a tu firewall para permitir conexiones en el puerto "121314" (o el que hayas elegido).
  • Generar una pareja de claves ssh con el comando ssh-keygen en tu ordenador. Por defecto genera dos archivos: una clave privada ~/.ssh/id_rsa y otra pública ~/.ssh/id_rsa.pub.
  • Añadir tu clabe pública al fichero ~/.ssh/authorized_keys de tu servidor. Puedes hacerlo manualmente, añadiendolo al final, o mediante el comando $ ssh-copy-id -i ~/.ssh/id_rsa <my user>@<my server ip or host>.

Vamos a editar el archivo de configuración:

sudo nano /etc/ssh/sshd_config

Las opciones que deberías cambiar son las siguientes:

Port 121314
PermitRootLogin no
PasswordAuthentication no

Explicación:

  • Puerto que utiliza el servidor. Por defecto utiliza el 22, pero deberías utilizar alguno otro que esté libre, por ejemplo "121314".
  • Deshabilitar inicio de sesión al usuario root.
  • Deshabilitar inicio de sesión mediante contraseña. Sólo podrás acceder utilizando tu pareja de claves pública/privada. ¡No las pierdas!

Guarda y habrás terminado. Ahora hay que reiniciar el servicio sshd ejecutando:

$ sudo systemctl restart sshd

Ahora podemos intentar conectarnos al servidor con nuestro usuarios:

$ ssh -p 121314 <myuser>@<my server ip or host>

⚠️ Preacución: si el servidor es una máquina virtual (VM) en un servidor cloud, normalmente te dan una clave para que accedas en formato pem. Recuerda guardar este archivo en un lugar seguro, pero que no vayas a perder, y considera cambiar el usuario a uno que no sea ubuntu o root, ya que suelen ser de los más comunes ante un ataque.

¿Fácil no? Estos son los primeros pasos para tener un servidor más seguro 💪

Otras medidas de seguridad

Esta parte está fuera del ámbito del post, pero me gustaría al menos mencionarla para que seas consciente de otras medidas de seguridad:

No utilices el usuario por defecto: ubuntu, root, wordpress... son comunes en ataques por fuerza bruta.

Cuando expones tu servidor a internet, deberías configurar un firewall para permitir únicamente que ciertas IPs accedan a algunos puertos. Es una medida se seguridad que nos permite tener un servidor algo más seguro, ya que limitamos el acceso de un posible atacante a algunos servicios que, en teoría, tenemos controlados y actualizamos cada cierto tiempo.

El servicio sshd escribe los logs en el fichero /var/log/auth.log. Deberías echarle un vistazo de ver en cuando, y rotarlo de forma que no crezca de tamaño indefinidamente. Posiblemente encuentres otros ficheros como auth.log.1 o auth.log.2 dentro del mismo directorio. Esto es gracias al comando logrotate, que hace esta tarea por nosotros. Puedes ver su documentación aquí.

La herramienta fail2ban te permite prohibir conexiones a IPs que intenten acceder a tu servidor, puedes ver su documentación aquí.

Resumen

En este post has aprendido por qué es importante configurar correctamente un servidor SSH público. Además hay otras medidas de seguridad como añadir un firewall o comprobar los logs, pero quedan fuera del ámbito de este post. Intentaré hablar sobre esto en un futuro.

Si te ha resultado útil este artículo agradecería si te suscribes a mi newsletter. Recibirás contenido exclusivo de calidad y también me ayudarás enormemente. Cada suscripción apoya el trabajo que realizo y me permite conocer mejor los temas que te interesan, de forma que puedo mejorar los conocimientos que comparto contigo.


Posts recientes