
Modulares Bash-Toolkit, das Debian/Ubuntu-Systeme für CyberPatriot-Wettbewerbe härtet und die Härtung von Konten, Firewall, SSH, PAM und Diensten mit Protokollierung und Backups automatisiert.
Ein modulares Bash-Toolkit zur Härtung von Systemen der Debian/Ubuntu-Familie unter Wettkampfzeitdruck. Entwickelt und verfeinert über mehrere Saisons des CyberPatriot National Youth Cyber Defense Competition, zuletzt mit Platin-Tier-Platzierung in der Linux-Division in der Halbfinalrunde 2025.
Dies ist kein universelles Compliance-Framework. Es ist ein Checklisten- Automatisierer für eine sechsstündige zeitlich begrenzte Übung: Er erledigt den skriptbaren Großteil eines Linux-Härtungsdurchlaufs korrekt, schnell und idempotent, protokolliert alles, was er angefasst hat, und überlässt die Ermessensentscheidungen der Person, die ihn ausführt.
Die Linux-Runden von CyberPatriot bewerten ein Live-Image anhand eines Rubrik, die eine ziemlich vorhersehbare Reihe von Härtungsschritten belohnt -- Account-Hygiene, Passwortrichtlinie, Firewall-Konfiguration, Dienstoffenlegung, Dateiberechtigungen, Patch-Stand -- unter einem harten Zeitlimit, meist ohne vorherige Ankündigung, welche Schwachstellen genau platziert wurden. Diese Checkliste von Hand, korrekt, unter einem Countdown zu erledigen, ist der Punkt, an dem Teams leichte Punkte durch Tippfehler und vergessene Schritte verlieren, nicht durch unbekanntes Material.
Dieses Toolkit begann als ein einziges monolithisches Skript, das genau unter diesem Druck geschrieben wurde. Dieses Repository ist eine Neufassung dieses Skripts: gleiche Checklisten-Abdeckung, umstrukturiert in kleine, zweckgebundene Module, die leichter zu lesen, zu testen und unabhängig zu durchdenken sind, wobei jede nicht offensichtliche Entscheidung auf einen bestimmten CIS-Benchmark-Abschnitt oder eine NIST-SP-800-53-Kontrolle zurückgeführt wird (siehe Sicherheitskontrollen und Referenzen).
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)]
Jedes Modul wird von bin/harden.sh eingebunden, das die Argumentverarbeitung,
den Fragebogen zur Dienstrrolle und die Ausführungsreihenfolge verwaltet. Module
rufen sich nicht gegenseitig direkt auf, und jeder zustandsändernde Befehl in jedem
Modul läuft durch den run()-Wrapper in lib/common.sh, was dem gesamten Projekt
einen einzigen Ort gibt, um Dry-Run-Unterstützung, konsistentes Logging und
nicht-fatale Fehlerbehandlung zu implementieren.
git clone <this-repo>
cd cyberpatriot-linux-hardening
sudo ./bin/harden.sh
Sie werden eine kurze Reihe von Ja/Nein-Fragen zur Rolle der Maschine gefragt
(braucht sie Samba, FTP, SSH, einen Webserver und so weiter), dann läuft es
unbeaufsichtigt durch die oben aufgeführten Module. Ein Log, ein vollständiger Satz
zeitgestempelter Konfigurations-Backups und ein System-Baseline-Snapshot werden nach
~/hardening-run/ geschrieben.
In einer tatsächlichen Runde überspringen Sie die Bestätigungsaufforderungen pro Paket und beantworten Sie die Rollenfragen aus einer vorbereiteten Antwortdatei, anstatt sie live einzugeben:
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
Möchten Sie genau sehen, was es tun würde, bevor es irgendetwas anfasst?
sudo ./bin/harden.sh --dry-run --config my-machine.env
| Modul | Tut |
|---|---|
lib/packages.sh | Vollständiges System-Update; entfernt Passwort-Cracker und Exploitation-Tools automatisch; prüft Dual-Use-Tools (nmap, Wireshark, netcat) und Legacy-Dienste (VNC, NFS, telnet) vor deren Entfernung |
lib/firewall.sh | Default-Deny eingehend / Default-Allow ausgehend via ufw, plus expliziter Block auf einen bekannten gängigen Backdoor-Port |
lib/ssh.sh | Moderne Ciphers/KEX/MACs, kein Root-Login, Verbindungs- und Sitzungslimits -- oder entfernt SSH vollständig, wenn die Rolle es nicht braucht |
lib/services.sh | Samba, FTP, Mail, Drucken, MySQL, HTTP, DNS: jeweils installiert und minimal gehärtet, wenn die Rolle es braucht, oder entfernt und per Firewall abgeriegelt, wenn nicht |
lib/users.sh | Interaktive Überprüfung bestehender Accounts (Admin-Rechte, Löschung, Passwort-Reset), Erkennung versteckter UID-0-Accounts und leerer Passwörter |
lib/kernel.sh | Sysctl-Einstellungen für Netzwerk-Stack und Kernel-Selbstschutz (Source Routing, ICMP-Redirects, ASLR, ptrace-Scope, dmesg/kptr-Beschränkung) |
lib/pam.sh | Passwortkomplexität und -historie via pam_pwquality/pam_pwhistory, Account-Sperrung via pam_faillock, Passwort-Aging in login.defs |
lib/filesystem.sh | Kern-Dateiberechtigungen, cron/at-Beschränkung, ein minimales rc.local, rechtliche Login-Banner, Read-only-Scan auf SUID/world-writable/verwaiste Dateien |
lib/monitoring.sh | fail2ban und auditd standardmäßig; ClamAV und ein vollständiger rkhunter/chkrootkit-Sweep sind Opt-in (siehe Sicherheitshinweise für den Wettkampf) |
lib/forensics.sh | Read-only-Snapshot von Benutzern, Prozessen, lauschenden Ports und installierten Paketen für spätere Vergleiche |
tools/find-port-owner.sh und tools/list-nonstandard-users.sh sind
kleine eigenständige Utilities für dieselbe Art von Triage-Arbeit, unabhängig
vom Hauptskript nutzbar -- siehe deren Header für die Verwendung.
Ein Härtungsskript, das die Maschine beschädigt, die es schützen soll, ist in einer zeitlich begrenzten Runde schlimmer als nutzlos. Einige Standardeinstellungen spiegeln das wider und sind es wert, verstanden zu werden, bevor Sie dies unbeaufsichtigt ausführen: