[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:
- docker compose down (Sicherung der SQL-Konsistenz).
- tar Kompression des gesamten /opt/webstack.
- docker compose up -d.
- Retention-Policy: 7 Tage lokal.
Fazit
Ein moderner Web-Stack ist kein Spielplatz. Durch die Kombination aus VLAN-Segregation, LVM-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.