Florian Feuerwehrmanagement

Datenbank-Verschlüsselung (SQLCipher)

Florian legt seine Daten standardmäßig in einer unverschlüsselten SQLite-Datei (florian.db) ab – auf einem Server mit üblichen Zugriffsschutzmaßnahmen (Dateisystemrechte, kein öffentlicher Zugriff) ist das der Normalfall und erfordert keine weitere Einrichtung. Für Umgebungen mit erhöhten Anforderungen – etwa ein Server außerhalb der eigenen Kontrolle, ein verschlüsseltes Gerät ist Pflicht, oder ein internes Sicherheitskonzept verlangt Verschlüsselung „at rest" – bietet Florian eine optionale, vollständige Verschlüsselung der Datenbankdatei über SQLCipher.

Hinweis: Dies ist eine reine Konfigurationseinstellung (Umgebungsvariable oder appsettings.json), keine Oberflächen-Funktion. Sie richtet sich an Betreiber, die Florian selbst hosten und die Konfigurationsdatei bzw. Startumgebung des Dienstes verwalten können.

Standardverhalten: aus

Ohne jede Konfiguration verhält sich Florian exakt wie bisher – die Datenbank wird als gewöhnliche, unverschlüsselte SQLite-Datei angelegt und geöffnet. Das gilt für jede bestehende Installation und jedes Update: Es ist kein Schlüssel erforderlich, nichts ändert sich von selbst.

Verschlüsselung auf einer NEUEN Instanz aktivieren

Bei einer frischen Installation (noch keine florian.db vorhanden) reicht es, vor dem ersten Start einen Schlüssel zu konfigurieren – die Datenbank wird dann von Anfang an verschlüsselt angelegt.

Setzen Sie eine der folgenden Optionen:

Konfiguration Beschreibung
Florian:Database:EncryptionKey (appsettings.json) oder Umgebungsvariable Florian__Database__EncryptionKey Die Passphrase direkt.
Florian:Database:EncryptionKeyFile (appsettings.json) oder Umgebungsvariable Florian__Database__EncryptionKeyFile Pfad zu einer Datei, deren (getrimmter) Inhalt die Passphrase ist – empfohlen für Docker-Secrets oder gemountete Kubernetes-Secrets, damit der Schlüssel nicht im Prozess-Environment oder in appsettings.json steht.

Ist ein EncryptionKey gesetzt, hat er Vorrang vor EncryptionKeyFile.

Beispiel (Docker/Systemd-Umgebungsvariable):

Florian__Database__EncryptionKeyFile=/run/secrets/florian-db-key

Nach dem ersten Start mit gesetztem Schlüssel ist florian.db eine SQLCipher-verschlüsselte Datei – ein Zugriff ohne den Schlüssel (z. B. sqlite3 florian.db) liefert nur file is not a database.

Achtung: Bewahren Sie den Schlüssel getrennt von der Instanz auf (Passwort-Manager, Secrets-Verwaltung). Geht er verloren, ist die Datenbank nicht wiederherstellbar – auch nicht durch den Support. Es gibt aus Sicherheitsgründen keine Hintertür.

Bestehende, unverschlüsselte Instanz nachträglich verschlüsseln

Für eine bereits laufende Instanz mit vorhandenen Daten ist ein einmaliger, ausdrücklich angestoßener Migrationsschritt nötig – Florian verschlüsselt eine bestehende Datenbank niemals von sich aus, auch nicht nur weil ein Schlüssel konfiguriert wurde.

  1. Erstellen Sie zusätzlich ein reguläres Backup über Einstellungen → Backup → Jetzt sichern (siehe Backup & Wiederherstellung) – unabhängig von der automatischen Sicherung, die die Migration selbst anlegt.

  2. Stoppen Sie den Florian-Dienst.

  3. Setzen Sie zusätzlich zum Schlüssel (EncryptionKey/EncryptionKeyFile, siehe oben) die Option Florian:Database:EncryptNow bzw. die Umgebungsvariable Florian__Database__EncryptNow=true.

  4. Starten Sie den Dienst einmal. Noch vor dem eigentlichen Öffnen der Datenbank durch die Anwendung:

    • legt Florian eine Sicherungskopie der aktuellen, unverschlüsselten Datei an (florian.db.pre-encrypt-<Zeitstempel>.bak im selben Verzeichnis),
    • verschlüsselt eine neue Kopie mit dem konfigurierten Schlüssel,
    • prüft, dass sich diese Kopie tatsächlich mit dem neuen Schlüssel öffnen lässt,
    • und ersetzt erst danach die Live-Datei durch die geprüfte, verschlüsselte Kopie.

    Schlägt die Prüfung fehl, bricht der Start mit einer Fehlermeldung ab, ohne die Live-Datei angefasst zu haben – die .pre-encrypt-*.bak-Sicherung bleibt in jedem Fall zusätzlich erhalten.

  5. Entfernen Sie EncryptNow wieder aus der Konfiguration, sobald der Dienst erfolgreich mit der verschlüsselten Datenbank läuft. Der Schalter ist ein einmaliger Migrationsauftrag, kein Dauerzustand – ein versehentlich stehengelassenes EncryptNow ist harmlos (auf einer bereits verschlüsselten Datenbank ist es ein No-Op), aber unnötig.

  6. Prüfen Sie den Betrieb und entsorgen Sie die .pre-encrypt-*.bak-Sicherung erst, wenn Sie sicher sind, dass alles funktioniert.

Schlüssel ändern (Rekey)

Für einen Schlüsselwechsel einer bereits verschlüsselten Datenbank verwenden Sie das SQLite-Standardkommando PRAGMA rekey, ausgeführt gegen die laufende (oder eine gestoppte, direkt geöffnete) Datenbank mit dem aktuellen Schlüssel:

PRAGMA rekey = 'neuer-schluessel';

Erstellen Sie auch hierfür vorher ein Backup und aktualisieren Sie anschließend Florian:Database:EncryptionKey/EncryptionKeyFile auf den neuen Wert, bevor Sie den Dienst neu starten.

Was NICHT betroffen ist

  • Backups: Die Backup-Funktion (VACUUM INTO) erstellt aus einer verschlüsselten Live-Datenbank ebenfalls eine verschlüsselte Sicherung. Die Backup-Seite bietet keinen eigenen Passphrase-Schalter. Für verschlüsselte Sicherungen wird der konfigurierte Datenbankschlüssel benötigt; siehe Backup & Wiederherstellung.
  • Uploads/Vorlagen: Hochgeladene Dateien (uploads/) und Dokumentvorlagen (templates/) liegen als normale Dateien im Dateisystem und werden von dieser Funktion nicht verschlüsselt – schützen Sie diese ggf. über Festplattenverschlüsselung auf Betriebssystemebene.

Siehe auch