
Kit modular de herramientas Bash que fortalece los sistemas Debian/Ubuntu para competiciones CyberPatriot, automatizando el endurecimiento de cuentas, firewall, SSH, PAM y servicios con registro y copias de seguridad.
Un kit de herramientas Bash modular para endurecer sistemas de la familia Debian/Ubuntu bajo presión de tiempo en competencia. Construido y refinado a lo largo de múltiples temporadas de la CyberPatriot National Youth Cyber Defense Competition, habiendo alcanzado recientemente el nivel Platinum en la división Linux en la ronda semifinal de 2025.
Esto no es un marco de cumplimiento de propósito general. Es un automatizador de listas de verificación para un ejercicio cronometrado de seis horas: realiza la mayoría scriptable de una pasada de endurecimiento de Linux de forma correcta, rápida e idempotente, registra todo lo que tocó y deja las decisiones de criterio a la persona que lo ejecuta.
Las rondas de Linux de CyberPatriot puntúan una imagen en vivo contra una rúbrica que recompensa un conjunto bastante predecible de pasos de endurecimiento -- higiene de cuentas, política de contraseñas, configuración del firewall, exposición de servicios, permisos de archivos, nivel de parches -- bajo un límite de tiempo estricto, generalmente sin aviso previo de exactamente qué vulnerabilidades fueron plantadas. Hacer esa lista de verificación a mano, correctamente, bajo una cuenta regresiva, es donde los equipos pierden puntos fáciles por errores tipográficos y pasos olvidados, no por material desconocido.
Este kit de herramientas comenzó como un único script monolítico escrito bajo exactamente esa presión. Este repositorio es una reescritura de ese script: misma cobertura de la lista de verificación, reestructurado en módulos pequeños y de propósito único que son más fáciles de leer, probar y razonar de forma independiente, con cada decisión no obvia vinculada a una sección específica del CIS Benchmark o a un control de NIST SP 800-53 (ver Controles de seguridad y referencias).
flowchart TD
A[bin/harden.sh] --> B[lib/common.sh<br/>logging, backups, run wrapper]
A --> C[Service-role prompts<br/>or --config file]
A --> D[lib/packages.sh<br/>updates, attack-tool removal]
A --> E[lib/firewall.sh<br/>default-deny + ufw]
A --> F[lib/ssh.sh]
A --> G[lib/services.sh<br/>samba/ftp/mail/http/mysql/dns]
A --> H[lib/users.sh<br/>account review, hidden UID 0]
A --> I[lib/kernel.sh<br/>sysctl hardening]
A --> J[lib/pam.sh<br/>password policy, lockout]
A --> K[lib/filesystem.sh<br/>permissions, cron, banners]
A --> L[lib/monitoring.sh<br/>fail2ban, auditd, rkhunter]
A --> M[lib/forensics.sh<br/>baseline snapshot]
D & E & F & G & H & I & J & K & L & M --> N[(~/hardening-run/<br/>log + backups + baseline)]
Cada módulo es cargado por bin/harden.sh, que se encarga del análisis de argumentos,
el cuestionario de rol del servicio y el orden de ejecución. Los módulos no se llaman entre
sí directamente, y cada comando que cambia el estado en cada módulo pasa por el envoltorio
run() en lib/common.sh, lo que le da a todo el proyecto un único lugar para implementar
soporte de dry-run, registro consistente y manejo de errores no fatales.
git clone <this-repo>
cd cyberpatriot-linux-hardening
sudo ./bin/harden.sh
Se te hará una breve serie de preguntas de sí/no sobre el rol de la máquina (si necesita
Samba, FTP, SSH, un servidor web, etc.), y luego se ejecuta de forma desatendida a través de
los módulos listados arriba. Un registro, un conjunto completo de copias de seguridad de
configuración con marca de tiempo y una instantánea de línea base del sistema se escriben en
~/hardening-run/.
En una ronda real, omite las solicitudes de confirmación por paquete y responde las preguntas de rol desde un archivo de respuestas preparado en lugar de escribirlas en vivo:
cp examples/config.env.example my-machine.env
# edit my-machine.env for this box's actual role
sudo ./bin/harden.sh --config my-machine.env --auto-approve
¿Quieres ver exactamente qué haría antes de que toque algo?
sudo ./bin/harden.sh --dry-run --config my-machine.env
| Módulo | Hace |
|---|---|
lib/packages.sh | Actualización completa del sistema; elimina automáticamente crackers de contraseñas y herramientas de explotación; revisa herramientas de doble uso (nmap, Wireshark, netcat) y servicios heredados (VNC, NFS, telnet) antes de eliminarlos |
lib/firewall.sh | Denegar por defecto entrante / permitir por defecto saliente vía ufw, más un bloqueo explícito en un puerto de puerta trasera común conocido |
lib/ssh.sh | Cifrados/KEX/MACs modernos, sin inicio de sesión root, límites de conexión y sesión -- o elimina SSH por completo si el rol no lo necesita |
lib/services.sh | Samba, FTP, correo, impresión, MySQL, HTTP, DNS: cada uno se instala y se endurece mínimamente si el rol lo necesita, o se purga y se bloquea con firewall si no |
lib/users.sh | Revisión interactiva de cuentas existentes (derechos de administrador, eliminación, restablecimiento de contraseña), detección de cuentas ocultas con UID 0 y contraseñas vacías |
lib/kernel.sh | Configuraciones sysctl de la pila de red y autoprotección del kernel (enrutamiento de origen, redirecciones ICMP, ASLR, alcance de ptrace, restricción de dmesg/kptr) |
lib/pam.sh | Complejidad e historial de contraseñas vía pam_pwquality/pam_pwhistory, bloqueo de cuentas vía pam_faillock, caducidad de contraseñas en login.defs |
lib/filesystem.sh | Permisos de archivos principales, restricción de cron/at, un rc.local mínimo, banners legales de inicio de sesión, escaneo de solo lectura de SUID/escribibles por todos/archivos sin propietario |
lib/monitoring.sh | fail2ban y auditd por defecto; ClamAV y un barrido completo de rkhunter/chkrootkit son opcionales (ver Notas de seguridad para la competencia) |
lib/forensics.sh | Instantánea de solo lectura de usuarios, procesos, puertos en escucha y paquetes instalados para comparación posterior |
tools/find-port-owner.sh y tools/list-nonstandard-users.sh son
pequeñas utilidades independientes para el mismo tipo de trabajo de triaje, utilizables
independientemente del script principal -- consulta sus encabezados para el uso.
Un script de endurecimiento que rompe la máquina que se supone debe proteger es peor que inútil en una ronda cronometrada. Algunos valores por defecto reflejan eso, y vale la pena entenderlos antes de ejecutar esto de forma desatendida: