Saltar a contenido

🔒 Seguridad del VPS

Configuración de seguridad robusta para el VPS: SSH, firewalls, fail2ban y actualizaciones automáticas.


Índice


Acceso Inicial

Primer acceso al VPS como root:

ssh root@YOUR_SERVER_IP

Actualizar Sistema

Antes de cualquier configuración, actualizar el sistema:

apt update && apt upgrade -y

Usuario No-Root

Crear usuario con privilegios sudo

# Crear usuario
adduser your_username

# Añadir a grupo sudo
usermod -aG sudo your_username

Copiar clave SSH al nuevo usuario

rsync --archive --chown=your_username:your_username ~/.ssh /home/your_username

Probar acceso con nuevo usuario

Desde otra terminal (no cerrar la actual):

ssh your_username@YOUR_SERVER_IP

Verificar permisos sudo:

sudo ls /root

Configuración SSH

Deshabilitar login de root

⚠️ IMPORTANTE: Mantén una sesión SSH abierta mientras haces estos cambios.

sudo nano /etc/ssh/sshd_config

Modificar estas líneas (quitar # si lo tienen):

PermitRootLogin no
PasswordAuthentication no

Reiniciar SSH:

sudo systemctl restart ssh

Probar desde otra terminal antes de cerrar la sesión actual.


Endurecimiento SSH

¿Por qué endurecer SSH?

Configuraciones adicionales que mejoran la seguridad: - ✅ Limita intentos de autenticación - ✅ Restringe usuarios permitidos - ✅ Mantiene conexiones activas de forma segura - ✅ Usa algoritmos resistentes a computación cuántica

Aplicar configuración

IMPORTANTE: Mantén una sesión SSH abierta mientras haces estos cambios.

sudo tee -a /etc/ssh/sshd_config >/dev/null <<'EOF'

# --- endurecimiento extra ---
PubkeyAuthentication yes
KexAlgorithms [email protected]
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers your_username
EOF

sudo systemctl restart ssh

Explicación de las opciones

Opción Descripción
PubkeyAuthentication yes Hace explícito el uso de claves SSH
KexAlgorithms [email protected] Algoritmo resistente a computación cuántica
MaxAuthTries 3 Reduce intentos de autenticación de 6 a 3
ClientAliveInterval 300 Mantiene conexiones vivas (5 minutos)
ClientAliveCountMax 2 Cierra conexión inactiva tras 10 minutos
AllowUsers your_username Solo permite tu usuario, bloquea cualquier otro

Verificar configuración

# Ver las últimas líneas del archivo
sudo tail -20 /etc/ssh/sshd_config

# Verificar sintaxis
sudo sshd -t

# Ver logs en tiempo real
sudo journalctl -u ssh -f

Probar conexión

DESDE OTRA TERMINAL (no cierres la actual hasta verificar):

ssh your_username@YOUR_SERVER_IP

Si ejecutaste el comando dos veces por error

Si duplicaste el bloque de configuración:

sudo nano /etc/ssh/sshd_config
# Baja al final y elimina el segundo bloque duplicado
# Guarda con Ctrl+O, Enter, Ctrl+X
sudo systemctl restart ssh

Firewall Hetzner Cloud

¿Por qué usar el firewall de Hetzner?

Bloquea ataques antes de consumir recursos del VPS ✅ Protección DDoS básica ✅ Más eficiente (no consume recursos del servidor) ✅ Gratis en Hetzner

Configuración desde el Panel Web

  1. Accede a Hetzner Cloud Console
  2. En el menú lateral, ve a "Firewalls"
  3. Click en "Create Firewall"
  4. Dale un nombre: vps-firewall

Reglas de Entrada (Inbound)

Configura estas reglas:

Protocol Port Source Description
TCP 22 Any IPv4/IPv6 SSH
TCP 80 Any IPv4/IPv6 HTTP
TCP 443 Any IPv4/IPv6 HTTPS
ICMP - Any IPv4/IPv6 Ping (opcional)

Reglas de Salida (Outbound)

Dejar vacío (permite todo el tráfico saliente por defecto).

Aplicar al Servidor

  1. En la sección "Apply to", selecciona "Server"
  2. Marca tu servidor VPS
  3. Click en "Create Firewall"

El firewall se aplicará automáticamente.


Firewall UFW (VPS)

Segunda capa de seguridad a nivel del servidor

# Permitir OpenSSH
sudo ufw allow OpenSSH

# Habilitar UFW
sudo ufw enable

# Ver estado
sudo ufw status

Configurar políticas por defecto (Recomendado)

IMPORTANTE: Establece políticas restrictivas por defecto.

# Denegar todo el tráfico entrante por defecto
sudo ufw default deny incoming

# Permitir todo el tráfico saliente por defecto
sudo ufw default allow outgoing

# Recargar y verificar
sudo ufw reload
sudo ufw status verbose

Resultado esperado

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere
80,443/tcp (Nginx Full)    ALLOW IN    Anywhere

Ahora tienes doble protección

  • Hetzner Cloud Firewall (capa externa)
  • UFW (capa interna del servidor) con políticas restrictivas

Comandos útiles de UFW

# Ver estado detallado
sudo ufw status verbose

# Permitir puerto específico
sudo ufw allow 3000/tcp

# Eliminar regla
sudo ufw delete allow 3000/tcp

# Ver reglas numeradas
sudo ufw status numbered

# Eliminar regla por número
sudo ufw delete [número]

# Recargar firewall
sudo ufw reload

# Deshabilitar firewall (no recomendado)
sudo ufw disable

Fail2ban

Instalación

Protección contra ataques de fuerza bruta:

sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Comandos útiles

# Ver estado general
sudo systemctl status fail2ban

# Ver jails activas
sudo fail2ban-client status

# Ver intentos bloqueados en SSH
sudo fail2ban-client status sshd

# Desbanear una IP
sudo fail2ban-client set sshd unbanip IP_ADDRESS

# Ver IPs baneadas
sudo fail2ban-client get sshd banned

# Ver intentos de conexión fallidos
sudo lastb

Actualizaciones Automáticas

Configurar actualizaciones automáticas de seguridad

Mantiene el sistema seguro automáticamente:

sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades

En el menú que aparece: - Selecciona "Yes" para habilitar actualizaciones automáticas

Verificar estado

sudo systemctl status unattended-upgrades

# Ver logs
sudo tail -f /var/log/unattended-upgrades/unattended-upgrades.log

Esto instalará automáticamente parches de seguridad críticos sin intervención manual.


Configuración del Sistema

Zona horaria

sudo timedatectl set-timezone Europe/Madrid

Verificar:

timedatectl

Hostname (Opcional)

sudo hostnamectl set-hostname your-vps-hostname

Verificar:

hostnamectl

Locales (Opcional)

sudo apt install locales -y
sudo dpkg-reconfigure locales
  • Marca es_ES.UTF-8 (con barra espaciadora)
  • También deja en_US.UTF-8 marcado
  • Selecciona es_ES.UTF-8 como default

App Móvil - Termius

Instalación inicial

  1. Descargar Termius desde Google Play / App Store
  2. Configurar contraseña maestra para el vault (opcional pero recomendado)
  3. Saltar la instalación de desktop app

Configurar con Clave SSH Privada

IMPORTANTE: Como hemos deshabilitado PasswordAuthentication, Termius DEBE usar clave privada.

Paso 1: Obtener la clave privada del ordenador

# Ver tu clave privada (desde WSL o donde la tengas)
cat ~/.ssh/id_rsa
# o
cat ~/.ssh/id_ed25519

Paso 2: Transferir la clave al móvil

Opciones seguras: - WhatsApp/Telegram: Envíatela a ti mismo (mensaje guardado) - Email cifrado - Google Drive/Dropbox (temporal) - Cable USB

Paso 3: Importar en Termius

  1. Abre Termius
  2. Ve a Keychain (icono de llave) 🔑
  3. Toca el +
  4. Selecciona "Paste SSH key" (NO "Import from file")
  5. Pega el contenido completo (incluye -----BEGIN y -----END)
  6. Dale un nombre (ej: "Hetzner Key")
  7. Guarda
  8. IMPORTANTE: Borra la clave de donde la copiaste

Paso 4: Configurar la conexión

  1. Crea o edita tu conexión al servidor
  2. Configura:
  3. Hostname: YOUR_SERVER_IP
  4. Username: your_username
  5. Port: 22
  6. En Authentication:
  7. Selecciona "Keys" (NO "Password")
  8. Elige la clave que acabas de importar
  9. Guarda y conecta

Ajustar visualización

  • Pellizcar pantalla (pinch to zoom) para aumentar tamaño de texto
  • O ir a Settings → Appearance → Font Size

Conexión desde Windows

Opción A: Usar WSL (Recomendado)

Si tienes la clave SSH en WSL:

# Desde PowerShell/Windows Terminal:
wsl

# Luego conectarse:
ssh your_username@YOUR_SERVER_IP

Tips para copiar/pegar en WSL: - Pegar: Clic derecho del ratón (o Shift + Insert) - Copiar: Selecciona texto con el ratón (se copia automáticamente) - NO uses Ctrl+V, usa solo clic derecho

Opción B: Copiar clave a Windows

# Desde WSL, copiar clave a Windows:
cp ~/.ssh/id_rsa /mnt/c/Users/YOUR_WINDOWS_USERNAME/.ssh/
# o
cp ~/.ssh/id_ed25519 /mnt/c/Users/YOUR_WINDOWS_USERNAME/.ssh/

Luego usar PowerShell o Windows Terminal directamente:

ssh your_username@YOUR_SERVER_IP

Checklist de Seguridad

  • [x] Usuario no-root creado
  • [x] Root login deshabilitado
  • [x] Autenticación por contraseña deshabilitada
  • [x] Solo autenticación por clave SSH
  • [x] SSH endurecido (MaxAuthTries 3, AllowUsers, algoritmos cuánticos)
  • [x] Hetzner Cloud Firewall configurado (capa externa)
  • [x] Firewall UFW activado con políticas restrictivas (capa interna)
  • [x] Fail2ban instalado y funcionando
  • [x] Actualizaciones automáticas de seguridad

Comandos Útiles SSH

# Ver claves SSH
ls -la ~/.ssh/

# Ver última conexión
last

# Ver intentos de conexión fallidos
sudo lastb

# Ver configuración SSH actual
sudo cat /etc/ssh/sshd_config

# Ver últimas líneas de configuración SSH
sudo tail -20 /etc/ssh/sshd_config

# Verificar sintaxis de configuración SSH
sudo sshd -t

# Ver logs de SSH en tiempo real
sudo journalctl -u ssh -f

⬅️ Volver al índice | ➡️ Siguiente: Docker