
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:
SSH_PASSWORD_AUTH=no), pero el valor por defecto aquí favorece no dejar a un
equipo fuera de su propia máquina cuando nadie ha provisionado claves todavía.INSTALL_CLAMAV, RUN_BASELINE_SCAN), porque son las dos
cosas más lentas que este script puede hacer y ninguna cambia el estado del sistema por
sí sola. Actívalas si tu lista de verificación las requiere o si tienes
tiempo de sobra.~/hardening-run/baseline/listening_ports.txt
de una ejecución previa si no estás seguro de qué está realmente escuchando antes de
endurecer una máquina por primera vez.docs/security-controls.md para el
procedimiento manual.bin/harden.sh preguntará interactivamente sobre el rol de servicio de la máquina
si no respondes de antemano. Para omitir las preguntas, copia
examples/config.env.example, completa el rol real y pásalo con
--config. Cualquier variable que omitas del archivo recurre a una
pregunta interactiva, así que un archivo de configuración parcialmente completo está bien.
sudo ./bin/harden.sh --config my-machine.env
Opciones:
| Opción | Efecto |
|---|---|
--config FILE | Carga respuestas de rol/política desde un archivo env |
--dry-run | Registra cada acción que se tomaría; no cambia nada |
--auto-approve | Omite las solicitudes de confirmación de purga por paquete |
.
├── bin/harden.sh orchestrator: parses args, asks role questions, runs modules in order
├── lib/
│ ├── common.sh logging, backups, idempotent file edits, the run() wrapper
│ ├── packages.sh updates, attack-tool removal
│ ├── ssh.sh SSH install/removal and hardening
│ ├── services.sh samba/ftp/telnet/mail/printing/mysql/http/dns
│ ├── firewall.sh ufw default-deny posture
│ ├── users.sh account review, hidden UID 0 / empty password detection
│ ├── kernel.sh sysctl hardening
│ ├── pam.sh password policy, account lockout
│ ├── filesystem.sh permissions, cron, rc.local, banners, anomaly scan
│ ├── monitoring.sh fail2ban, auditd, rkhunter, chkrootkit, ClamAV
│ └── forensics.sh read-only system baseline snapshot
├── tools/
│ ├── find-port-owner.sh resolve a listening TCP port to a process path
│ └── list-nonstandard-users.sh flag UID >= 1000 accounts not on an expected list
├── docs/
│ ├── security-controls.md every hardening decision, mapped to its source standard
│ └── editor-cheatsheet.md small editor commands worth remembering under pressure
├── examples/config.env.example annotated template for non-interactive runs
└── .github/workflows/shellcheck.yml lint on every push/PR
Cada script se analiza con ShellCheck en
cada push vía GitHub Actions (.github/workflows/shellcheck.yml). Para verificar
localmente antes de abrir un PR:
shellcheck lib/*.sh bin/*.sh tools/*.sh
bin/harden.sh --dry-run es también, en sí mismo, una prueba: ejercita el flujo de control
y el registro de cada módulo sin tocar el sistema de archivos ni instalar nada, y es la forma
más rápida de verificar un cambio contra una VM desechable antes de ejecutarlo de verdad.
Consulta CONTRIBUTING.md para las expectativas completas sobre nuevos módulos (idempotencia,
enrutar acciones destructivas a través de run() y citar una fuente para cualquier
nuevo paso de endurecimiento).
El comentario de encabezado de cada módulo y docs/security-controls.md citan la
sección específica del estándar detrás de cada decisión. Fuentes primarias utilizadas
en todo el proyecto:
| Estándar | Fuente |
|---|---|
| CIS Ubuntu Linux Benchmark | https://www.cisecurity.org/benchmark/ubuntu_linux |
| NIST SP 800-53 Rev. 5 | https://csrc.nist.gov/pubs/sp/800/53/r5/upd1/final |
| DISA STIG for Ubuntu | https://public.cyber.mil/stigs/downloads/ |
| Mozilla OpenSSH modern configuration guidelines | https://infosec.mozilla.org/guidelines/openssh |
| CyberPatriot National Youth Cyber Defense Competition | https://www.uscyberpatriot.org/ |
Herramientas de detección referenciadas (no incluidas en el repositorio, instaladas vía apt):
fail2ban,
Linux Audit / auditd,
rkhunter,
chkrootkit. Lynis
y OpenSCAP se recomiendan como una auditoría de seguimiento
independiente y no son ejecutados automáticamente por este proyecto.
Consulta docs/security-controls.md para el razonamiento completo detrás de cada una de
estas.
MIT. Ver LICENSE.