Llevaba semanas con la cabeza metida en la migración. Primero de Webempresa a Hetzner, luego intentando consolidar dos VPS en uno. En algún momento del proceso, entre redirecciones rotas, configuraciones tocadas y pruebas a deshora, me di cuenta de algo incómodo: no tenía ni idea del estado real de mis servidores.
No me refiero a si funcionaban. Las webs respondían, los certificados estaban al día, el correo llegaba. Me refiero a si estaban bien configurados. Si había algo escuchando en un puerto que no debería. Si alguien estaba intentando entrar por SSH. Si había servicios instalados hace meses que ya no hacían nada.
Nunca había hecho una revisión formal. Así que decidí hacerla.
El punto de partida
Mi infraestructura en ese momento: dos servidores Ubuntu 24.04 en Hetzner. Uno de producción con Nginx nativo, PHP-FPM, MySQL y tres webs reales. Otro haciendo de proxy inverso con NPM (Nginx Proxy Manager) en Docker, de entrada para los servicios del homelab. Ambos conectados entre sí y con el homelab vía WireGuard.
Nada extraordinario, pero suficiente complejidad para que las cosas se puedan torcer sin que te des cuenta.
El problema con las auditorías manuales
Podría haberme conectado a cada servidor y ejecutado comandos uno a uno. Pero eso tiene dos problemas: primero, te olvidas de cosas. Segundo, no tienes un registro del estado en un momento concreto para comparar después.
Lo que quería era un script que me diera un snapshot completo del sistema — seguridad, rendimiento, servicios, usuarios, configuraciones — en un solo fichero de texto. Sin dependencias externas, sin agentes, sin complicaciones. Algo que pudiera ejecutar en cualquier servidor Ubuntu y obtener siempre el mismo formato.
El script
El resultado es un script bash que recopila información en bloques: sistema, actualizaciones, usuarios y accesos, seguridad, servicios, procesos, Nginx, PHP-FPM, WireGuard, Docker y logs. Cada bloque es independiente — si algo falla, el resto continúa.
Para ejecutarlo:
# Descarga o copia el script al servidor
chmod +x audit.sh
# Ejecútalo con una etiqueta para identificar el servidor
bash audit.sh vps-webGenera automáticamente un fichero con el nombre audit_vps-web_YYYYMMDD_HHMMSS.txt. Para copiarlo a tu máquina local:
scp usuario@ip-servidor:~/audit_vps-web_*.txt ~/Downloads/El script está disponible en GitHub: jferrep/jaws-audit
Qué recopila y por qué
Sistema
Kernel, uptime, CPU, RAM, disco e inodos. Lo básico para saber en qué estado está la máquina antes de entrar en detalle. Un servidor con el disco al 95% o la carga disparada no merece el mismo análisis que uno en reposo.
Actualizaciones
Paquetes actualizables con foco en los de seguridad, estado de unattended-upgrades y si hay un reboot pendiente. Sorprende la cantidad de servidores que llevan semanas con un kernel nuevo instalado pero sin reiniciar.
Usuarios y accesos
Usuarios con shell válida, claves SSH autorizadas en todos los homes, últimos 20 logins y últimos 20 intentos fallidos. También un resumen de las IPs con más intentos en los últimos 7 días. Este bloque suele ser el más revelador.
Seguridad
Estado de fail2ban y sus jails, reglas UFW activas, todos los puertos escuchando y cuáles lo hacen en 0.0.0.0 (los peligrosos), ficheros SUID/SGID fuera de las rutas del sistema y directorios world-writable. También la configuración activa de SSH.
Servicios
Servicios activos, fallidos y habilitados en boot. Timers systemd. Útil para detectar servicios que nadie recuerda haber instalado.
Procesos y rendimiento
Top 15 por CPU y memoria, vmstat, iostat y conexiones establecidas por IP. Si algo consume recursos sin justificación, aquí aparece.
Nginx, PHP-FPM, WireGuard, Docker
Bloques específicos que solo se ejecutan si el servicio existe. Nginx incluye versión, test de configuración, parámetros clave, vhosts habilitados y top de IPs y códigos de respuesta en los últimos 10.000 accesos. WireGuard muestra peers, handshakes recientes y rutas activas.
Logs
Errores de kernel recientes, errores de journald en las últimas 24h y tamaño de los ficheros en /var/log. El tamaño de los logs a veces dice más que su contenido.
Lynis como complemento
El script recoge datos brutos. Para un análisis más estructurado uso Lynis, que evalúa el sistema contra un perfil de seguridad y da una puntuación — el hardening index.
sudo apt install -y lynis
sudo lynis audit system 2>/dev/null | grep -E "Hardening index|Warnings|Suggestions"La puntuación no es un objetivo en sí misma. Es un punto de referencia para comparar auditorías. Un servidor que pasa de 68 a 76 entre dos revisiones ha mejorado, aunque esté lejos del 100 teórico.
En el próximo artículo, lo que encontré al pasar ambas herramientas por mis dos servidores: qué era un problema real, qué era ruido y cómo distinguirlos.