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:
auditdregistra 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
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 fail2banRegistra 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»).
Activar actualizaciones de seguridad automáticas
apt install -y unattended-upgrades dpkg-reconfigure --priority=low unattended-upgradesVerifica que la línea
Unattended-Upgrade::Allowed-Originsincluya${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
Crear una cuenta de administración dedicada
Nunca uses
rootpara 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 adminagenciaConsejo para la agencia: usa un nombre de cuenta identificable en los logs (
juan.garciaoagency-admin), no un genéricoadmin. Cuandoauditdregistra una acción, queda registrada la cuenta ejecutante — un nombre genérico inutiliza la auditoría.Deshabilitar el login root por SSH
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config grep PermitRootLogin /etc/ssh/sshd_configAtención: solo recarga
sshddespués de verificar que tu usuario sudo puede conectarse y ejecutarsudo 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
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/.sshConsejo 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.
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 sshdReferencia CIS: control CIS 5.2.19 (Garantizar que la autenticación SSH por contraseña esté deshabilitada).
Bloque 4 — Firewall UFW
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 verboseAbre 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
Activar fail2ban con la jaula SSH
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.localEdita
/etc/fail2ban/jail.localy ajusta la sección[sshd]:[sshd] enabled = true maxretry = 5 findtime = 600 bantime = 3600systemctl enable fail2ban systemctl start fail2ban fail2ban-client status sshdPara 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
Activar auditd y configurar las reglas mínimas
auditdes 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 auditdCrea 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_commandsaugenrules --load auditctl -lReferencia 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).
Exportar y conservar los logs de auditd
Los logs de
auditddeben conservarse fuera del servidor para ser oponibles. Configura una exportación a tu sistema centralizado (rsyslog, Loki o un simplersyncdiario 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 rsyslogConserva 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 10Produce 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
| Criterio | Configuración improvisada | Runbook estandarizado |
|---|---|---|
| Reproducibilidad | Depende del técnico presente | Idéntica en cada entrega |
| Trazabilidad auditd | Rara vez activada, config variable | Activada y configurada sistemáticamente |
| Prueba en caso de incidente | Sin documentos oponibles | Acta fechada + logs centralizados |
| Delegación a junior | Arriesgada (posibles olvidos) | Posible con el runbook como guía |
| Rotación de clave SSH | Manual y olvidada | Procedimiento escrito, repositorio versionado |
| Cumplimiento NIS2 / RGPD | Sin documentar | Documentado 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 sshdError 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.