Guía

Los primeros 30 minutos: lista de verificación de endurecimiento de VPS

Un VPS nuevo recibe su primer sondeo SSH a los pocos minutos de obtener una IP. Esta es la secuencia exacta que ejecuto en cada servidor nuevo — lista para copiar y pegar en Debian 13, con una tabla de verificación al final.

Supuestos: una imagen Debian 13 recién desplegada desde VPSRento, has iniciado sesión como root por SSH, y la IP de ejemplo es 185.220.101.14 — sustituye la tuya. Tiempo total: aproximadamente media hora. Haz los pasos en orden; el paso 2 puede dejarte fuera si lo haces con prisa.

1. Crea tu usuario sudo

Trabajar como root es como los errores tipográficos se convierten en incidentes. Crea un usuario real, dale sudo, y haz todo desde ahí:

# create the user (you'll set a password — still useful for sudo)
adduser ops

# grant sudo
usermod -aG sudo ops

Todo lo que sigue a este punto se ejecuta como ops salvo que se indique lo contrario.

2. Solo claves SSH — sin contraseñas, sin login de root

La autenticación por contraseña es el mayor agujero en un servidor expuesto a internet. Los bots martillean el puerto 22 con listas de credenciales todo el día, todos los días. Las claves hacen irrelevante toda esa clase de ataque. En tu máquina local:

# generate a keypair if you don't have one (ed25519, no passphrase tradeoff is yours)
ssh-keygen -t ed25519 -C "ops@atlas"

# push the public key to the server
ssh-copy-id [email protected]

Verifica que puedes iniciar sesión con la clave en una terminal nueva terminal — ssh [email protected] — antes de tocar la configuración. Mantén la sesión root existente abierta como vía de escape. Luego edita /etc/ssh/sshd_config:

# /etc/ssh/sshd_config — the three lines that matter
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
# validate the config, then reload (Debian 13 uses ssh.service)
sshd -t && systemctl reload ssh

prohibit-password en lugar de un no plano para root a propósito: root aún puede autenticarse con una clave desde tu estación de trabajo, lo cual es útil ocasionalmente para recuperación desde la consola del proveedor — pero ninguna contraseña funcionará jamás, para nadie, desde ningún lugar. Confirma con sshd -T | grep -E 'passwordauthentication|permitrootlogin'.

3. Cortafuegos: denegar por defecto, permitir solo lo que ejecutas

El ufw de Debian es una capa delgada y sensata sobre nftables. La política es la seguridad; las reglas son solo excepciones a ella:

apt update && apt install -y ufw

ufw default deny incoming
ufw default allow outgoing

# SSH stays open — add this BEFORE enabling
ufw allow 22/tcp comment 'SSH'

# whatever your box actually serves, e.g.:
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'

ufw enable
ufw status verbose

Cada puerto que abras debe tener un nombre y una razón. Si no puedes decir para qué sirve un puerto, no recibe regla.

4. fail2ban: reduce los bots a un ritmo lento

Con la autenticación por contraseña deshabilitada, la fuerza bruta ya está muerta — pero fail2ban mantiene tus registros legibles y banea a los escáneres que tocan todo lo demás:

apt install -y fail2ban
# /etc/fail2ban/jail.local
[sshd]
enabled  = true
port     = ssh
maxretry = 5
findtime = 10m
bantime  = 1h
systemctl enable --now fail2ban

# watch it work
fail2ban-client status sshd

5. Actualizaciones de seguridad automáticas

El CVE sin parchear es un riesgo mayor que el reinicio. El unattended-upgrades de Debian instala actualizaciones de seguridad por sí solo:

apt install -y unattended-upgrades

# answer Yes to auto-install updates
dpkg-reconfigure -plow unattended-upgrades

La configuración por defecto en /etc/apt/apt.conf.d/50unattended-upgrades solo toma del repositorio de seguridad — que es lo que quieres en un servidor: correcciones de seguridad automáticamente, todo lo demás cuando tú elijas.

6. Apaga lo que no ejecutas

Cada servicio en ejecución es superficie de ataque que tienes que parchear. Mira qué está realmente escuchando:

# who is listening, on what, as which process
ss -tulpn

# everything enabled at boot
systemctl list-unit-files --state=enabled

# example: you don't run a print server — nobody does
systemctl disable --now cups

La regla: si no puedes decir qué hace un listener, averígualo antes de dejarlo vivir. En una imagen mínima de VPSRento debería haber muy poco más allá de sshd y tu propia aplicación.

7. Opcional pero recomendado: un plano de gestión WireGuard

La versión más fuerte de seguridad SSH es un SSH que no enfrenta internet en absoluto. Ejecuta WireGuard en el servidor, permite SSH solo dentro del túnel, y el puerto 22 desaparece de todos los escáneres del mundo:

apt install -y wireguard

# /etc/wireguard/wg0.conf — minimal management tunnel
# [Interface] Address = 10.8.0.1/24, ListenPort = 51820

# open the tunnel, not the shell
ufw allow 51820/udp comment 'WireGuard'
ufw allow in on wg0 to any port 22 proto tcp comment 'SSH via WG'
ufw delete allow 22/tcp

systemctl enable --now wg-quick@wg0

Después de eso, ssh [email protected] a través del túnel, y la IP pública responde exactamente en un puerto UDP. La guía completa de WireGuard — claves, pares, configuraciones de cliente, códigos QR para teléfono — está en la guía complementaria.

La lista de verificación de 10 puntos

Repasa esta tabla después de cada nuevo despliegue, y de nuevo después de cada servicio que agregues:

#ElementoDónde viveVerificar con
1Usuario sudo no root/etc/passwdid ops
2Autenticación SSH solo con clavessshd_configsshd -T | grep passwordauth
3Inicio de sesión root con contraseña deshabilitadosshd_configsshd -T | grep permitrootlogin
4Firewall con denegación predeterminada de entradaufwufw status verbose
5Solo puertos nombrados abiertosufwufw status numbered
6Jail de fail2ban sshd activojail.localfail2ban-client status sshd
7Actualizaciones de seguridad automáticasaptsystemctl status unattended-upgrades
8Sin listeners sin explicaciónss -tulpn
9Gestión sobre WireGuard (opcional)wg0.confwg show
10Snapshot después del endurecimientoComplemento del área de cliente, $1.99/mesServicios → tu VPS → snapshots

El elemento 10 merece una frase: endurece primero, snapshot después, en ese orden — un snapshot de un servidor limpio y endurecido es tu rollback para cada error futuro. Los snapshots diarios fuera de sitio son un complemento de $1.99/mes en el área de cliente. Treinta minutos de prevención, un clic de seguro.

Despliega un servidor limpio y endurecelo tú mismo.

Imagen Debian 13, root completo en 55 segundos, IP limpia verificada contra más de 40 listas negras. Desde $5.99/mes.

Español