Skip to content

Hardened installer (v2): Sicherheits-Fixes + CI-Tests - #1

Merged
CallMeTechie merged 2 commits into
mainfrom
hardened-v2
May 6, 2026
Merged

Hardened installer (v2): Sicherheits-Fixes + CI-Tests#1
CallMeTechie merged 2 commits into
mainfrom
hardened-v2

Conversation

@CallMeTechie

@CallMeTechie CallMeTechie commented May 6, 2026

Copy link
Copy Markdown
Owner

Summary

Diese PR ersetzt den ursprünglichen install.sh durch eine gehärtete Variante und fügt eine vollständige CI-Test-Suite hinzu.

Kritische Sicherheits-Fixes (install.sh)

  • Authentifizierung: Login-Form, bcrypt-Hash (cost 12), PHP-Sessions mit Secure/HttpOnly/SameSite=Strict, Idle-Timeout, Session-Regeneration nach Login
  • CSRF-Schutz: Token in Session, X-CSRF-Token-Header für jede mutierende Anfrage
  • Same-Origin: kein Access-Control-Allow-Origin: * mehr; plus X-Content-Type-Options, X-Frame-Options: DENY, Referrer-Policy
  • Caddyfile-Sanitizer: strikte Domain-/IP-/Port-/Protokoll-Validierung; additional_config (Direktiven-Injection-Vektor) entfernt; Logfile-Name escaped (Path-Traversal blockiert)
  • Sudoers ohne Argumente: Reload-Helper liest fixen Stage-Pfad; visudo -c validiert vor Aktivierung
  • Echtes Let's Encrypt via globaler email-Direktive (statt tls internal)
  • Brute-Force-Limit: 5 Fehlversuche / 15 Min pro IP + zufällige Verzögerung gegen Timing-Angriffe
  • CURLOPT_SSL_VERIFYPEER in Reachability-Checks aktiviert
  • flock() auf domains.json und Rate-Limit-Datei

Bug-Fixes

  • $PHP_VERSION wird nach Installation aus dem PHP-Binary gelesen (nicht aus apt-cache)
  • Apache/Nginx-Doppelstack entfernt → Caddy + PHP-FPM nativ via php_fastcgi
  • Stille >/dev/null 2>&1-Maskierung kritischer Schritte zurückgenommen
  • Tageslimit für Caddyfile-Backups (max. 10/Tag)

Interaktive Eingaben (während der Installation)

Domain · E-Mail · SSL ja/nein · Port (1024–65535) · Admin-Username · Admin-Passwort (mit Bestätigung, mind. 12 Zeichen, sofort als bcrypt-Hash gespeichert, Klartext geleert) · Firewall ja/nein · Bestätigung der Zusammenfassung

Neue Test-Infrastruktur

Job Was geprüft wird
shell-lint bash -n install.sh + shellcheck -S error
php-lint Eingebettete PHP-Heredocs werden extrahiert und mit php -l gelintet
bats-tests 25 Bats-Tests für is_valid_domain / is_valid_email / Pfad-Konstanten
php-validators 43 PHP-Tests für validate_domain / _ip / _port / _protocol + safe_log_name (inkl. Caddyfile-Injection, Path-Traversal, Shell-Injection)
caddyfile-validation caddy validate auf einem repräsentativen Sample-Caddyfile

install.sh wurde am Ende mit einem BASH_SOURCE-Guard versehen, sodass Bats die Funktionen importieren kann ohne main() zu starten.

Test plan

  • Lokal: bash -n install.sh
  • Lokal: shellcheck -S error install.sh
  • Lokal: bats tests/install.bats → 25/25 ✓
  • Lokal: php tests/test-validators.php → 43/43 ✓
  • Lokal: caddy validate tests/sample-caddyfile → "Valid configuration" ✓
  • CI auf hardened-v2: alle 5 Jobs grün (Run #25452674812)
  • Manueller End-to-End-Test in Test-VM (Debian 12 / Ubuntu 24.04) vor Merge empfohlen
  • Manueller Login-Test mit zufälligem Passwort + Brute-Force-Versuch (Rate-Limit)
  • Stichprobe: Caddyfile-Injection-Versuch über UI ablehnen lassen

CallMeTechie and others added 2 commits May 6, 2026 20:07
Hauptänderungen install.sh (kritische Sicherheits-Fixes + Bugs):
- Authentifizierung: Login-Form, bcrypt-Hash, PHP-Sessions, Rate-Limit
- CSRF-Token-Schutz für alle mutierenden API-Endpunkte
- Caddyfile-Generator: strikte Domain-/IP-/Port-Validierung,
  Direktiven-Injection ("additional_config") entfernt, Logpfad escaped
- Sudoers ohne Argumente: Reload-Helper liest fixen Stage-Pfad
- Echtes Let's Encrypt via globaler email-Direktive (kein "tls internal")
- CURLOPT_SSL_VERIFYPEER aktiviert
- flock() für domains.json gegen Race Conditions
- PHP-Version nach Installation aus Binary statt apt-cache
- Stack vereinfacht: Caddy + PHP-FPM nativ (Apache/Nginx-Doppelstack entfernt)
- Login-Credentials und Konfiguration interaktiv abgefragt

Neue Test-Infrastruktur:
- .github/workflows/ci.yml: shell-lint, php-lint, bats, php-validators,
  caddyfile-validation
- tests/install.bats: 25 Bats-Unit-Tests für Bash-Validierungsfunktionen
- tests/test-validators.php: 43 PHP-Unit-Tests für api.php-Validatoren
- tests/extract-php.sh: extrahiert eingebettete PHP-Heredocs für php -l
- tests/sample-caddyfile: repräsentatives Caddyfile für caddy validate

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
caddy validate öffnet die in der Konfig referenzierten Log-Files real,
nicht nur Syntax-Check. Ohne sudo mkdir + chmod fail der Step mit
"permission denied" auf /var/log/caddy/<domain>.log.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@CallMeTechie
CallMeTechie merged commit 9e9785a into main May 6, 2026
10 checks passed
@CallMeTechie
CallMeTechie deleted the hardened-v2 branch May 6, 2026 18:16
CallMeTechie added a commit that referenced this pull request May 6, 2026
Hardened installer (v2): Sicherheits-Fixes + CI-Tests
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant