Contenido

Seguridad en tu VPS

Acabas de alquilar tu primera VPS o servidor virtual privado y estás ansioso por usarla. Todos hemos estado ahí, pero lo primero que debes hacer es configurarlo para que solo tú puedas acceder.

Actualizar el sistema

Algo fundamental es asegurarnos de que nuestro servidor siempre tiene las últimas actualizaciones disponibles. Para ello, lo primero que conviene hacer es:

En Ubuntu:

sudo apt update
sudo apt upgrade

En RedHat / Fedora:

sudo dnf upgrade

Desactivar el acceso mediante root

Vamos a hacer que no se pueda acceder desde el exterior al usuario root, que es el usuario de administración del sistema.

Abrimos el archivo de configuración de SSH:

sudo nano /etc/ssh/sshd_config

Buscamos la línea que dice PermitRootLogin yes y lo cambiamos a PermitRootLogin no. Si vemos que la línea está comentada (con #) la descomentamos. Ahora pulsamos control + s para guardar y control + x para salir.

Puede ser que en vez de PermitRootLogin yes diga PermitRootLogin prohibit-password.

En este punto habría que reiniciar el servicio SSH, pero como vamos a hacer cambios al archivo más adelante lo haremos al final.


Autenticación mediantes claves pública/privada

Hay varios métodos para iniciar sesión mediante SSH en una VPS, siendo el uso de contraseñas la más común. No obstante, gracias a la potencia de computación de algunos ordenadores actuales, es relativamente sencillo acceder por fuerza bruta si no tenemos una contraseña robusta.

Un método de autenticación alternativo es mediante pares de claves públicas/privadas. Estas son dos llaves criptográficas que dependen de complicados problemas matemáticos, más en concreto, de los números primos. Está compuesto por dos partes, una clave pública que se puede compartir sin ningún problema y que se puede usar para encriptar comunicaciones o comprobar la autenticidad de un mensaje, archivo, etc., y por otra parte está la clave privada, que nos permite como individuos identificarnos o desencriptar las comunicaciones previamente mencionadas.

Crear una clave

Para crear la clave vamos a utilizar nuestro ordenador personal.

Debemos usar el comando:

ssh-keygen -t ed25519

Deberías ver algo como esto:

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):

Si quieres, puedes introducir una contraseña para encriptar la clave. Es recomendable hacerlo si lo estás haciendo en un portátil o cualquier otro dispositivo que vayas a transportar habitualmente.

Estamos generando una clave de curva elíptica ed25519, considerado el mejor estándar de seguridad actualmente. No obstante, si tu VPS es muy antigua y no puede trabajar con dicha clave, puedes generar una clave RSA de 4096 bits, que también proporcionará una excelente protección.

ssh-keygen -t rsa -b 4096

Copiar la clave al servidor

Una vez generada la clave (recuerda, hemos generado el par de llaves) tenemos que transferir la pública a nuestro servidor.

Lo primero que hay que hacer es buscar la IP del servidor. Podemos hacerlo con el comando ifconfig.

Para transferir la llave podemos hacer:

ssh-copy-id nombre_de_usuario@ip_server

Por ejemplo: ssh-copy-id usuario@192.168.1.173

Comprueba que puedes acceder con ssh nombre_de_usuario@ip_server

Desactivar el acceso por contraseña

Ahora deberías ser capaz de conectarte al servidor sin introducir la contraseña. Sin embargo, aún se pueden realizar ataques de fuerza bruta, por lo que vamos a desactivar el acceso al servidor mediante contraseña.

Una vez dentro de la VPS vamos a editar el archivo de configuración de SSH.

sudo nano /etc/ssh/sshd_config

Vamos a pulsar control + w y a buscar PasswordAuthentication.

Borra el comentario (el #) de la línea que dice #PasswordAuthentication yes y cambia yes por no.

Debería quedar de esta manera: PasswordAuthentication no.

Ahora pulsamos control + s para guardar y control + x para salir. De nuevo, habría que reiniciar el servicio de SSH con el comando que veremos en el siguiente punto, pero nosotros lo haremos al final.


Cambiar el puerto de acceso

Por defecto, el puerto de acceso mediante SSH es el 22. Cambiar el puerto no nos va a proporcionar más seguridad como tal, pero sí que va a reducir el número de intentos de conexiones malignas que podemos recibir.

Nuevamente, editamos el archivo de SSH:

sudo nano /etc/ssh/sshd_config

Y buscamos la línea que dice Port 22. Si está comentada, la descomentamos y cambiamos el 22 por un puerto arbitrario, como puede ser el 8122. Guardamos con control + s y salimos con control + x.

Por último, vamos a reiniciar el servicio de SSH para aplicar los cambios de todos los pasos anteriores con el comando:

En Ubuntu:

sudo service ssh restart

En RedHat/Fedora:

sudo systemctl restart sshd

Después de todos estos pasos, podremos acceder al servidor con ssh usuario@ip:puerto.


Configurar el firewall

El firewall es esencial a la hora de bloquear conexiones no deseadas a nuestro servidor. Habitualmente hay bots escaneando todos los puertos de una cantidad inmensa de IPs. Si encuentran puertos abiertos, intentan atacarlos, pudiendo ralentizar el sistema.

Primero vamos a instalar UFW, un firewall para Linux muy sencillo de usar.

En Ubuntu:

sudo apt install ufw2

En RedHat/Fedora:

sudo dnf install ufw

En Fedora, quizá también necesites desactivar FirewallD.

sudo systemctl stop firewalld
sudo systemctl disable firewalld

Utilizar IPv6

Si tu servidor utiliza IPv6, puedes activarlo desde el archivo de configuración de UFW:

sudo nano /etc/default/ufw

Busca y asegúrate de que en la línea donde pone IPV6= hay un yes, tal que quede IPV6=yes. Guarda y sal del archivo.

Configurar las políticas predeterminadas

Para partir de una base común, vamos a permitir todo el tráfico saliente y a rechazar el entrante.

sudo ufw default deny incoming
sudo udw default allow outgoing

También queremos habilitar todas las conexiones internas del servidor:

sudo ufw insert 1 allow in on lo0

Habilitar conexiones mediante SSH

Antes de seguir, queremos asegurarnos de que activamos correctamente el tráfico en el puerto de SSH que activamos previamente, pues no queremos perder el acceso a nuestro servidor.

sudo ufw allow PUERTO

Donde “PUERTO” es nuestro puerto de SSH configurado en el paso anterior. Por ejemplo: sudo ufw allow 8122.

Habilitar el firewall

Antes de continuar, conviene consultar las reglas configuradas:

sudo ufw status verbose

Finalmente, y si todo parece correcto, solo queda habilitar UFW:

sudo ufw enable

Verás una advertencia en pantalla explicando que se podría perder el acceso mediante SSH. Si todo está bien configurado no debería haber ningún problema. Pulsamos y y ENTER.

Tras este paso, el firewall queda activo. Puedes consultar más comandos en esta guía de Digital Ocean.


Instalar Fail2Ban (opcional)

Fail2Ban analiza los intentos de conexión al servidor y banea temporalmente aquellas IPs que han fallado varias veces consecutivas.

Comenzamos instalando el programa.

En Ubuntu:

sudo apt install fail2ban

En RedHat/Fedora:

sudo dnf install epel-release fail2ban
Notas para RedHat/Fedora

Deberás arrancar el servicio por ti mismo, ya que no lo hace de forma automática:

sudo systemctl start fail2ban
sudo systemctl enable fail2ban

Si obtienes el siguiente error: no directory /var/run/fail2ban to contain the socket file /var/run/fail2ban/fail2ban.sock créalo manualmente con el comando sudo mkdir /var/run/fail2ban.

Para comprobar que Fail2Ban está funcionando, podemos usar el comando fail2ban-client -h. Si obtenemos un mensaje de ayuda es que todo funciona como debería.

Podemos modificar el archivo de configuración para alterar algunos parámetros.

Primero vamos a crear un archivo de configuración local con:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Ahora podemos empezar a modificarlo:

sudo nano /etc/fail2ban/jail.local

Si estás usando RedHat o Fedora necesitas cambiar el parámetro backend de auto a systemd. Esto no es necesario en Ubuntu a pesar de que también usa systemd.

Para proteger el acceso por SSH, vamos a buscar estas líneas y a descomentarlas (o a añádirlas si no están):

[sshd]
enabled = true
port=TU_PUERTO
filter=sshd
maxretry=4
bantime=120

Asegúrate de que en port pones el puerto que configuramos en el paso anterior.

Las opciones maxretry y bantime se corresponden, respectivamente, al número de intentos seguidos fallidos permitidos y al tiempo, en segundos, por el que quedará bloqueado el acceso a la IP atacante.

También existe la opción de nunca banear ciertas IPs, pero esto solo es útil si tu proveedor de internet te proporciona una IP estática.

Para teminar, solo falta guardar los cambios del archivo (control + s y control + x) y reiniciar Fail2Ban:

sudo systemctl restart fail2ban

¡Listo!
Tras todos estos pasos hemos configurado nuestra VPS para que sea lo más segura posible.