- Ab DuckDB Version 1.4 wurde die Funktion Data-at-Rest Encryption hinzugefügt, mit der sich die gesamte Datenbankdatei per standardisierter AES-basierter Verschlüsselung schützen lässt
- Unterstützte Algorithmen sind AES-GCM-256 und AES-CTR-256; GCM enthält dabei ein Authentifizierungs-Tag (tag) zur Überprüfung der Datenintegrität
- Die Verschlüsselung gilt für Datenbankdatei, WAL (Write-Ahead Log) und temporäre Dateien und umfasst eine sichere Cache-Struktur für Schlüsselverwaltung und Speicherschutz
- Es werden zwei Implementierungen bereitgestellt, OpenSSL und Mbed TLS; bei Verwendung von OpenSSL gibt es dank Hardwarebeschleunigung nahezu keinen Performanceverlust
- Verschlüsselte DuckDB-Dateien bieten gleichzeitig Sicherheit und Portabilität und ermöglichen auch in Cloud- oder CDN-Umgebungen eine sichere Datenverteilung
Überblick über die Verschlüsselung
- Seit DuckDB 1.4 kann die gesamte Datenbankdatei transparent verschlüsselt (Transparent Encryption) werden
- Beim Speichern wird AES-GCM-256 oder AES-CTR-256 verwendet
- AES-GCM berechnet Tags zur Integritätsprüfung, AES-CTR ist schneller, bietet aber keine Authentifizierung
- AES ist ein symmetrischer Verschlüsselungsalgorithmus, bei dem derselbe Schlüssel für Ver- und Entschlüsselung verwendet wird
- IV (Initialization Vector) und Nonce stellen sicher, dass derselbe Klartext in unterschiedlichen Chiffretext umgewandelt wird
- Die Anforderungen des NIST-Standards werden noch nicht vollständig erfüllt
Interne Implementierungsstruktur in DuckDB
- Der Haupt-Header der Datenbankdatei bleibt im Klartext und speichert ein Flag für die Verschlüsselung sowie Verschlüsselungsmetadaten
- Zu den Metadaten gehören Datenbankkennung (salt), Informationen zum Verschlüsselungsalgorithmus und ein verschlüsselter Canary
- Über eine Key Derivation Function (KDF) wird ein vom Nutzer eingegebener Schlüssel in einen sicheren 32-Byte-Schlüssel umgewandelt
- Der abgeleitete Schlüssel wird in einem sicheren Cache gespeichert und nicht auf die Festplatte ausgelagert
- Der ursprüngliche Schlüssel wird sofort aus dem Speicher entfernt
- Datenblöcke werden standardmäßig in Einheiten von 256 KB gespeichert; bei der Verschlüsselung werden dem Block-Header Nonce/IV und Tag hinzugefügt, wodurch er sich um 40 Byte erweitert
- Die Prüfsumme wird verschlüsselt gespeichert
Verschlüsselung des WAL (Write-Ahead Log)
- Das WAL ist eine Logdatei für die Transaktionswiederherstellung; in DuckDB wird auf Eintragsebene verschlüsselt
- Jedem Eintrag werden Nonce und Tag hinzugefügt und er wird per AES-GCM geschützt
- Ein verschlüsselter WAL-Eintrag ist in der Reihenfolge Länge (Klartext) → Nonce → verschlüsselte Prüfsumme und Daten → Tag aufgebaut
- Bei Datenbanken mit angegebenem Verschlüsselungsschlüssel wird die WAL-Verschlüsselung automatisch aktiviert
Verschlüsselung temporärer Dateien
- Auch temporäre Dateien, die bei großen Operationen wie Sortierungen, Joins oder Window-Funktionen entstehen, werden automatisch verschlüsselt
- Aktiviert wird dies beim Verbinden mit einer verschlüsselten Datenbank oder per Einstellung
SET temp_file_encryption = true
- DuckDB erzeugt intern einen temporären Schlüssel; bei Kollisionen ist eine Entschlüsselung nicht möglich
- Temporäre Dateien haben die Erweiterung
.tmp oder .block, Größeninformationen sind im Header enthalten
- Auf Prüfsummen wird zur Reduzierung der Berechnungskosten verzichtet
Verwendung der Verschlüsselung
Implementierung und Performance
- Um externe Abhängigkeiten gering zu halten, enthält DuckDB zwei Verschlüsselungsimplementierungen: Mbed TLS und OpenSSL
- Mbed TLS bietet ohne Hardwarebeschleunigung eine geringere Performance; wegen einer entdeckten Schwachstelle im Zufallszahlengenerator wurde die Schreibfunktion deaktiviert (ab 1.4.1)
- OpenSSL nutzt Hardwarebeschleunigung und einen sicheren Zufallszahlengenerator; beim Laden der Erweiterung
httpfs wird automatisch darauf umgeschaltet
- Ergebnisse von Performance-Tests:
- Unverschlüsselte SUMMARIZE-Abfrage: 5,4 Sekunden
- Mbed-TLS-Verschlüsselung: 6,2 Sekunden
- OpenSSL-Verschlüsselung: 5,4 Sekunden (kein Performanceverlust)
- Auch in TPC-H-Power/Throughput-Tests sind die Leistungsunterschiede bei aktivierter Verschlüsselung gering
- Power@Size: 624,296 → 571,985
- Throughput@Size: 450,409 → 145,353 (leichter Rückgang bei erhöhter Festplatten-I/O)
Fazit
- Mit DuckDBs Data-at-Rest Encryption lässt sich die gesamte Datenbankdatei sicher schützen
- Durch die Verschlüsselung von WAL und temporären Dateien sinkt auch in Cloud-Umgebungen das Risiko von Datenabfluss
- Bei einer OpenSSL-basierten Implementierung entsteht nahezu kein Performanceverlust, sodass sich die Funktion auch in produktiven Umgebungen effizient nutzen lässt
- Verschlüsselte DuckDB-Dateien eignen sich auch für die externe Verteilung über CDN & Co., während bestehende Funktionen wie das Speichern mehrerer Tabellen erhalten bleiben
- Das DuckDB-Team will die Funktion künftig auf Basis von Nutzerfeedback weiter verbessern
1 Kommentare
Hacker-News-Kommentare
Die Empfindlichkeit von AES-GCM gegenüber Nonce-Wiederverwendung ist bei der Implementierung ein kniffliger Punkt
In der Dokumentation wird das zwar erkannt, aber es wird keine Lösung geteilt
Im Header ist eine 16-Byte-Nonce statt 12 Byte enthalten, und es ist nicht klar angegeben, welche Bytes zufällig sind, was verwirrend ist. Ich frage mich, ob ich etwas übersehen habe
Ich bin weiterhin überrascht, was das DuckDB-Team alles leistet
Früher habe ich eine einfache Lösung gebaut, um DuckDB-Dateien mit OpenSSL zu verschlüsseln, aber bei der ersten Query dauerte die Ausführung doppelt so lange und verbrauchte auch viel Speicher
DuckDB hingegen nutzt Verschlüsselung auf Seitenebene und die AES-Beschleunigung der CPU, sodass die Kosten für Lesen/Schreiben nahezu nicht ins Gewicht fallen
Es nutzt Beschleunigung auf Kernel-Ebene und arbeitet für Anwendungen darüber transparent
Wenn nicht mehrere Apps jeweils unterschiedliche ACLs und Schlüssel verwenden müssen, ist Verschlüsselung im DB-System selbst unnötig
Im Vergleich zu einfacher Voll-Datei-Verschlüsselung sieht es natürlich gut aus, aber das ist eine Implementierung auf grundlegendem Niveau
Wir sollten selbst ebenfalls eine solche Qualitätsstufe anstreben
Im Vergleich zu Storage-I/O sind die Kosten der Verschlüsselung fast kostenlos
Ich frage mich, ob es außer MotherDuck ein Modell gibt, mit dem sich cloudbasiertes DuckDB für mehrere Benutzer gut betreiben lässt
Ich suche nach einer Struktur, bei der mehrere Benutzer wie bei einer normalen DB gleichzeitig zugreifen können und dabei die Vorteile von DuckDB erhalten bleiben
Je nachdem, wo die
.duckdb-Datei gespeichert wird (S3 vs. EFS), gibt es große LeistungsunterschiedeDuckLake scheint aber die bessere Multiplayer-Option zu sein
Wir verwenden DuckLake in unserem Produkt und speichern Analysetabellen auf schnellem Storage wie GCP Filestore, um Performance-Einbußen zu reduzieren
Selbst innerhalb eines einzelnen DuckLake-Katalogs kann man mehrere Storage-Arten mischen, was flexibel ist
DuckDB war bisher nützlicher als die AI-Tools, die ich verwendet habe
Ich mag LLMs, aber bei der tatsächlichen Arbeitseffizienz hat mir DuckDB viel mehr geholfen
Ich bin neugierig, wie Schlüssel indiziert werden
Wird beim Suchen mit verschlüsselten Schlüsseln gesucht, oder wird pro Block entschlüsselt?
Es heißt zwar oft, die „SQLite-Verschlüsselungserweiterung sei ein kostenpflichtiges Add-on für 2000 Dollar“,
aber SQLiteMultipleCiphers wird schon lange kostenlos angeboten
Außerdem unterstützt Turso Database standardmäßig Verschlüsselung
Der Link-Prozess scheint je nach Sprache knifflig zu sein
Eine Lösung, die seit 2009 entwickelt wird und stabil funktioniert