Security Assessment Report

Hetzner EX44 Dedicated Server — Moro Vision Infrastruktur
Datum: 23. März 2026 Server: 188.40.46.49 Scope: Full-Stack Assessment Erstellt von: Claude Code
B+
Gesamtbewertung
14
Bestanden
6
Warnungen
3
Kritisch

Inhaltsverzeichnis

  1. Executive Summary
  2. Infrastruktur-Übersicht
  3. Netzwerk & Firewall
  4. SSH & Zugangskontrolle
  5. Docker & Container Security
  6. Traefik Reverse Proxy & TLS
  7. Authentifizierung & Autorisierung
  8. Datensicherheit & Secrets
  9. Monitoring & Intrusion Detection
  10. Backup & Recovery
  11. Web Application Security
  12. Alle Findings (sortiert nach Priorität)
  13. Empfohlene Massnahmen

1. Executive Summary

Dein Hetzner-Server zeigt eine solide Sicherheitsbasis mit mehreren professionell umgesetzten Schutzmechanismen. Die Architektur mit Proxmox-Hypervisor, WireGuard-VPN, Docker-VM und Traefik-Reverse-Proxy ist gut durchdacht.

Stärken der Infrastruktur
Kritische Punkte, die sofort behoben werden sollten:
  1. Mehrere Services öffentlich zugänglich ohne Authentifizierung (Portainer, Open WebUI, LightRAG, Neo4j, Flowise, Lounger)
  2. UFW-Firewall auf Docker-VM inaktiv — nur CrowdSec als Schutz
  3. CSP-Header blockiert Google Tag Manager (GTM wird nicht korrekt geladen)

2. Infrastruktur-Übersicht

KomponenteDetailsStatus
HypervisorProxmox VE auf Hetzner EX44 (188.40.46.49)OK
Docker VMUbuntu 24.04.3 LTS, Kernel 6.8.0-94OK
RAM32 GB (6.2 GB genutzt, 25 GB verfügbar)OK
Disk193 GB (83 GB genutzt / 43%)OK
SwapNicht konfiguriert (0 B)WARNUNG
VPNWireGuard (10.10.99.0/24)OK
Reverse ProxyTraefik v2.11OK
Container23 Container (20 aktiv)INFO

Netzwerk-Topologie

Internet (188.40.46.49)
  │
  ├─ Proxmox Host (10.10.99.1)
  │   ├─ WireGuard VPN (:51820) → 10.10.99.2 (dein Mac)
  │   ├─ Proxmox UI (:8006) — nur intern
  │   └─ SSH (:22) — nur VPN + intern
  │
  └─ Docker VM (10.10.10.10)
      ├─ Traefik (:80/:443) → einziger Public Entrypoint
      ├─ SSH (:22) — nur auf 10.10.10.10 (VPN only)
      ├─ CrowdSec (:6060/:8080 localhost)
      └─ 20+ Docker Container (nur intern)

3. Netzwerk & Firewall

Öffentlich erreichbare Ports

PortDienstBewertung
80/tcpTraefik (HTTP → HTTPS Redirect)OK
443/tcpTraefik (HTTPS, Let's Encrypt)OK
51820/udpWireGuard VPN (Proxmox Host)OK
OK Minimale Port-Exposition Nur Port 80, 443 und WireGuard sind öffentlich erreichbar. SSH ist auf die interne IP 10.10.10.10 gebunden — vorbildlich.

Firewall-Status

KRITISCH UFW-Firewall ist inaktiv auf Docker-VM Die UFW-Firewall ist deaktiviert (Status: inactive). Die iptables INPUT-Chain hat die Default-Policy ACCEPT mit nur einer CrowdSec-Rule. Das bedeutet: Falls CrowdSec ausfällt, gibt es keine Firewall-Schutzschicht.

Hinweis: UFW und Docker haben bekannte Kompatibilitätsprobleme (Docker umgeht UFW-Regeln). CrowdSec mit dem Firewall-Bouncer ist hier die effektivere Lösung. Trotzdem wird eine zusätzliche Absicherung empfohlen.

Proxmox Host Firewall

WARNUNG Proxmox Host hat keine iptables-Regeln Die INPUT-Chain auf dem Proxmox Host hat die Default-Policy ACCEPT ohne Regeln. Der Host verlässt sich komplett auf die Hetzner-Netzwerk-Konfiguration. Empfohlen: Proxmox Firewall (pve-firewall) aktivieren.

4. SSH & Zugangskontrolle

ParameterWertBewertung
ListenAddress10.10.10.10 (nur VPN)HERVORRAGEND
PasswordAuthenticationnoOK
Shell-BenutzerNur root und syncOK
Fail2ban (SSH)Aktiv, 0 Bans (keine Angriffe möglich über VPN)OK
HERVORRAGEND SSH-Konfiguration SSH ist ausschliesslich über die VPN-IP 10.10.10.10 erreichbar. Passwort-Login ist deaktiviert. Dies ist eine der besten Absicherungen — SSH-Brute-Force-Angriffe sind physisch unmöglich, da der Port nicht öffentlich erreichbar ist.
WARNUNG Nur Root-Zugang vorhanden Es gibt keinen separaten Admin-Benutzer. Best Practice wäre ein dedizierter User mit sudo-Rechten und deaktiviertem PermitRootLogin. Da SSH nur über VPN erreichbar ist, ist das Risiko jedoch gering.

5. Docker & Container Security

Container-Übersicht (20 aktiv)

ContainerImageAlterStatus
traefiktraefik:v2.115 WochenOK
autheliaauthelia:4.3813 Monate!VERALTET
n8nn8nio/n8n:latest5 WochenOK
portainerportainer-ce:latest3 WochenOK
open-webuiopen-webui:main2 MonateUPDATE
flowiseflowise:latest6 WochenOK
neo4jneo4j:5.26-community6 WochenOK
lightraglightrag:latest2 MonateUPDATE
crawl4aicrawl4ai:all-amd6415 Monate!VERALTET
qdrantqdrant:latest3 MonateUPDATE
5× postgrespostgres:16-alpine / pgvector:pg165–7 WochenOK
morovision-webnginx:alpine (custom)AktuellOK
KRITISCH Authelia 4.38 ist 13 Monate alt Authelia ist dein zentraler Authentifizierungsdienst. Version 4.38 kann bekannte Sicherheitslücken enthalten. Die aktuelle Version ist 4.39.x. Ein Update ist dringend empfohlen — gerade weil Authelia den Zugang zu sensiblen Diensten schützt.
WARNUNG crawl4ai ist 15 Monate alt Das Image unclecode/crawl4ai:all-amd64 ist stark veraltet. Falls nicht aktiv genutzt, sollte der Container entfernt werden.

Docker Socket Exposition

WARNUNG Docker Socket an Traefik & Portainer gemountet Beide Container haben Zugriff auf /var/run/docker.sock (read-only bei Traefik). Ein kompromittierter Container mit Docker-Socket-Zugriff kann den gesamten Host übernehmen. Portainer hat vollen Zugriff. Empfehlung: Portainer nur über VPN erreichbar machen.

Datenbank-Isolation

OK Keine Datenbanken auf Host-Ports exponiert Alle 5 PostgreSQL-Container und Neo4j sind nur innerhalb des Docker-Netzwerks erreichbar. Kein Port wird an 0.0.0.0 gebunden — vorbildlich.

6. Traefik Reverse Proxy & TLS

KonfigurationWertBewertung
HTTP → HTTPS RedirectAktiv (global via entryPoint)OK
TLS/SSLLet's Encrypt (ACME httpChallenge)OK
acme.json Permissions-rw------- (600)OK
exposedByDefaultfalseOK
Traefik DashboardBasic Auth geschütztOK
HSTS HeaderAktiv (31536000s, includeSubdomains, preload)OK
OK Traefik-Konfiguration ist solide

Alle öffentlich erreichbaren Subdomains

SubdomainDienstAuthBewertung
morovision.chWebsite (nginx)Öffentlich (korrekt)OK
auth.morovision.chAutheliaLogin-PortalOK
n8n.ai.morovision.chn8n AutomationAuthelia 2FAOK
dashboard.ai.morovision.chMV DashboardAuthelia + secure-headersOK
insights.morovision.chMV InsightsAuthelia 2FAOK
track.morovision.chInsights TrackAuthelia 2FAOK
flowise.ai.morovision.chFlowise AIAuthelia 2FAOK
traefik.ai.morovision.chTraefik DashboardBasicAuthOK
portainer.ai.morovision.chPortainerKEINE Middleware!KRITISCH
chat.ai.morovision.chOpen WebUIKEINE Middleware!KRITISCH
lightrag.ai.morovision.chLightRAG APIKEINE Middleware!KRITISCH
neo4j.ai.morovision.chNeo4j BrowserKEINE Middleware!KRITISCH
lounger.morovision.chLounger AppKeine MiddlewarePRÜFEN
KRITISCH 4 sensible Services ohne Authentifizierung öffentlich erreichbar

Die folgenden Dienste sind über das Internet erreichbar ohne jegliche Authentifizierungs-Middleware:

Empfehlung: Mindestens authelia oder besser vpn-only Middleware auf alle diese Router setzen.

7. Authentifizierung & Autorisierung

Authelia-Konfiguration

ParameterWertBewertung
Default PolicydenyHERVORRAGEND
TOTP (2FA)Aktiviert (SHA1, 6-digit, 30s)OK
WebAuthnDeaktiviertINFO
Password Policyzxcvbn min_score 3OK
Password HashingArgon2id (3 iter, 64MB, 4 parallel)OK
BackendFile-based (users_database.yml)OK (single user)
OK Authelia ist gut konfiguriert Default-Policy deny, 2FA mit TOTP, starkes Password-Hashing (Argon2id) und eine gute Passwort-Policy. Die geschützten Dienste (n8n, Insights, Track, Flowise, Dashboard) erfordern alle 2FA.

Authentifizierungs-Matrix

DienstSchutzschicht 1Schutzschicht 2Schutzschicht 3
n8nAuthelia 2FAn8n eigenes Login
DashboardAutheliasecure-headers
Insights / TrackAuthelia 2FAApp-Login
FlowiseAuthelia 2FA
Traefik DashboardBasicAuth (usersfile)
PortainerPortainer LoginKeine Middleware
Open WebUIWebUI LoginKeine Middleware
LightRAGOFFEN
Neo4jNeo4j LoginKeine Middleware

8. Datensicherheit & Secrets

Environment-Dateien

DateiPermissionsBewertung
/opt/localAIagent/.env-rw------- (600)OK
/opt/localAIagent/lightrag/.env-rw-r--r-- (644)WARNUNG
/opt/localAIagent/mv-insights/.env-rw-r--r-- (644)WARNUNG
WARNUNG Zwei .env-Dateien sind world-readable lightrag/.env und mv-insights/.env haben Permissions 644 (alle können lesen). Diese Dateien enthalten wahrscheinlich API-Keys und Datenbank-Passwörter. Fix: chmod 600 auf beide Dateien.

Authelia Secrets

OK Secrets-Verzeichnis korrekt eingebunden Authelia Secrets sind als :ro (read-only) Volume gemountet.

9. Monitoring & Intrusion Detection

CrowdSec

MetrikWert
StatusAktiv
Firewall Bouncercs-firewall-bouncer v0.0.34, letzte Abfrage: 23.03.2026 10:15
Community Blocklist4'820 aktive Bans
Traefik-Logs analysiert65'180 Zeilen
HTTP Bruteforce geblockt1'377 IPs (via CAPI)
Crawler geblockt144 IPs
Scanner geblockt43 IPs
OK CrowdSec ist aktiv und funktioniert CrowdSec analysiert die Traefik Access-Logs und die System-Logs. Der Firewall-Bouncer ist verbunden und die Community Blocklist ist aktiv. Das System profitiert von der kollektiven Intelligenz des CrowdSec-Netzwerks.

Fail2ban

OK Fail2ban aktiv für SSH Läuft seit dem 18.03.2026. Da SSH nur über VPN erreichbar ist, wurden logischerweise 0 Bans registriert. Fail2ban dient hier als zusätzliche Sicherheitsschicht.

Automatische Updates

OK Unattended-Upgrades aktiv Sicherheitsupdates werden automatisch installiert. Letzte Updates: 19.03.2026 (snapd, libssh).

10. Backup & Recovery

AspektDetailsBewertung
Backup-Scriptweekly-backup.shOK
ZeitplanSonntags 03:00 Uhr (Crontab)OK
ZielHetzner Storage Box (u545392)OK
Retention4 WochenOK
UmfangPostgreSQL-Dumps, Configs, Docker VolumesOK
Recovery-TestUnbekanntPRÜFEN
OK Professionelles Backup-System Wöchentliches Backup auf externe Hetzner Storage Box mit 4 Wochen Retention. Das Script sichert Datenbanken, Konfigurationen und Docker Volumes. Der Ansatz ist solide.
EMPFEHLUNG Recovery-Test durchführen Es empfiehlt sich, einen Restore-Test durchzuführen, um sicherzustellen, dass die Backups tatsächlich wiederhergestellt werden können. Mindestens einmal pro Quartal.

11. Web Application Security (morovision.ch)

Security Headers

HeaderWertBewertung
X-Frame-OptionsSAMEORIGINOK
X-Content-Type-OptionsnosniffOK
X-XSS-Protection1; mode=blockOK
Referrer-Policystrict-origin-when-cross-originOK
Permissions-Policycamera=(), microphone=(), geolocation=()OK
Content-Security-PolicyRestriktiv konfiguriertPROBLEM
HSTS (via Traefik)max-age=31536000; includeSubDomains; preloadOK
WARNUNG CSP blockiert Google Tag Manager & SalesViewer

Die aktuelle Content-Security-Policy erlaubt nur script-src 'self' 'unsafe-inline'. Das blockiert:

Die CSP muss erweitert werden, damit GTM und SalesViewer funktionieren.

Nginx-Konfiguration

OK Gute Grundkonfiguration
HINWEIS Custom Error Pages zeigen index.html 404- und 500-Fehler werden auf index.html umgeleitet. Für eine Multi-Page-Site wäre eine dedizierte 404-Seite besser für die User Experience.

12. Alle Findings (sortiert nach Priorität)

Kritisch (sofort beheben)

#FindingRisikoAufwand
1 KRITISCH Portainer, Open WebUI, LightRAG, Neo4j öffentlich ohne Middleware
Jeder kann diese Dienste erreichen. LightRAG hat vermutlich keine eigene Auth.
Datenleck, Systemübernahme (Portainer) 15 Min
2 KRITISCH Authelia 4.38 ist 13 Monate veraltet
Zentraler Auth-Dienst mit potenziellen Sicherheitslücken.
Auth-Bypass möglich 30 Min
3 KRITISCH CSP blockiert GTM & SalesViewer
Tracking funktioniert nicht korrekt.
Kein Tracking, kein Analytics 10 Min

Warnungen (zeitnah beheben)

#FindingRisikoAufwand
4 WARNUNG .env-Dateien world-readable
lightrag/.env und mv-insights/.env haben chmod 644.
API-Keys lesbar für alle Prozesse 1 Min
5 WARNUNG Proxmox-Host ohne Firewall-Regeln
INPUT-Chain: ACCEPT ohne Regeln.
Unnötige Angriffsfläche 30 Min
6 WARNUNG UFW inaktiv auf Docker-VM
Nur CrowdSec als Schutzschicht.
Kein Fallback bei CrowdSec-Ausfall 15 Min
7 WARNUNG Kein Swap konfiguriert
Bei 32 GB RAM aktuell kein Problem, aber OOM-Killer könnte Container beenden.
Container-Abstürze bei Speichermangel 5 Min
8 WARNUNG Nur Root-Login (kein sudo-User)
Best Practice: Dedizierter Admin-User.
Gering (VPN-only SSH) 15 Min
9 WARNUNG crawl4ai 15 Monate veraltet
Potenziell unsicheres Image.
Bekannte Vulnerabilities 10 Min

Empfehlungen (optional)

#FindingNutzen
10 INFO Recovery-Test für Backups durchführen Sicherheit, dass Restore funktioniert
11 INFO Dedizierte 404-Fehlerseite erstellen Bessere User Experience
12 INFO Docker Image Update-Routine einrichten Automatisch veraltete Images erkennen
13 INFO WebAuthn/FIDO2 für Authelia aktivieren Phishing-resistente 2FA
14 INFO vpn-only Middleware für Admin-Dienste nutzen Defense-in-depth für Portainer, Neo4j etc.

13. Empfohlene Massnahmen

Sofort (heute)

1. Authelia-Middleware auf ungeschützte Services setzen

In /opt/localAIagent/docker-compose.yml folgende Router um Middleware ergänzen:

# Portainer — VPN-only empfohlen (hat Docker Socket Zugang!)
- "traefik.http.routers.portainer.middlewares=vpn-only@file"

# Open WebUI
- "traefik.http.routers.openwebui.middlewares=authelia@file"

# LightRAG — hat vermutlich keine eigene Auth
- "traefik.http.routers.lightrag.middlewares=authelia@file"

# Neo4j
- "traefik.http.routers.neo4j.middlewares=vpn-only@file"

Danach: cd /opt/localAIagent && docker compose up -d

2. .env-Dateien absichern
chmod 600 /opt/localAIagent/lightrag/.env
chmod 600 /opt/localAIagent/mv-insights/.env
3. CSP für GTM & SalesViewer erweitern

In nginx.conf die Content-Security-Policy anpassen:

add_header Content-Security-Policy "default-src 'self';
  script-src 'self' 'unsafe-inline' https://www.googletagmanager.com
    https://*.salesviewer.com https://www.google-analytics.com;
  style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
  font-src https://fonts.gstatic.com;
  img-src 'self' data: https://cdn.simpleicons.org
    https://www.googletagmanager.com https://www.google-analytics.com;
  connect-src 'self' https://n8n.ai.morovision.ch
    https://www.google-analytics.com https://*.salesviewer.com;
  frame-src https://www.googletagmanager.com;" always;

Diese Woche

4. Authelia auf 4.39.x updaten
# In docker-compose.yml ändern:
image: authelia/authelia:4.39

# Dann:
docker compose pull authelia
docker compose up -d authelia

⚠️ Vorher Release Notes prüfen — es könnte Breaking Changes geben.

5. crawl4ai updaten oder entfernen
# Falls nicht mehr benötigt:
docker compose stop crawl4ai && docker compose rm crawl4ai

# Falls benötigt — auf neuere Version updaten
6. Swap-Datei einrichten (Schutz gegen OOM)
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab

Diesen Monat

7. Proxmox Firewall aktivieren

Im Proxmox Web-UI unter Datacenter → Firewall → Options: «Firewall» aktivieren und Regeln für SSH (nur VPN-Netz), WireGuard (UDP 51820) und HTTP/HTTPS (80/443) erstellen.

8. Recovery-Test durchführen

Einen Restore der letzten Backup-Daten auf einer separaten VM oder lokal testen, um sicherzustellen, dass die Wiederherstellung funktioniert.

Fazit

Gesamtbewertung: B+ (Gut mit Verbesserungspotenzial)

Die Infrastruktur ist grundsätzlich professionell aufgebaut. Die Architektur mit VPN, Traefik, Authelia 2FA und CrowdSec bietet eine solide Sicherheitsbasis. Das grösste Risiko sind die 4 öffentlich erreichbaren Dienste ohne Authentifizierungs-Middleware — insbesondere Portainer (Docker-Management) und LightRAG (vermutlich offene API). Diese Findings lassen sich in unter 30 Minuten beheben und würden die Bewertung auf A− heben.