Roundcube sicher betreiben: Dein Webmailer im Heimlabor absichern
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 pullunddocker-compose up -dentfernt. 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.ymlfürROUNDCUBEMAIL_DEFAULT_HOST,ROUNDCUBEMAIL_DEFAULT_PORT,ROUNDCUBEMAIL_SMTP_SERVERundROUNDCUBEMAIL_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.ymluntervolumes: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-datamit UID/GID 33). Du musst sicherstellen, dass dieser User Schreibrechte hat. Ein schneller (aber nicht immer optimaler) Fix istsudo chmod -R 777 /opt/docker/roundcube/data, besser ist es, die Berechtigungen spezifisch auf