[LAB_REPORT] Hardened Web-Stack: Ghost & FreeScout hinter Cloudflare-Tunnels

Wer KRITIS-Infrastrukturen doziert, darf seinen eigenen Stack nicht auf "Standard-Einstellungen" laufen lassen. Ein Web-CMS wie Ghost oder ein Helpdesk wie FreeScout in einer Hochsicherheitsumgebung zu hosten, erfordert mehr als ein docker-compose up.

Hier ist das Deployment-Protokoll für einen lokal gehärteten Stack auf Ubuntu 24.04 LTS, isoliert in VLANs und abgesichert durch deterministisches Container-Networking.

1. Die Host-Ebene: UEFI & LVM-Härtung

Die Basis bildet eine Hyper-V Gen2 VM. Der erste Stolperstein: UEFI Secure Boot. Ubuntu 24.04 signiert den Kernel, aber Hyper-V erzwingt standardmäßig Microsoft-Templates.

  • Fix: Umstellung auf Microsoft UEFI Certificate Authority in der VM-Konfiguration.

Beim Storage-Layout ist ein Volllaufen der Root-Partition durch Docker-Logs oder Image-Caches ein vermeidbares Risiko. Wir nutzen LVM (vg0), um /var/lib/docker auf ein dediziertes Logical Volume zu legen:

  • / (Root): 15 GB
  • /var/lib/docker: 30 GB
  • Spare: 12 GB (für Online-Expansion via lvextend).

2. Netzwerk-Isolierung (L2/L3)

Der Stack operiert im VLAN 40 (WebServer). Der Uplink ist ein 802.1Q Trunk.

  • Firewall-Policy: LAN-In blockiert alles Richtung RFC1918 (interne Netze).
  • Inbound-Traffic: Es gibt keine offenen Ports (No Port-Forwarding). Der Zugriff erfolgt ausschließlich über einen ausgehenden Cloudflare-Tunnel (cloudflared). Identity-Pre-Authentication erfolgt am Edge, bevor ein Paket den Host erreicht.

3. Deterministisches Docker-Networking

Wir nutzen keine globalen Bridges. Jeder Service-Stack erhält isolierte Namespaces:

  • cloudflare-net: Frontend-Kommunikation zum Tunnel.
  • ghost-db-net: Internal only. Die MySQL-Instanz sieht niemals das Internet.

Um Log-Spamming zu verhindern, erzwingen wir ein globales Limit in der /etc/docker/daemon.json:

codeJSON

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

4. Der "Mail-Lock" Bypass (The Deep Dive)

Ghost CMS hat eine kritische Schwäche: Es erzwingt beim Login von neuen IP-Adressen den Versand einer Sicherheits-E-Mail. In isolierten Labor-Umgebungen ohne SMTP-Relay führt das zum Authentication-Lockout.

Die Lösung: Integration von mailpit als SMTP-Dummy im internal Netz.
Um den 6-stelligen Verifizierungscode abzugreifen, ohne ein Mail-Frontend zu öffnen, nutzen wir einen direkten API-Call innerhalb des Docker-Netzwerks:

codeBash

sudo docker run --rm --network webstack_ghost-db-net alpine \
wget -qO- http://mailpit:8025/api/v1/messages | grep -oE '[0-9]{6}'

Status: Authentication Bypass erfolgreich.

5. Persistence & Backup-SLA

Daten ohne konsistentes Backup sind nur temporäre Artefakte. Wir fahren ein Cold-Backup-Modell um 03:00 Uhr:

  1. docker compose down (Sicherung der SQL-Konsistenz).
  2. tar Kompression des gesamten /opt/webstack.
  3. docker compose up -d.
  4. Retention-Policy: 7 Tage lokal.

Fazit

Ein moderner Web-Stack ist kein Spielplatz. Durch die Kombination aus VLAN-SegregationLVM-Management und Tunneling-Technologie eliminieren wir klassische Angriffsvektoren wie offene Ports und unkontrolliertes Partitionswachstum.

Die Souveränität über die eigenen Daten beginnt beim physischen Switchport.