diff --git a/05-Vaultwarden-CT103.md b/05-Vaultwarden-CT103.md index 16aad2f..aa5f356 100644 --- a/05-Vaultwarden-CT103.md +++ b/05-Vaultwarden-CT103.md @@ -103,6 +103,60 @@ Erreichbar unter `https://vaultwarden.`, automatisch gültiges Let's-En Über `https://vaultwarden.` (nur von einem Tailnet-Mitglied aus erreichbar) im Browser ein Konto mit **selbst gewähltem Master-Passwort** anlegen. Das Master-Passwort wird bewusst **nie** programmatisch gesetzt oder irgendwo notiert — es ist der einzige Schlüssel zum gesamten Tresor. +## 8. Update-Vorfall: Client zeigte nur graue Platzhalter nach einem fälligen Server-Update + +Vaultwarden aktualisiert sich **nicht selbst** — die Anwendung *ist* das Image. Weder der Tresor noch das Admin-Panel können das auslösen; ein Update heißt Image holen und Container neu erzeugen. + +```bash +# 1. Konsistente Sicherung OHNE Dienst-Stopp (kein blosses cp der laufenden DB!) +python3 - <<'EOF' +import sqlite3, os, shutil +ziel = "/opt/vaultwarden/pre-update-$(date +%Y%m%d-%H%M)" +os.makedirs(ziel, exist_ok=True) +src = sqlite3.connect("/opt/vaultwarden/data/db.sqlite3") +dst = sqlite3.connect(os.path.join(ziel, "db.sqlite3")) +with dst: src.backup(dst) +EOF +# rsa_key.pem und docker-compose.yml mitsichern, Kopie per 'pct pull' vom Container holen + +# 2. Integritaet der Sicherung pruefen, BEVOR etwas angefasst wird +# pragma integrity_check + Anzahl Eintraege merken + +# 3. Update +cd /opt/vaultwarden && docker compose pull && docker compose up -d + +# 4. Gegenpruefen: Version, /api/config, integrity_check, gleiche Anzahl Eintraege +``` + +Ausfallzeit im Praxisfall: ca. 7 Sekunden. + +⚠️ **NICHT TUN: `image: vaultwarden/server:latest` für aktuell halten.** `latest` wird **nur beim `docker pull`** neu aufgelöst. Der Container lief so drei Monate auf einem Image, das Monate zuvor „latest" war — ohne jeden Hinweis. Genau dafür ist ein Image-Update-Notifier vorgesehen (siehe `08-monitoring.md`). + +⚠️ **NICHT TUN: die laufende `db.sqlite3` einfach kopieren.** SQLite läuft im WAL-Modus; ein `cp` erwischt einen inkonsistenten Zwischenstand. Die `.backup`-Schnittstelle liefert einen sauberen Schnappschuss, ohne den Dienst zu stoppen. + +### Vorfall: Chrome-Erweiterung zeigte nur graue Platzhalter + +**Symptom:** Tresor-Liste lud nie, die Erweiterung zeigte dauerhaft Skeleton-Platzhalter. In der Browser-Konsole: + +``` +Error: invalid type: JsValue(Object({...})), expected a string (bitwarden_wasm_internal_bg.js) +``` + +**Diagnose-Kette**, jeder Schritt am Protokoll belegt statt vermutet: + +1. Server gesund — Container „healthy", Endpunkt 200 in 20 ms, **keine** Fehler im Log +2. Client verbunden — Anmeldung 200 OK, sogar erfolgreiches `POST /api/ciphers` +3. **Aber: in zwei Stunden kein einziger `GET /api/sync`** — das ist der Aufruf, der die Tresor-Inhalte holt. Ohne ihn bleibt die Liste leer, ganz ohne Fehlermeldung +4. Ursache: der Server meldete einen älteren API-Stand, die Browser-Erweiterung erwartete bereits einen neueren — die Release-Notes der neuen Server-Version waren dazu explizit: eine Mindest-Server-Version wird für neuere Client-Versionen vorausgesetzt +5. Nach dem Update trotzdem derselbe Fehler — weil der Client per `GET /api/accounts/revision-date` prüft, ob sich etwas geändert hat, ein „nein" bekam und weiter aus seinem **lokalen Zwischenspeicher im alten Format** arbeitete +6. Gelöst durch „Jetzt synchronisieren" in der Erweiterung → `GET /api/sync => 200 OK` + +⚠️ **Merksatz: nach einem Vaultwarden-Update reicht ein Neustart des Browsers nicht.** Der Client synchronisiert nur, wenn sich das Revisionsdatum geändert hat — nach einem reinen Versionssprung tut es das nicht. Ein Abgleich muss **manuell erzwungen** werden (Einstellungen → Tresor synchronisieren), sonst bleibt er auf altem Datenformat hängen. + +**Vor dem Abmelden immer prüfen, ob 2FA aktiv ist** (`select atype, enabled from twofactor`) — bei einem Passwort-Tresor ist ein Selbst-Aussperren die teuerste Fehlerart. Hier: keine 2FA, nur Master-Passwort. + +Mitgeliefert wurden mit diesem Update drei Sicherheitskorrekturen: SSRF über den Icon-Endpunkt, Cross-Organization Cipher Access, Policy-Bypass beim Directory-Import. + ## Bekannte Stolpersteine (bereits behoben, hier nur als Hinweis) * Beim Passwort-Import versehentlich Duplikate erzeugt (zweimal importiert) → behoben durch: alle Einträge auswählen → löschen → Papierkorb leeren → sauber neu importieren.