
Toolkit Bash modulare che rafforza i sistemi Debian/Ubuntu per le competizioni CyberPatriot, automatizzando l'hardening di account, firewall, SSH, PAM e servizi con logging e backup.
Un toolkit Bash modulare per irrobustire sistemi della famiglia Debian/Ubuntu sotto la pressione del tempo di gara. Costruito e perfezionato nel corso di molteplici stagioni della CyberPatriot National Youth Cyber Defense Competition, recentemente classificatosi al livello Platinum nella divisione Linux al turno semifinale del 2025.
Questo non è un framework di conformità generico. È un automatizzatore di checklist per un esercizio a tempo di sei ore: esegue la maggioranza scriptabile di un passaggio di hardening Linux in modo corretto, rapido e idempotente, registra tutto ciò che ha toccato e lascia le decisioni di giudizio alla persona che lo esegue.
I round Linux di CyberPatriot valutano un'immagine live rispetto a una rubrica che premia un insieme piuttosto prevedibile di passaggi di hardening -- igiene degli account, policy delle password, configurazione del firewall, esposizione dei servizi, permessi dei file, livello di patch -- entro un limite di tempo rigido, di solito senza preavviso su quali vulnerabilità siano state inserite. Eseguire quella checklist a mano, correttamente, sotto un conto alla rovescia, è dove i team perdono punti facili a causa di errori di battitura e passaggi dimenticati, non per materiale sconosciuto.
Questo toolkit è nato come un singolo script monolitico scritto esattamente sotto quella pressione. Questo repository è una riscrittura di quello script: stessa copertura della checklist, ristrutturata in piccoli moduli monofunzionali che sono più facili da leggere, testare e ragionare in modo indipendente, con ogni decisione non ovvia collegata a una specifica sezione del CIS Benchmark o a un controllo NIST SP 800-53 (vedi Controlli di sicurezza e riferimenti).
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)]
Ogni modulo è caricato tramite source da bin/harden.sh, che gestisce il parsing
degli argomenti, il questionario sul ruolo del servizio e l'ordine di esecuzione. I moduli non si
chiamano direttamente tra loro, e ogni comando che modifica lo stato in ogni modulo
passa attraverso il wrapper run() in lib/common.sh, che dà
all'intero progetto un unico punto in cui implementare il supporto dry-run, un logging
coerente e una gestione degli errori non fatale.
git clone <this-repo>
cd cyberpatriot-linux-hardening
sudo ./bin/harden.sh
Ti verrà chiesta una breve serie di domande sì/no sul ruolo della macchina
(se necessita di Samba, FTP, SSH, un web server e così via), poi
viene eseguito senza supervisione attraverso i moduli elencati sopra. Un log, un set completo di
backup di configurazione con timestamp e uno snapshot di baseline del sistema vengono scritti in
~/hardening-run/.
In un round reale, salta i prompt di conferma per singolo pacchetto e rispondi alle domande sul ruolo da un file di risposte preparato invece di digitarle dal 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
Vuoi vedere esattamente cosa farebbe prima che tocchi qualcosa?
sudo ./bin/harden.sh --dry-run --config my-machine.env
| Modulo | Fa |
|---|---|
lib/packages.sh | Aggiornamento completo del sistema; rimuove automaticamente cracker di password e strumenti di exploitation; esamina strumenti a doppio uso (nmap, Wireshark, netcat) e servizi legacy (VNC, NFS, telnet) prima di rimuoverli |
lib/firewall.sh | Default-deny in ingresso / default-allow in uscita tramite ufw, più un blocco esplicito su una nota porta backdoor comune |
lib/ssh.sh | Cifrari/KEX/MAC moderni, nessun login root, limiti di connessione e sessione -- oppure rimuove completamente SSH se il ruolo non ne ha bisogno |
lib/services.sh | Samba, FTP, mail, printing, MySQL, HTTP, DNS: ciascuno viene installato e minimamente irrobustito se il ruolo ne ha bisogno, oppure rimosso e bloccato dal firewall se no |
lib/users.sh | Revisione interattiva degli account esistenti (diritti admin, cancellazione, reset password), rilevamento di account nascosti con UID 0 e password vuote |
lib/kernel.sh | Impostazioni sysctl per lo stack di rete e l'autoprotezione del kernel (source routing, redirect ICMP, ASLR, scope ptrace, restrizione dmesg/kptr) |
lib/pam.sh | Complessità e cronologia delle password tramite pam_pwquality/pam_pwhistory, blocco account tramite pam_faillock, scadenza password in login.defs |
lib/filesystem.sh | Permessi dei file principali, restrizione cron/at, un rc.local minimale, banner legali di login, scansione in sola lettura di SUID/world-writable/file senza proprietario |
lib/monitoring.sh | fail2ban e auditd per impostazione predefinita; ClamAV e una scansione completa rkhunter/chkrootkit sono opt-in (vedi Note di sicurezza per la competizione) |
lib/forensics.sh | Snapshot in sola lettura di utenti, processi, porte in ascolto e pacchetti installati per confronti successivi |
tools/find-port-owner.sh e tools/list-nonstandard-users.sh sono
piccole utility autonome per lo stesso tipo di lavoro di triage, utilizzabili
indipendentemente dallo script principale -- vedi le loro intestazioni per l'uso.
Uno script di hardening che rompe la macchina che dovrebbe proteggere è peggio che inutile in un round a tempo. Alcune impostazioni predefinite lo riflettono, e vale la pena comprenderle prima di eseguirlo senza supervisione: