Tutorial

Hardening Linux VPS : checklist para agencias tras la entrega

Seguridad y monitorización11 min de lectura10 pasos

Tu agencia entrega un VPS y cada técnico aplica «más o menos lo mismo» — sin un runbook escrito, sin rastro documentado. Cuando ocurre un incidente, no puedes demostrar que la configuración de seguridad acordada fue realmente aplicada. Esta guía comienza donde termina el tutorial individual: estandarización, delegación y trazabilidad para gestionar una cartera de servidores cliente.

Contenido· Por qué un runbook formalizado lo cambia todo para una agencia1/13
  1. 01Por qué un runbook formalizado lo cambia todo para una agencia
  2. 02Lo que este runbook aporta a tu agencia
  3. 03Requisitos previos y alcance de la checklist
  4. 04Bloque 1 — Actualizaciones e inventario inicial
  5. 05Bloque 2 — Usuario sudo y bloqueo de root
  6. 06Bloque 3 — Autenticación por clave SSH
  7. 07Bloque 4 — Firewall UFW
  8. 08Bloque 5 — fail2ban
  9. 09Bloque 6 — auditd: el registro de trazabilidad
  10. 10Bloque 7 — Verificación final y acta de entrega
  11. 11Runbook de agencia vs. configuración improvisada
  12. 12Resolución de errores: los más frecuentes al aplicar el runbook
  13. 13Ir más lejos: bastionado y monitorización continua

Por qué un runbook formalizado lo cambia todo para una agencia

Un desarrollador individual puede aplicar mentalmente cinco comandos tras cada entrega. Una agencia no puede: varios técnicos, decenas de VPS de clientes, turnos de guardia rotativos. Cuando un cliente informa de un acceso sospechoso seis meses después del lanzamiento, la pregunta no es «¿asegurasteis el servidor?» sino «¿podéis demostrarlo?"

La trazabilidad se ha convertido en un requisito contractual y regulatorio. La directiva NIS2 (en proceso de transposición al derecho nacional) y el RGPD obligan a los prestadores que tratan datos personales a documentar las medidas de seguridad implementadas. Sin un runbook versionado y sin registros auditd, tu agencia no dispone de ningún documento oponible.

Esta guía no vuelve a describir la instalación de fail2ban o UFW — los artículos Proteger un VPS con fail2ban y Firewall UFW en VPS lo hacen en detalle. Opera a un nivel superior: cómo estandarizar, delegar y rastrear estos gestos a escala de una cartera completa de clientes.

Lo que este runbook aporta a tu agencia

  • Reproducibilidad: cada técnico sigue exactamente los mismos pasos, en el mismo orden, en cada nuevo VPS cliente.
  • Trazabilidad: auditd registra quién hizo qué, cuándo y qué comando — prueba conservable en caso de incidente o auditoría de cliente.
  • Delegación segura: un junior puede entregar un servidor endurecido sin improvisar, porque el runbook contiene las decisiones en su lugar.
  • Defensa contractual: una cláusula de seguridad en tu contrato de mantenimiento solo es defendible con un registro de ejecución fechado.
  • Reducción de la superficie de ataque: la checklist elimina los olvidos clásicos — root SSH abierto, auditd sin activar — los puntos de entrada más explotados.
  • Consistencia entre clientes: misma base segura para todos, diferencias solo donde el pliego de condiciones del cliente lo exija.

Requisitos previos y alcance de la checklist

Esta checklist está dirigida a Ubuntu 24.04 LTS y Debian 12 (Bookworm), las dos distribuciones más comunes en VPS en 2026. Los comandos han sido verificados en estos sistemas; en AlmaLinux o Rocky Linux, los nombres de paquetes y las rutas de servicio difieren.

Requisitos mínimos del VPS: 1 vCPU, 1 GB de RAM (2 GB recomendados cuando fail2ban y auditd corren juntos), 20 GB SSD. ServOrbit entrega cada VPS con acceso root SSH inmediato y consola KVM incluida, lo que permite a tu agencia aplicar este runbook desde el primer minuto — sin necesidad de solicitar acceso intermediario al proveedor.

La checklist está organizada en siete bloques, en orden de aplicación. Se detiene en el perímetro básico del sistema: la seguridad de aplicaciones (backoffice expuesto, superficies de ataque de aplicaciones) se trata por separado en Backoffice expuesto: las superficies de ataque olvidadas en VPS.

Bloque 1 — Actualizaciones e inventario inicial

  1. Actualización del sistema e inventario

    La primera acción tras el login como root es llevar el sistema a su nivel de parches actual.

    apt update && apt upgrade -y
    apt install -y auditd audispd-plugins curl gnupg2 ufw fail2ban

    Registra en tu runbook: la fecha, la versión del kernel (uname -r) y la lista de paquetes instalados (dpkg -l > /root/inventory-$(date +%F).txt). Este archivo de inventario constituye la línea base del servidor en la entrega — es el documento que presentarás si un cliente cuestiona el estado inicial de su máquina.

    Referencia CIS Benchmark: control CIS 1.1 (Ubuntu Linux 24.04 LTS Benchmark, sección «Configuración inicial»).

  2. Activar actualizaciones de seguridad automáticas

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

    Verifica que la línea Unattended-Upgrade::Allowed-Origins incluya ${distro_id}:${distro_codename}-security. Para una cartera de clientes, activa las actualizaciones automáticas y programa una revisión mensual de las actualizaciones no relacionadas con seguridad — requieren validación humana.

    Referencia CIS: control CIS 1.9 (Garantizar que se instalen actualizaciones, parches y software de seguridad adicional).

Bloque 2 — Usuario sudo y bloqueo de root

  1. Crear una cuenta de administración dedicada

    Nunca uses root para las tareas habituales. Crea una cuenta nominativa por técnico o una cuenta de servicio de agencia:

    useradd -m -s /bin/bash adminagencia
    usermod -aG sudo adminagencia
    passwd adminagencia

    Consejo para la agencia: usa un nombre de cuenta identificable en los logs (juan.garcia o agency-admin), no un genérico admin. Cuando auditd registra una acción, queda registrada la cuenta ejecutante — un nombre genérico inutiliza la auditoría.

  2. Deshabilitar el login root por SSH

    sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
    grep PermitRootLogin /etc/ssh/sshd_config

    Atención: solo recarga sshd después de verificar que tu usuario sudo puede conectarse y ejecutar sudo su. De lo contrario te quedarás sin acceso al servidor.

    Referencia CIS: control CIS 5.2.8 (Garantizar que el login root SSH esté deshabilitado).

Bloque 3 — Autenticación por clave SSH

  1. Desplegar la clave pública de la agencia

    mkdir -p /home/adminagencia/.ssh
    chmod 700 /home/adminagencia/.ssh
    echo "<CLAVE_PUBLICA_AGENCIA>" >> /home/adminagencia/.ssh/authorized_keys
    chmod 600 /home/adminagencia/.ssh/authorized_keys
    chown -R adminagencia:adminagencia /home/adminagencia/.ssh

    Consejo para la agencia: mantén un repositorio versionado de claves públicas (un archivo por técnico, rotación anual). Cada clave desplegada en un VPS cliente debe estar referenciada en ese repositorio — es lo que permite revocar el acceso cuando un colaborador deja el equipo.

  2. Deshabilitar la autenticación por contraseña

    Una vez verificada la clave (prueba desde otro terminal antes de confirmar):

    sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
    sed -i 's/^#\?ChallengeResponseAuthentication.*/ChallengeResponseAuthentication no/' /etc/ssh/sshd_config
    systemctl reload sshd

    Referencia CIS: control CIS 5.2.19 (Garantizar que la autenticación SSH por contraseña esté deshabilitada).

Bloque 4 — Firewall UFW

  1. Configurar UFW con política de denegación por defecto

    ufw default deny incoming
    ufw default allow outgoing
    ufw allow 22/tcp comment 'SSH agencia'
    ufw allow 80/tcp comment 'HTTP'
    ufw allow 443/tcp comment 'HTTPS'
    ufw --force enable
    ufw status verbose

    Abre solo los puertos realmente utilizados por el proyecto del cliente. Si la aplicación del cliente no usa un puerto de correo directo, no lo abras.

    Para la instalación de fail2ban y las opciones avanzadas de UFW, consulta los artículos dedicados: Proteger un VPS con fail2ban y Firewall UFW en VPS.

    Referencia CIS: control CIS 3.5.1 (Garantizar que un paquete de firewall esté instalado).

Bloque 5 — fail2ban

  1. Activar fail2ban con la jaula SSH

    cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

    Edita /etc/fail2ban/jail.local y ajusta la sección [sshd]:

    [sshd]
    enabled = true
    maxretry = 5
    findtime = 600
    bantime = 3600
    systemctl enable fail2ban
    systemctl start fail2ban
    fail2ban-client status sshd

    Para una cartera de clientes, considera CrowdSec como sustituto o complemento: su lista de bloqueo comunitaria mancomuniza la inteligencia de miles de servidores.

Bloque 6 — auditd: el registro de trazabilidad

  1. Activar auditd y configurar las reglas mínimas

    auditd es el componente que las agencias olvidan con mayor frecuencia — y sin embargo es el que proporciona la prueba oponible en caso de incidente.

    systemctl enable auditd
    systemctl start auditd

    Crea un archivo de reglas de agencia en /etc/audit/rules.d/agency.rules:

    # Registrar todas las elevaciones de privilegios
    -w /etc/sudoers -p wa -k sudoers_changes
    -w /etc/sudoers.d/ -p wa -k sudoers_changes
    
    # Registrar conexiones SSH
    -w /var/log/auth.log -p wa -k auth_log
    
    # Registrar modificaciones en archivos de configuración del sistema
    -w /etc/ssh/sshd_config -p wa -k sshd_config
    -w /etc/passwd -p wa -k passwd_changes
    -w /etc/shadow -p wa -k shadow_changes
    
    # Registrar comandos ejecutados como root
    -a always,exit -F arch=b64 -S execve -F euid=0 -k root_commands
    augenrules --load
    auditctl -l

    Referencia CIS: control CIS 4.1.1 (Garantizar que la auditoría esté habilitada) y CIS 4.1.3 (Garantizar que se recopilen eventos que modifiquen información de fecha y hora).

  2. Exportar y conservar los logs de auditd

    Los logs de auditd deben conservarse fuera del servidor para ser oponibles. Configura una exportación a tu sistema centralizado (rsyslog, Loki o un simple rsync diario al almacenamiento de la agencia):

    # Ejemplo: exportación rsyslog al colector de la agencia
    echo ':programname, isequal, "auditd" @<IP_COLECTOR_AGENCIA>:514' \
      >> /etc/rsyslog.d/99-auditd-remote.conf
    systemctl restart rsyslog

    Conserva al menos 90 días de logs. El RGPD no fija un período mínimo de retención para logs de seguridad, pero marcos como CIS Controls v8 (control 8.3) recomiendan al menos 90 días en local y 1 año en archivo frío.

Bloque 7 — Verificación final y acta de entrega

Una vez ejecutados los seis bloques anteriores, audita el estado del servidor antes de entregar los accesos al cliente:

# Verificar servicios activos
systemctl is-active ufw fail2ban auditd sshd

# Confirmar que root no puede conectarse por SSH
grep PermitRootLogin /etc/ssh/sshd_config

# Verificar reglas UFW
ufw status verbose

# Verificar reglas auditd cargadas
auditctl -l

# Revisar últimas conexiones
last -n 10

Produce un acta de entrega fechada y firmada (incluso por correo electrónico) que liste las medidas aplicadas, las versiones de los paquetes de seguridad instalados y la ubicación del colector de logs. Este es el documento que firma tu cliente y que constituye la prueba contractual de la configuración inicial.

El acta de entrega no es una formalidad: un cliente que sufre una intrusión dos años después del lanzamiento pedirá a tu agencia que justifique el estado del servidor en la entrega. Sin este documento, la carga de la prueba se invierte.

Runbook de agencia vs. configuración improvisada

Desplace la tabla

CriterioConfiguración improvisadaRunbook estandarizado
ReproducibilidadDepende del técnico presenteIdéntica en cada entrega
Trazabilidad auditdRara vez activada, config variableActivada y configurada sistemáticamente
Prueba en caso de incidenteSin documentos oponiblesActa fechada + logs centralizados
Delegación a juniorArriesgada (posibles olvidos)Posible con el runbook como guía
Rotación de clave SSHManual y olvidadaProcedimiento escrito, repositorio versionado
Cumplimiento NIS2 / RGPDSin documentarDocumentado y reproducible

Consejo de auditoría mensual. Una vez al mes, vuelve a ejecutar las verificaciones finales del Bloque 7 en cada VPS cliente activo y archiva el resultado. Un diff entre dos auditorías consecutivas revela inmediatamente cualquier modificación no autorizada: un puerto extra abierto, un servicio fail2ban detenido, una regla auditd que falta. Esta auditoría toma menos de cinco minutos por servidor cuando los comandos están en un script.

Resolución de errores: los más frecuentes al aplicar el runbook

Error 1 — sshd rechaza arrancar tras modificar sshd_config
Mensaje: sshd: /etc/ssh/sshd_config line 42: unsupported option
Causa: una directiva obsoleta o con sintaxis incorrecta. Verifica con sshd -t antes de recargar el servicio. En Ubuntu 24.04, ChallengeResponseAuthentication se reemplaza por KbdInteractiveAuthentication.

sshd -t && systemctl reload sshd

Error 2 — UFW bloquea tu propia conexión SSH
Mensaje: la sesión SSH se congela tras ufw enable.
Causa: la regla SSH no se añadió antes de la activación. Usa la consola KVM de ServOrbit para acceder al servidor sin SSH, luego ejecuta ufw allow 22/tcp y ufw reload.

Error 3 — auditd arranca pero auditctl -l devuelve una lista vacía
Mensaje: List of rules: seguido de nada.
Causa: el archivo de reglas no está cargado. Verifica que tu archivo .rules está en /etc/audit/rules.d/ y ejecuta augenrules --load.

Error 4 — fail2ban no bloquea pese a múltiples intentos fallidos
Mensaje: fail2ban-client status sshd muestra Currently banned: 0 tras 10 intentos.
Causa: la ruta del diario SSH ha cambiado. En Debian 12 y Ubuntu 24.04 con journald, el backend de fail2ban debe ser systemd en jail.local: backend = systemd.

Error 5 — unattended-upgrades reinicia servicios en producción
Causa: la configuración por defecto reinicia automáticamente los servicios tras las actualizaciones. Para un VPS cliente en producción, deshabilita el reinicio automático y programa una ventana de mantenimiento:

# En /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Automatic-Reboot "false";

Ir más lejos: bastionado y monitorización continua

Esta checklist cubre el nivel 1 del endurecimiento del sistema. Para una cartera de clientes que requiere un nivel de seguridad superior:

- Bastion SSH: centraliza todos los accesos a través de un único punto de entrada reforzado — ver Bastion Host en VPS.
- CrowdSec: detección conductual y lista de bloqueo comunitaria como complemento o sustituto de fail2ban — ver Proteger tu VPS con CrowdSec.
- Copias de seguridad: la configuración de seguridad no protege contra la pérdida de datos — ver Copias de seguridad con BorgBackup en VPS.
- Parches de aplicaciones: el endurecimiento del sistema es inútil si las aplicaciones self-hosted no se mantienen — ver Rutina de parches para apps self-hosted.
- Certificados SSL: HTTPS es un requisito previo antes de cualquier exposición pública — ver Certificados SSL con Let's Encrypt en VPS.

ServOrbit entrega cada VPS listo para este runbook

Acceso root SSH inmediato y consola KVM incluida en la entrega: tu agencia aplica este runbook desde la primera conexión, para cada cliente, sin necesidad de solicitar acceso intermediario al proveedor. Gestiona toda tu cartera de VPS clientes desde un panel de agencia centralizado.

¿Necesita ayuda?

Consulte nuestro centro de ayuda y nuestra FAQ, o contacte con nuestro equipo: llamada, WhatsApp o correo electrónico. Soporte en francés, inglés y árabe.

Escribir por WhatsAppse abre en una pestaña nueva