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
digaPermitRootLogin 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
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 comandosudo 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