
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:
SSH_PASSWORD_AUTH=no), aber der Standard hier bevorzugt es, ein Team nicht
aus seiner eigenen Maschine auszusperren, wenn noch niemand Schlüssel
bereitgestellt hat.INSTALL_CLAMAV, RUN_BASELINE_SCAN), weil sie die zwei langsamsten Dinge sind,
die dieses Skript tun kann, und keines von beiden den Systemzustand von sich aus
ändert. Aktivieren Sie sie, wenn Ihre Checkliste sie erfordert oder Sie Zeit
übrig haben.~/hardening-run/baseline/listening_ports.txt aus einem vorherigen Lauf, wenn
Sie unsicher sind, was tatsächlich lauscht, bevor Sie eine Maschine zum ersten
Mal härten.docs/security-controls.md für das manuelle Verfahren.bin/harden.sh fragt interaktiv nach der Dienstrrolle der Maschine, wenn Sie
nicht im Voraus antworten. Um die Aufforderungen zu überspringen, kopieren Sie
examples/config.env.example, tragen Sie die tatsächliche Rolle ein und übergeben
Sie sie mit --config. Jede Variable, die Sie in der Datei weglassen, fällt auf
eine interaktive Aufforderung zurück, sodass eine teilweise ausgefüllte
Konfigurationsdatei in Ordnung ist.
sudo ./bin/harden.sh --config my-machine.env
Flags:
| Flag | Wirkung |
|---|---|
--config FILE | Lädt Rollen-/Richtlinien-Antworten aus einer Env-Datei |
--dry-run | Protokolliert jede Aktion, die ausgeführt würde; ändert nichts |
--auto-approve | Überspringt die Bestätigungsaufforderungen pro Paket-Entfernung |
.
├── 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
Jedes Skript wird bei jedem Push mit ShellCheck via
GitHub Actions gelintet (.github/workflows/shellcheck.yml). Um lokal vor dem
Öffnen eines PR zu prüfen:
shellcheck lib/*.sh bin/*.sh tools/*.sh
bin/harden.sh --dry-run ist auch selbst ein Test: Es übt den Kontrollfluss und
das Logging jedes Moduls aus, ohne das Dateisystem anzufassen oder etwas zu
installieren, und ist der schnellste Weg, eine Änderung gegen eine
Wegwerf-VM auf Plausibilität zu prüfen, bevor Sie sie wirklich ausführen. Siehe
CONTRIBUTING.md für die vollständigen Erwartungen an neue Module (Idempotenz,
Weiterleitung destruktiver Aktionen durch run() und Angabe einer Quelle für
jeden neuen Härtungsschritt).
Der Header-Kommentar jedes Moduls und docs/security-controls.md zitieren den
spezifischen Standardabschnitt hinter jeder Entscheidung. Durchgängig verwendete
Primärquellen:
| Standard | Quelle |
|---|---|
| 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/ |
Referenzierte Erkennungstools (nicht mitgeliefert, via apt installiert):
fail2ban,
Linux Audit / auditd,
rkhunter,
chkrootkit. Lynis
und OpenSCAP werden als nachfolgendes,
unabhängiges Audit empfohlen und werden von diesem Projekt nicht automatisch
ausgeführt.
Siehe docs/security-controls.md für die vollständige Begründung hinter jedem
dieser Punkte.
MIT. Siehe LICENSE.