VPS 2: Let's Setup
Posted on January 28, 2025 • 9 minutes • 1826 words • Other languages: English
Esta es la segunda parte de mi VPS blog series .
- Elegí un proveedor de VPS
- Elegí un plan que se adapte a ti
- Elegí un sistema operativo
- Configurá contraseña y SSH
- Agregá una nueva cuenta de usuario
- Apuntá un registro DNS al servidor (Obtener un dominio)
- Fortalecé SSH
- Actualizaciones de paquetes del sistema
- ¿Deberíamos crear un firewall ahora?
- Acerca de Cloud Init
- Siguiente lectura
Elegí un proveedor de VPS
Al elegir un proveedor de VPS, te vas a dar cuenta rápido que no faltan opciones. Sin embargo, tres nombres que vas a ver frecuentemente en reseñas, foros y recomendaciones son:
- A2 Hosting : Conocido por sus servidores optimizados para velocidad y herramientas amigables para desarrolladores.
- Hetzner : Un proveedor europeo económico con una sólida reputación por su fiabilidad.
- Hostinger : Ofrece planes accesibles con una interfaz amigable, ideal para quienes recién comienzan.
No hay una “mala” elección acá. La decisión debería depender de tus necesidades específicas, como presupuesto, ubicación del servidor, expectativas de soporte y requerimientos de escalabilidad.
Yo elegí Hostinger porque dos de mis creadores de contenido de programación favoritos lo usaron en el pasado.
Dreams of Code
Web Dev Cody
Elegí un plan que se adapte a ti
Gracias a mi empleador actual Devsu , conseguí el plan KVM2 por dos años, el cual, para los proyectos personales que tengo en mente, ofrece capacidades técnicas lo suficientemente buenas.
Podés usar mi código de cupón de creador de contenido… Nah, no estoy patrocinado, ¡ojalá! (Hostinger, ¡mandame un mensaje!)
- Tip: Andá a YouTube, buscá “Hostinger VPS”, ordená los resultados por fecha para ver videos recientes y, probablemente, si el video es una buena reseña de un creador con muchos suscriptores, posiblemente tengan un cupón que podés usar. Un 10% de descuento siempre viene bien.
Elegí un sistema operativo
Después de obtener la instancia, se te pide que elijas un OS: en esta serie de blogs vamos con Ubuntu 24.04, ya que es uno de los sistemas operativos más comunes al configurar un VPS.
Aclaración: yo no uso Arch, por cierto.
En la siguiente pantalla te ofrecen un escáner de malware. Déjalo activado, ya que parece liviano y es gratis.
Configurá contraseña y SSH
Después de elegir el OS, se te pedirá configurar una contraseña para el usuario root:
- Es importante agregar también una clave SSH para luego poder ingresar exclusivamente a través de SSH.
- Hostinger te dará instrucciones sobre cómo generar y agregar una clave SSH en caso de que no lo sepas.
Una vez terminado el set-up, esperá unos minutos para que la instancia VPS se inicie. Luego, probá ingresar mediante SSH.
ssh root@vps-instance-ip-address
Podés encontrar la dirección IP de tu VPS en la pantalla “Overview → VPS information”.
- En ejemplos futuros voy a usar mi dominio (que obtuve en el siguiente paso) en lugar de la dirección IP. Ambas opciones son completamente válidas.
Ahora que tenemos un VPS, ¿y qué sigue?
Agregá una nueva cuenta de usuario
Trabajar directamente como el usuario root en tu VPS está ampliamente desaconsejado por razones de seguridad y prácticas:
- Riesgos de seguridad: El usuario root tiene acceso sin restricciones a todo el sistema. Si se ve comprometido (por ejemplo, con un ataque de fuerza bruta o exposición accidental), los atacantes pueden causar estragos. Un usuario no-root limita el daño potencial al operar bajo el principio de menor privilegio.
- Cambios accidentales en el sistema: Un solo error tipográfico en un comando (como
rm -rf /
en lugar derm -rf ./
) puede eliminar archivos críticos si se ejecuta como root. Una cuenta de usuario regular actúa como salvaguarda contra errores catastróficos. - Rastreo de auditoría: Usar un usuario específico facilita el seguimiento de acciones en los logs, especialmente si varias personas acceden al servidor. La actividad de root es más difícil de atribuir a usuarios específicos, complicando la resolución de problemas.
- Fortalecimiento de SSH: La mayoría de los ataques se dirigen al usuario root vía SSH. Al deshabilitar el login root y usar claves SSH con una cuenta no-root, reducís la exposición de tu servidor a ataques de fuerza bruta.
- Requerimientos de aplicaciones: Algunas herramientas y servicios (por ejemplo, Docker) pueden negarse a correr como root por razones de seguridad. Una cuenta de usuario estándar garantiza compatibilidad con ese software.
Por lo tanto, vamos a crear una cuenta de usuario dedicada:
- Creá un usuario nuevo (por ejemplo,
adduser pollito
). - Otorgale privilegios sudo para tareas administrativas (
usermod -aG sudo pollito
). - Probá que funcione cambiando al nuevo usuario (
su - pollito
) y ejecutá un comando sudo de prueba (sudo ls /
).
Apuntá un registro DNS al servidor (Obtener un dominio)
Para conectar tu VPS a un nombre de dominio, necesitás configurar los registros DNS. Podés usar un dominio que ya tengas o comprar uno nuevo (Hostinger ofrece registro de dominios si preferís una solución todo en uno). Acá te explico cómo configurarlo:
- Prepará tu dominio
- Iniciá sesión en el panel de administración DNS de tu proveedor de dominio (por ejemplo, el dashboard de DNS de Hostinger).
- Eliminá cualquier registro A o CNAME existente ligado al dominio raíz (
@
otudominio.com
) que se haya generado automáticamente o que ya no necesites. Esos registros suelen apuntar a IP de prueba.
- Agregá un nuevo registro A
- Creá un nuevo registro A para el dominio raíz (
@
otudominio.com
). - Configurá el campo value o destination con la IP pública de tu VPS.
- Guardá el registro.
- Creá un nuevo registro A para el dominio raíz (
- Esperá la propagación: Los cambios en DNS pueden tardar hasta 24–48 horas en propagarse globalmente. Podés verificar el progreso usando herramientas como
dig tudominio.com
oping tudominio.com
(una vez que se haya propagado, debería resolver en la IP de tu VPS).
Nota: Evitá agregar registros CNAME o A no relacionados para el dominio raíz durante este proceso, ya que podrían generar conflictos con tu nueva configuración.
Fortalecé SSH
¿Por qué?
Bots automáticos escanean constantemente internet en busca de servidores SSH, intentando ataques de fuerza bruta usando credenciales comunes.
Visualización de viz.greynoise.io
Incluso podés chequear en tu VPS los intentos fallidos de login ejecutando:
sudo grep "Failed password" /var/log/auth.log
Acá se ve un breve ejemplo: se nota una IP maliciosa intentando forzar el acceso al VPS intentando conectar via SSH como distintos usuarios comunes en diferentes puertos.
2025-01-28T23:13:56.185011+00:00 srv705038 sshd[2491]: Failed password for invalid user admin from 51.20.5.208 port 44906 ssh2
2025-01-28T23:13:58.669177+00:00 srv705038 sshd[2493]: Failed password for invalid user admin from 51.20.5.208 port 44914 ssh2
2025-01-28T23:14:02.081755+00:00 srv705038 sshd[2495]: Failed password for invalid user admin from 51.20.5.208 port 44926 ssh2
2025-01-28T23:14:06.017747+00:00 srv705038 sshd[2497]: Failed password for invalid user admin from 51.20.5.208 port 44942 ssh2
2025-01-28T23:14:09.096008+00:00 srv705038 sshd[2499]: Failed password for invalid user admin from 51.20.5.208 port 43988 ssh2
2025-01-28T23:14:12.704576+00:00 srv705038 sshd[2501]: Failed password for invalid user admin from 51.20.5.208 port 44000 ssh2
2025-01-28T23:14:16.442531+00:00 srv705038 sshd[2503]: Failed password for invalid user admin from 51.20.5.208 port 53236 ssh2
2025-01-28T23:14:19.712289+00:00 srv705038 sshd[2505]: Failed password for invalid user admin from 51.20.5.208 port 53250 ssh2
2025-01-28T23:14:23.451288+00:00 srv705038 sshd[2507]: Failed password for invalid user admin from 51.20.5.208 port 53256 ssh2
2025-01-28T23:14:26.387938+00:00 srv705038 sshd[2509]: Failed password for invalid user admin from 51.20.5.208 port 57986 ssh2
2025-01-28T23:14:28.872091+00:00 srv705038 sshd[2511]: Failed password for invalid user admin from 51.20.5.208 port 57998 ssh2
2025-01-28T23:14:32.515499+00:00 srv705038 sshd[2515]: Failed password for invalid user pi from 51.20.5.208 port 58012 ssh2
2025-01-28T23:14:34.748936+00:00 srv705038 sshd[2517]: Failed password for invalid user ftp from 51.20.5.208 port 58020 ssh2
2025-01-29T12:44:07.296225+00:00 srv705038 sudo: pollito : TTY=pts/0 ; PWD=/home/pollito ; USER=root ; COMMAND=/usr/bin/grep 'Failed password' /var/log/auth.log
Para disminuir la superficie de ataque, vamos a fortalecer SSH.
Asegúrate de que tu usuario no root tenga tu clave pública
Si no, podríamos quedarnos sin acceso al servidor.
Copiá la clave pública SSH. Una forma sencilla de hacerlo es usando el comando ssh-copy-id
:
ssh-copy-id pollito@pollito.tech
- Asegurate de estar desconectado del VPS; tenés que hacerlo desde tu máquina local.
- Si estás en Windows, podés hacerlo usando Git Bash .
Ahora probá ingresar al VPS y verificá que todo funcione:
ssh pollito@pollito.tech
Deshabilitá el inicio de sesión con contraseña como usuario root
Idealmente, ahora querrías deshabilitar el acceso root:
- En este caso no podemos hacerlo porque una herramienta que usaremos más adelante (Coolify ) necesita poder conectarse remotamente al servidor como root.
- Existe una función experimental en la que podés ejecutar Coolify como usuario no-root . Sin embargo, no profundizaré en esa alternativa porque es experimental.
Entonces, en lugar de eso, vamos a deshabilitar el login por contraseña para el usuario root ejecutando los siguientes comandos:
- El usuario root solo podrá ingresar usando claves SSH (no contraseñas).
sudo sed -i -e '/^\(#\|\)PermitRootLogin/s/^.*$/PermitRootLogin without-password/' /etc/ssh/sshd_config
- Asegurate de que la autenticación por clave pública esté habilitada, necesaria para el login basado en SSH keys.
sudo sed -i -e '/^\(#\|\)PubkeyAuthentication/s/^.*$/PubkeyAuthentication yes/' /etc/ssh/sshd_config
- Deshabilitá la autenticación basada en contraseña, forzando el uso de claves SSH para el ingreso.
sudo sed -i -e '/^\(#\|\)PasswordAuthentication/s/^.*$/PasswordAuthentication no/' /etc/ssh/sshd_config
- Tenés que repetir el paso anterior en un archivo específico de Hostinger. Si tu VPS está en otro proveedor, podés omitirlo.
sudo sed -i -e '/^\(#\|\)PasswordAuthentication/s/^.*$/PasswordAuthentication no/' /etc/ssh/sshd_config.d/50-cloud-init.conf
- Reiniciá el servicio SSH (sshd) para que se apliquen los cambios.
sudo systemctl reload ssh
Actualizaciones de paquetes del sistema
Asegurate de que el sistema esté actualizado antes de continuar.
- Actualizá la lista de versiones de paquetes.
sudo apt update
- Actualizá todos los paquetes instalados.
sudo apt upgrade -y
Probablemente veás un mensaje indicando que algunos servicios y/o contenedores deben reiniciarse.
- Reiniciá el VPS:
sudo reboot
¿Deberíamos crear un firewall ahora?
Lo ideal sería que ahora crees un firewall:
- En este caso no podemos hacerlo porque, nuevamente, una herramienta que usaremos más adelante (Coolify ) expone su panel de administración vía HTTP en el puerto 8000 del VPS.
- Una vez que configuremos HTTPS y dominios (en el siguiente blog, ¡atentos!), crearemos un firewall.
Lo que podemos hacer ahora es agregar protección contra IP maliciosas. Vamos con Crowdsec .
Crowdsec
-
Ejecutá los comandos de instalación:
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash sudo apt-get install crowdsec
Ahora estamos detectando IPs maliciosas pero sin bloquearlas. Necesitamos instalar un bouncer.
-
Instalá un bouncer ejecutando estos comandos:
curl -s https://install.crowdsec.net | sudo sh sudo apt install crowdsec-firewall-bouncer-iptables
Ahora podés ver la tabla de IP bloqueadas:
cscli decisions list
Acerca de Cloud Init
Cuando provisionás un VPS, tareas como crear un usuario nuevo, fortalecer la seguridad (por ejemplo, configurar claves SSH, firewall) e instalar actualizaciones del sistema son pasos repetitivos pero críticos. Cloud Init existe para automatizar estos procesos.
- Al definir un archivo YAML de cloud-config, podés programar la creación de usuarios, actualizaciones de paquetes, políticas de seguridad y más, asegurando consistencia en todos los despliegues.
Sé que en Hetzner es posible, como se muestra en este tutorial, minuto 2:59 “Create a VPS with Hetzner and Set Up with Cloud Config”
Sin embargo, las ofertas de VPS de Hostinger (al momento de escribir) no soportan nativamente Cloud Init. Pueden existir alternativas, pero no investigué a fondo.