🔒 Seguridad del VPS
Configuración de seguridad robusta para el VPS: SSH, firewalls, fail2ban y actualizaciones automáticas.
Índice
- Acceso Inicial
- Actualizar Sistema
- Usuario No-Root
- Configuración SSH
- Endurecimiento SSH
- Firewall Hetzner Cloud
- Firewall UFW (VPS)
- Fail2ban
- Actualizaciones Automáticas
- Configuración del Sistema
- App Móvil - Termius
- Conexión desde Windows
Acceso Inicial
Primer acceso al VPS como root:
Actualizar Sistema
Antes de cualquier configuración, actualizar el sistema:
Usuario No-Root
Crear usuario con privilegios sudo
Copiar clave SSH al nuevo usuario
Probar acceso con nuevo usuario
Desde otra terminal (no cerrar la actual):
Verificar permisos sudo:
Configuración SSH
Deshabilitar login de root
⚠️ IMPORTANTE: Mantén una sesión SSH abierta mientras haces estos cambios.
Modificar estas líneas (quitar # si lo tienen):
Reiniciar 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):
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
- Accede a Hetzner Cloud Console
- En el menú lateral, ve a "Firewalls"
- Click en "Create Firewall"
- 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
- En la sección "Apply to", selecciona "Server"
- Marca tu servidor VPS
- 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:
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:
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
Verificar:
Hostname (Opcional)
Verificar:
Locales (Opcional)
- Marca
es_ES.UTF-8(con barra espaciadora) - También deja
en_US.UTF-8marcado - Selecciona
es_ES.UTF-8como default
App Móvil - Termius
Instalación inicial
- Descargar Termius desde Google Play / App Store
- Configurar contraseña maestra para el vault (opcional pero recomendado)
- 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
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
- Abre Termius
- Ve a Keychain (icono de llave) 🔑
- Toca el +
- Selecciona "Paste SSH key" (NO "Import from file")
- Pega el contenido completo (incluye
-----BEGINy-----END) - Dale un nombre (ej: "Hetzner Key")
- Guarda
- IMPORTANTE: Borra la clave de donde la copiaste
Paso 4: Configurar la conexión
- Crea o edita tu conexión al servidor
- Configura:
- Hostname: YOUR_SERVER_IP
- Username: your_username
- Port: 22
- En Authentication:
- Selecciona "Keys" (NO "Password")
- Elige la clave que acabas de importar
- 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:
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:
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