Vaultwarden sicher installieren – DIMA-Standard (Debian 13, Docker, ufw, Backup)
Diese Anleitung beschreibt die DIMA-Standard-Installation von Vaultwarden auf einer frisch aufgesetzten VM. Sie ersetzt die bisherige Ubuntu-22.04-Variante. Grundgerüst der VM (Debian 13, sudo, Firewall, Docker, Backup) ist identisch zum allgemeinen DIMA-VM-Standard – Details siehe 📄 DIMA-Bereich.
📋 Überblick – Was wird gemacht?
DNS-Eintrag erstellen
VM-Grundgerüst: Debian 13 installieren
Benutzer, sudo & SSH absichern
Firewall (ufw) einrichten
System aktualisieren
Docker & Docker Compose installieren
Automatisches Backup einrichten
Vaultwarden-Verzeichnis anlegen
Admin-Passwort erstellen und sichern
.env-Datei anlegen
docker-compose.yml anlegen
SSL/Zertifikat über OPNsense einrichten
Vaultwarden starten und nutzen
Admin-Bereich absichern oder deaktivieren
Benutzer & Organisation einrichten
Wartung & Sicherheit
1️⃣ DNS-Eintrag erstellen
Im DNS des Providers (Hetzner, Netcup, ...):
| Typ | Name | Wert |
|---|---|---|
| A | pass.kunde.de | Öffentliche IP der OPNsense (WAN) |
2️⃣ VM-Grundgerüst: Debian 13 installieren
Version: Debian 13 (Trixie), minimal/ohne Desktop
Benutzer: dima (kein root-Login)
Hostname: nach DIMA-Namensschema, z. B. KUNDENKÜRZEL01VW01 (siehe 📄 DIMA Namensgebung Geräte)
Festplatte: mindestens 50 GB
RAM: mindestens 4 GB
CPU: 2 Kerne
[SCREENSHOT: Proxmox-Klon/Installationsdialog für die VM]
3️⃣ Benutzer, sudo & SSH absichern
adduser dima usermod -aG sudo dima # SSH-Key statt Passwort-Login (Key vorher auf den Client kopieren) mkdir -p /home/dima/.ssh nano /home/dima/.ssh/authorized_keys # Public Key einfügen chmod 700 /home/dima/.ssh chmod 600 /home/dima/.ssh/authorized_keys chown -R dima:dima /home/dima/.ssh # In /etc/ssh/sshd_config: # PermitRootLogin no # PasswordAuthentication no systemctl restart sshd
🔎 Details zur SSH-Härtung: 📄 SSH Absichern
4️⃣ Firewall (ufw) einrichten
sudo apt install -y ufw sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow OpenSSH sudo ufw allow 8080/tcp # Vaultwarden-Port, nur falls nicht ausschließlich über OPNsense/HAProxy geroutet sudo ufw enable sudo ufw status verbose
⚠️ Der öffentliche Zugriff läuft über OPNsense/HAProxy (Port 443 → interne IP:8080). Der ufw-Regel auf 8080 dient nur der Absicherung im internen Netz – von außen darf nur die OPNsense erreichbar sein.
5️⃣ System aktualisieren
sudo apt update && sudo apt full-upgrade -y sudo apt install -y qemu-guest-agent unattended-upgrades sudo dpkg-reconfigure --priority=low unattended-upgrades
6️⃣ Docker & Compose installieren
# Docker-Repository für Debian einrichten curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin docker version
7️⃣ Automatisches Backup einrichten
Backup-Standard: tägliches Snapshot/Dump von /opt/vaultwarden/vw-data auf das zentrale DIMA-Backup-Ziel (PBS/rsnapshot – je nach Kunde, siehe Backup-Standard-Dokumentation).
sudo mkdir -p /opt/backup-scripts sudo nano /opt/backup-scripts/vaultwarden-backup.sh
#!/bin/bash DATE=$(date +%F) BACKUP_DIR="/opt/backup/vaultwarden" mkdir -p "$BACKUP_DIR" tar czf "$BACKUP_DIR/vw-data_$DATE.tar.gz" -C /opt/vaultwarden vw-data find "$BACKUP_DIR" -type f -mtime +14 -delete
sudo chmod +x /opt/backup-scripts/vaultwarden-backup.sh (crontab -l 2>/dev/null; echo "0 2 * * * /opt/backup-scripts/vaultwarden-backup.sh") | crontab -
📌 Zusätzlich: VM-Backup auf Hypervisor-Ebene (Proxmox Backup Server) gemäß Standard-Backup-Policy des Kunden einplanen.
8️⃣ Vaultwarden-Verzeichnis anlegen
sudo mkdir -p /opt/vaultwarden sudo chown $USER:$USER /opt/vaultwarden cd /opt/vaultwarden
9️⃣ Admin-Passwort erstellen und sichern
sudo apt install -y argon2
Token erzeugen:
echo -n 'MeinAdminPasswort' | \ argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4 | \ sed 's/\$/\$\$/g'
Sicher speichern: ausschließlich im Vaultwarden/Bitwarden-Tresor der Firma – niemals in Klartext-Dateien oder Chats.
1️⃣0️⃣ .env-Datei erstellen
echo -n 'VAULTWARDEN_ADMIN_TOKEN="' > .env && \ echo -n 'MeinAdminPasswort' | \ argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4 | \ tr -d '\n' | sed 's/\$/\$\$/g' >> .env && \ echo '"' >> .env
1️⃣1️⃣ docker-compose.yml erstellen
nano docker-compose.yml
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: always
user: "1000:1000"
environment:
DOMAIN: "https://pass.kunde.de"
ADMIN_TOKEN: ${VAULTWARDEN_ADMIN_TOKEN}
SMTP_HOST: "web05.dimait.de"
SMTP_FROM: "noreply@kunde.de"
SMTP_PORT: "587"
SMTP_SECURITY: "starttls"
LOG_FILE: "/data/vaultwarden.log"
LOG_LEVEL: "info"
SIGNUPS_ALLOWED: "false"
INVITATIONS_ALLOWED: "true"
SHOW_PASSWORD_HINT: "false"
WEB_VAULT_ENABLED: "true"
volumes:
- /opt/vaultwarden/vw-data:/data
ports:
- "8080:80"
env_file:
- .env
mkdir -p /opt/vaultwarden/vw-data chown -R 1000:1000 /opt/vaultwarden/vw-data chmod 750 /opt/vaultwarden/vw-data
⚠️ SIGNUPS_ALLOWED bleibt auf false (kein Selbst-Registrieren). INVITATIONS_ALLOWED auf true, damit der Kunde selbst Mitarbeiter per Einladung hinzufügen kann (siehe Kunden-Schulung).
1️⃣2️⃣ SSL/Zertifikat über OPNsense einrichten
Neuer DIMA-OPNsense-Standard (ACME Client + HAProxy) – Details in den verlinkten Artikeln, nicht hier duplizieren:
📄 Opnsense Einrichtung 📄 Opnsense HA Proxy 📄 OpnSense Zertifikat erstellen - erneuern
ACME-Konto für Hetzner- oder Netcup-DNS-API anlegen
Wildcard- oder Einzelzertifikat für pass.kunde.de erzeugen
HAProxy: Port 443 → interne Vaultwarden-IP:8080, Header Connection/Upgrade durchreichen (WebSocket für Live-Sync)
🚀 1️⃣3️⃣ Vaultwarden starten
cd /opt/vaultwarden docker compose up -d docker ps -a
🔑 1️⃣4️⃣ Vaultwarden verwenden
https://pass.kunde.de → Benutzer-Login
https://pass.kunde.de/admin → Admin-Bereich (mit Token)
1️⃣5️⃣ Admin-Bereich absichern
Zusätzlich zum Token: Zugriff auf /admin auf OPNsense-Ebene auf DIMA-IPs einschränken (ACL in HAProxy) – siehe 📄 Bitwarden Opnsense. Admin-Bereich nur bei Bedarf per .env aktivieren, sonst Zeile leeren:
nano .env # ADMIN_TOKEN-Zeile leeren/entfernen docker compose down && docker compose up -d
1️⃣6️⃣ Benutzer & Organisation einrichten
Erste Organisation und Struktur legt idealerweise der Kunde selbst an (siehe Kunden-Schulung), DIMA unterstützt beim Ersteinrichtungstermin:
Admin-Benutzer registrieren
Organisation anlegen, Firmenadresse eintragen (Pflichtfeld)
Erste Gruppe/Collection anlegen, Mitarbeiter einladen
📄 Vaultwarden / Bitwarden Schulung
🔧 1️⃣7️⃣ Wartung & Sicherheit
Wartung
| Aufgabe | Befehl / Ablauf |
|---|---|
| Vaultwarden aktualisieren | siehe 📄 Vaultwarden Updaten (immer vorher Backup!) |
| Logs anzeigen | tail -f /opt/vaultwarden/vw-data/vaultwarden.log |
| Backup prüfen | ls -lh /opt/backup/vaultwarden |
| ufw-Status prüfen | sudo ufw status verbose |
Sicherheitsempfehlungen (DIMA-Standard)
| Thema | Empfehlung |
|---|---|
| Betriebssystem | Debian 13, unattended-upgrades aktiv |
| SSH-Zugang | nur Key-Login, root-Login deaktiviert |
| Firewall | ufw aktiv, nur benötigte Ports offen |
| Admin-Token | nur im Firmen-Tresor, nicht im Klartext |
| Zugang über HTTPS | OPNsense mit Let's Encrypt (Hetzner/Netcup-DNS-API) |
| Registrierung | SIGNUPS_ALLOWED: false |
| Einladungen | INVITATIONS_ALLOWED: true (kontrolliert durch Kunden-Admin) |
| Passwort-Hinweise | SHOW_PASSWORD_HINT: false |
| root im Container vermeiden | user: "1000:1000" |
| Backup | täglich automatisiert + VM-Backup auf Hypervisor-Ebene |
| 2FA | beim Kunden aktiv einfordern (Schulung) |
⚡ Fehleranalyse bei Problemen
docker compose down docker compose up -d docker logs vaultwarden --tail=20