🐧 Linux

Roundcube sicher betreiben: Dein Webmailer im Heimlabor absichern

Roundcube sicher betreiben: Dein Webmailer im Heimlabor absichern
⚠️ Hinweis: Alle Guides auf smoth.me dienen ausschließlich zu Informations- und Lernzwecken. Die Umsetzung erfolgt auf eigene Gefahr. Wir übernehmen keine Haftung für Schäden, Datenverluste oder Systemausfälle, die durch die Anwendung dieser Anleitungen entstehen können. → Vollständiger Haftungsausschluss

Moin, liebe Heimlaborexperten und Admins!

Als jemand, der seit Jahren mit Proxmox, Docker, Home Assistant und allem, was dazugehört, herumwerkelt, weiß ich, wie wichtig es ist, die eigene Infrastruktur nicht nur zum Laufen zu bringen, sondern auch sicher zu halten. Gerade kürzlich gab es wieder Schlagzeilen um kritische Sicherheitslücken in Roundcube, einem der beliebtesten Webmailer. Da konnten Angreifer beliebige Dateien auf den Webserver schreiben, Skriptcode einschleusen und sogar Inhaltsfilter umgehen. Solche Meldungen sind für mich immer ein Weckruf, meine eigenen Setups zu überprüfen und mein Wissen weiterzugeben.

In meiner Erfahrung ist es ein Trugschluss zu glauben, dass das eigene Heimlabor "zu klein" oder "uninteressant" für Angreifer sei. Einmal exponiert, bist du potenziell ein Ziel. Deshalb ist es entscheidend, Webanwendungen wie Roundcube nicht einfach nur zu installieren, sondern sie von Anfang an mit einem Fokus auf Sicherheit zu betreiben. Dieser Guide zeigt dir, wie ich meinen Roundcube aufsetze und absichere, um solche bösen Überraschungen zu vermeiden. Wir setzen dabei auf Docker, weil es uns eine Menge Flexibilität und Sicherheit bietet.

Voraussetzungen für einen sicheren Start

Bevor wir loslegen, lass uns kurz klären, was du mitbringen solltest. Keine Sorge, das sind alles Standardkomponenten im Heimlabor:

  • Ein Linux-Server: Egal ob eine VM oder ein LXC auf Proxmox, ein Raspberry Pi oder eine dedizierte Maschine. Hauptsache, du hast Root-Zugriff und eine aktuelle Linux-Distribution (z.B. Debian, Ubuntu).
  • Grundlegende Linux-Kenntnisse: SSH-Zugang, Navigation im Terminal, Umgang mit Dateiberechtigungen.
  • Docker und Docker Compose: Das ist unser Werkzeug der Wahl für die einfache Bereitstellung und Wartung.
  • Ein Mailserver: Roundcube ist nur der Webmailer-Client. Du brauchst einen funktionierenden IMAP/SMTP-Server (z.B. Postfix/Dovecot), der deine E-Mails hostet. Die Zugangsdaten dafür sind essentiell.
  • Ein Reverse Proxy: Das ist extrem wichtig! Ich nutze meist Nginx Proxy Manager oder Caddy, aber auch ein selbst konfigurierter Nginx oder Traefik ist super. Er kümmert sich um SSL/TLS und leitet Anfragen sicher an den Docker-Container weiter.
  • Eine eigene Domain: Mit korrekten DNS-Einträgen (A/AAAA-Record für deine IP, ggf. MX-Record für deinen Mailserver).
  • Ausreichend Ressourcen: Roundcube selbst ist nicht besonders hungrig, aber der Datenbank-Container und der Mailserver brauchen etwas RAM und CPU. Für ein Heimlabor reichen meist 2GB RAM und 2 CPU-Kerne für das gesamte Setup.

Warum Docker für Roundcube? Meine Perspektive

Für mich ist Docker im Heimlabor nicht mehr wegzudenken. Gerade bei Anwendungen wie Roundcube, die potenziell aus dem Internet erreichbar sind, bietet es enorme Vorteile:

  • Isolation: Roundcube läuft in seinem eigenen Container, isoliert vom Rest deines Systems. Wenn da mal etwas schiefgeht (oder eine der genannten Lücken ausgenutzt wird), ist der Schaden auf den Container begrenzt.
  • Einfache Updates: Neue Versionen mit wichtigen Sicherheits-Patches sind oft nur ein docker-compose pull und docker-compose up -d entfernt. Das ist ein entscheidender Punkt, um Lücken wie die jüngsten zu schließen.
  • Portabilität: Du kannst dein Roundcube-Setup problemlos auf einen anderen Server umziehen.
  • Reproduzierbarkeit: Dein Setup ist in einer docker-compose.yml-Datei definiert und kann jederzeit exakt wiederhergestellt werden.

Schritt-für-Schritt: Sicherer Roundcube im Docker-Container

1. Server vorbereiten und Docker installieren

Zuerst bringen wir dein Basissystem auf Vordermann. Das ist das A und O für jede sichere Installation.

sudo apt update && sudo apt upgrade -y
sudo apt install curl gnupg lsb-release -y

# Docker GPG-Schlüssel hinzufügen
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Docker APT-Repository hinzufügen
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  "$(lsb_release -cs)" stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Docker installieren
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

# Optional: Aktuellen Benutzer zur Docker-Gruppe hinzufügen, um sudo zu vermeiden
sudo usermod -aG docker $USER
# Nach dieser Änderung musst du dich einmal ab- und wieder anmelden oder ein 'newgrp docker' ausführen.

Vergiss niemals die Firewall! Ich nutze gerne UFW, weil es einfach ist. Erlaube SSH, HTTP und HTTPS.

sudo ufw enable
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw status # Prüfen, ob alles passt

Als Nächstes erstellen wir ein Verzeichnis für unsere Roundcube-Konfiguration. Ich packe meine Docker-Setups immer in /opt/docker/<appname>.

sudo mkdir -p /opt/docker/roundcube
cd /opt/docker/roundcube

2. Docker Compose Konfiguration für Roundcube und Datenbank

Wir brauchen zwei Container: einen für Roundcube und einen für die Datenbank. Ich setze hier auf PostgreSQL, da es robust und performant ist, aber MariaDB/MySQL funktioniert genauso gut. Wichtig: Verwende ein starkes Passwort für die Datenbank!

Erstelle eine Datei namens docker-compose.yml in deinem Roundcube-Verzeichnis:

version: '3.8'

services:
  roundcube:
    image: roundcubemail/roundcubemail:1.6.2 # Wichtig: Immer eine spezifische Version nutzen! Nicht 'latest'!
    container_name: roundcube
    restart: unless-stopped
    ports:
      - "8080:80" # Roundcube läuft intern auf Port 80, wir mappen es auf 8080. Zugriff nur über Reverse Proxy!
    environment:
      # Datenbank-Konfiguration
      - ROUNDCUBEMAIL_DB_TYPE=pgsql
      - ROUNDCUBEMAIL_DB_HOST=db
      - ROUNDCUBEMAIL_DB_PORT=5432
      - ROUNDCUBEMAIL_DB_USER=roundcube
      - ROUNDCUBEMAIL_DB_PASSWORD=${DB_PASSWORD} # Aus .env-Datei lesen
      - ROUNDCUBEMAIL_DB_NAME=roundcubemail
      # Mailserver-Konfiguration (kann auch in config.inc.php erfolgen)
      - ROUNDCUBEMAIL_DEFAULT_HOST=ssl://your-mailserver.com
      - ROUNDCUBEMAIL_DEFAULT_PORT=993
      - ROUNDCUBEMAIL_SMTP_SERVER=tls://your-mailserver.com
      - ROUNDCUBEMAIL_SMTP_PORT=587
      - ROUNDCUBEMAIL_SMTP_USER=%u
      - ROUNDCUBEMAIL_SMTP_PASSWORD=%p
      - ROUNDCUBEMAIL_PLUGINS=archive,zipdownload,managesieve,password # Beispiel-Plugins
      - ROUNDCUBEMAIL_TEMP_DIR=/tmp
      - ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE=20M
      - ROUNDCUBEMAIL_MAX_EXECUTION_TIME=60
      - ROUNDCUBEMAIL_DES_KEY=${DES_KEY} # Wichtig! Generiere einen starken Key!
      # Sicherheits-Hardening (einige wichtige Einstellungen)
      - ROUNDCUBEMAIL_IP_CHECK=true
      - ROUNDCUBEMAIL_FORCE_HTTPS=true # Wird vom Reverse Proxy gehandhabt, aber als zusätzliche Schicht gut
      - ROUNDCUBEMAIL_SESSION_LIFETIME=30 # Minuten
    volumes:
      - ./data/roundcube/config:/var/www/html/config # Persistente Konfiguration
      - ./data/roundcube/logs:/var/www/html/logs # Persistente Logs
      - ./data/roundcube/plugins:/var/www/html/plugins # Eigene Plugins
      - ./data/roundcube/temp:/tmp # Temporäre Dateien
    depends_on:
      - db
    networks:
      - roundcube_net

  db:
    image: postgres:15-alpine # Oder eine andere stabile Version
    container_name: roundcube_db
    restart: unless-stopped
    environment:
      - POSTGRES_DB=roundcubemail
      - POSTGRES_USER=roundcube
      - POSTGRES_PASSWORD=${DB_PASSWORD} # Aus .env-Datei lesen
    volumes:
      - ./data/db:/var/lib/postgresql/data # Persistente Datenbankdaten
    networks:
      - roundcube_net

networks:
  roundcube_net:
    driver: bridge

Mein Tipp: Die Zeile image: roundcubemail/roundcubemail:1.6.2 ist entscheidend. Verwende niemals latest in Produktionsumgebungen oder deinem Heimlabor, das du ernst nimmst. latest kann sich jederzeit ändern und dir ein ungetestetes Update unterjubeln. Eine spezifische Version wie 1.6.2 (oder die aktuellste stabile Version zum Zeitpunkt deiner Installation) gibt dir Kontrolle und Vorhersehbarkeit.

Erstelle zusätzlich eine Datei namens .env im selben Verzeichnis. Hier hinterlegen wir sensible Daten, die nicht direkt in die docker-compose.yml sollen:

DB_PASSWORD=DeinSuperStarkesDatenbankPasswort123!
DES_KEY=EinSehrLangerUndZufälligerKeyFürRoundcubeSicherheitDerMindestens24ZeichenHatUndSonderzeichenEnthält!

Generiere den DES_KEY am besten mit einem Tool oder einfach zufälligen Zeichen. Er wird für die Verschlüsselung von Sessions und anderen internen Daten verwendet. Ein schwacher Key kann hier ein Einfallstor sein.

3. Roundcube starten und Basis-Konfiguration

Jetzt wird's spannend! Starte deine Container:

docker-compose up -d

Der Befehl -d sorgt dafür, dass die Container im Hintergrund laufen. Es kann einen Moment dauern, bis die Datenbank initialisiert und Roundcube gestartet ist. Prüfe den Status:

docker-compose ps
docker-compose logs roundcube # Für detailliertere Logs

Wenn alles grün ist, läuft Roundcube jetzt intern auf Port 8080 deines Servers. Du könntest ihn theoretisch über http://deine-server-ip:8080 erreichen, aber das ist nur für einen schnellen Check gedacht. Exponiere diesen Port niemals direkt ins Internet!

4. Reverse Proxy einrichten (Der Wichtigste Sicherheitsschritt!)

Der Reverse Proxy ist deine erste Verteidigungslinie. Er übernimmt die SSL/TLS-Verschlüsselung (Let's Encrypt sei Dank!) und leitet Anfragen sicher an deinen Roundcube-Container weiter. Das verhindert direkte Angriffe auf deinen Webmailer und stellt sicher, dass alle Verbindungen verschlüsselt sind.

Ich gehe hier von einem Nginx-Setup aus, da es weit verbreitet ist. Wenn du Nginx Proxy Manager nutzt, ist es noch einfacher: Erstelle einen neuen Proxy Host, gib deine Domain an, wähle HTTP als Schema, roundcube als Hostname (wenn in demselben Docker-Netzwerk) oder die IP des Servers und Port 8080. Aktiviere SSL mit Let's Encrypt.

Für eine manuelle Nginx-Konfiguration könnte ein relevanter Teil so aussehen (dies ist nur ein Ausschnitt, du musst es in deine Nginx-Konfiguration integrieren, z.B. in /etc/nginx/sites-available/roundcube.conf und dann einen Symlink nach sites-enabled):

server {
    listen 80;
    listen [::]:80;
    server_name webmail.deine-domain.de;

    # Weiterleitung von HTTP auf HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name webmail.deine-domain.de;

    ssl_certificate /etc/letsencrypt/live/webmail.deine-domain.de/fullchain.pem; # Pfad anpassen
    ssl_certificate_key /etc/letsencrypt/live/webmail.deine-domain.de/privkey.pem; # Pfad anpassen

    # Weitere SSL-Einstellungen für Härtung (empfohlen!)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s; # Google DNS, passe es an deine Umgebung an
    resolver_timeout 5s;
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Referrer-Policy "no-referrer-when-downgrade";
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";

    location / {
        proxy_pass http://localhost:8080; # Oder die IP deines Docker-Hosts
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
        # Wichtig für Uploads und größere Mails
        client_max_body_size 20M;
    }
}

Nachdem du deine Nginx-Konfiguration angepasst hast, vergiss nicht, sie zu testen und Nginx neu zu laden:

sudo nginx -t # Syntax prüfen
sudo systemctl reload nginx # Nginx neu laden

Jetzt solltest du Roundcube unter deiner Domain (z.B. https://webmail.deine-domain.de) erreichen können. Logge dich mit deinen Mailserver-Zugangsdaten ein und überprüfe, ob alles funktioniert.

5. Roundcube Konfiguration anpassen (Feinschliff und Härtung)

Die Docker-Umgebungsvariablen decken viel ab, aber für spezifische Einstellungen oder Plugins musst du direkt in die Konfigurationsdateien. Die wichtigsten liegen im Volume ./data/roundcube/config. Dort findest du die config.inc.php.

Du kannst die Datei direkt auf deinem Host-System bearbeiten, da sie in ein Volume gemountet ist. Hier ein paar meiner bevorzugten Härtungs-Einstellungen, die du prüfen oder hinzufügen solltest:

<?php
// config.inc.php (Auszug, vollständige Datei ist umfangreicher)

// ... andere Konfigurationen ...

// --- Sicherheitseinstellungen ---
// Erzwinge HTTPS (wird auch vom Reverse Proxy gemacht, aber doppelt hält besser)
$config['force_https'] = true;

// Prüfe die IP-Adresse der Session. Verhindert Session-Hijacking.
$config['ip_check'] = true;

// Session-Lebensdauer in Minuten (nach Inaktivität)
$config['session_lifetime'] = 30;

// Deaktiviere die Anzeige von PHP-Fehlern im Frontend
$config['display_errors'] = E_ALL & ~E_NOTICE & ~E_WARNING & ~E_DEPRECATED;
$config['log_driver'] = 'syslog'; // Oder 'file' für Logging ins Volume

// Verhindere das Speichern von Passwörtern im Browser
$config['autologin_session_lifetime'] = 0; // Kein automatisches Login

// --- Logging ---
// Standardmäßig werden Logs ins /var/www/html/logs Volume geschrieben.
// Überprüfe die Logs regelmäßig auf Auffälligkeiten.
$config['log_level'] = RCMAIL_LOG_DEBUG; // Oder RCMAIL_LOG_WARNING im Produktivbetrieb

Wichtig zu wissen: Nach Änderungen an der config.inc.php musst du den Roundcube-Container neu starten, damit die Änderungen wirksam werden:

docker-compose restart roundcube

6. Regelmäßige Updates (Deine beste Verteidigung gegen Lücken!)

Das ist der Punkt, der direkt auf die Heise-Meldung abzielt. Die kritischen Lücken in Roundcube wurden durch Updates geschlossen. Wenn du deine Installation nicht aktuell hältst, bist du weiterhin angreifbar. Regelmäßige Updates sind nicht optional, sie sind Pflicht!

Mit Docker ist das zum Glück sehr einfach. Um Roundcube manuell zu aktualisieren:

cd /opt/docker/roundcube
docker-compose down # Container stoppen
docker-compose pull # Neueste Version des Images herunterladen
docker-compose up -d # Container mit neuem Image starten

Mein Tipp: Bevor du ein Update auf deinem Produktivsystem machst, lies immer die Release Notes der neuen Roundcube-Version. Manchmal gibt es Breaking Changes, die manuelle Anpassungen erfordern. Im Heimlabor habe ich oft eine Staging-Umgebung, auf der ich Updates zuerst teste.

Für automatisierte Updates nutze ich Watchtower. Das ist ein weiterer Docker-Container, der deine anderen Container überwacht und bei neuen Images automatisch aktualisiert. Aber Vorsicht: Automatisierung ist gut, aber man sollte immer ein Auge darauf haben!

Erstelle eine separate docker-compose.yml für Watchtower, z.B. unter /opt/docker/watchtower/docker-compose.yml:

version: '3.8'
services:
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WATCHTOWER_CLEANUP=true # Alte Images löschen
      - WATCHTOWER_POLL_INTERVAL=86400 # Alle 24 Stunden prüfen
      # - WATCHTOWER_NOTIFICATIONS=email # Optional: E-Mail-Benachrichtigungen
      # - WATCHTOWER_NOTIFICATION_EMAIL_FROM=watchtower@example.com
      # - WATCHTOWER_NOTIFICATION_EMAIL_TO=admin@example.com
      # - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.example.com
      # - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
      # - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=user
      # - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=password

Starte Watchtower mit docker-compose up -d in dessen Verzeichnis. Watchtower wird dann alle deine laufenden Container überwachen und bei neuen Image-Versionen automatisch aktualisieren. Das ist ein Segen für die Sicherheit, da du seltener wichtige Patches verpasst.

Häufige Fehler und Lösungen

1. Login fehlgeschlagen / Mailserver-Verbindungsprobleme

Symptom: Du kannst dich nicht bei Roundcube anmelden, obwohl deine Zugangsdaten stimmen. Oder E-Mails können nicht gesendet/empfangen werden.

Ursache: Oft sind die IMAP/SMTP-Hostnamen, Ports oder die SSL/TLS-Einstellungen in der Roundcube-Konfiguration falsch.

Lösung:

  • Prüfe die Umgebungsvariablen in deiner docker-compose.yml für ROUNDCUBEMAIL_DEFAULT_HOST, ROUNDCUBEMAIL_DEFAULT_PORT, ROUNDCUBEMAIL_SMTP_SERVER und ROUNDCUBEMAIL_SMTP_PORT.
  • Schau in die Logs deines Roundcube-Containers: docker-compose logs roundcube. Hier stehen oft detaillierte Fehlermeldungen zur Mailserver-Verbindung.
  • Stelle sicher, dass dein Mailserver von deinem Docker-Host aus erreichbar ist (Firewall-Regeln!).

2. Dateiberechtigungen oder Volume-Probleme

Symptom: Uploads schlagen fehl, Roundcube kann keine Logs schreiben, oder die Konfiguration wird nach einem Neustart nicht übernommen.

Ursache: Der Roundcube-Container hat keine Schreibrechte auf die gemounteten Volumes auf deinem Host-System. Oder die Volume-Pfade sind falsch.

Lösung:

  • Vergewissere dich, dass die Pfade in deiner docker-compose.yml unter volumes: korrekt sind und existieren.
  • Prüfe die Berechtigungen der Host-Verzeichnisse (z.B. /opt/docker/roundcube/data/roundcube/config). Der Roundcube-Container läuft intern oft unter einem bestimmten User (z.B. www-data mit UID/GID 33). Du musst sicherstellen, dass dieser User Schreibrechte hat. Ein schneller (aber nicht immer optimaler) Fix ist sudo chmod -R 777 /opt/docker/roundcube/data, besser ist es, die Berechtigungen spezifisch auf

Weitere Guides aus "Linux"

Raspberry Pi: Optimaler Dauerbetrieb trotz steigender Kosten
Dieser Guide zeigt, wie du deinen Raspberry Pi für den effizienten und langlebigen Betrieb von Diens…
Tails 7.6 im Praxistest: Anonym surfen mit neuem Passwort-Manager
Ein Deep Dive in die Neuerungen von Tails 7.6. Ich zeige dir, wie du die anonyme Linux-Distribution …
OnlyOffice Document Server im Homelab: Einrichten mit Docker & Nextcloud
Dieser Guide zeigt dir, wie du den OnlyOffice Document Server mit Docker Compose einrichtest und nah…
XPipe 22.0: Dein Passwortmanager als SSH-Schlüsselbund im Homelab
Dieser Praxis-Guide zeigt dir, wie du XPipe 22.0 einrichtest, deinen Passwortmanager integrierst und…