Server-Side Encryption at Rest (PostgreSQL pgcrypto / TDE) #98
Labels
No labels
block-planning
bug
documentation
duplicate
enhancement
feature
good first issue
help wanted
infrastructure
invalid
planning
priority:high
priority:low
question
refactoring
status:backlog
status:done
status:in-progress
status:todo
tech-decision
test
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: bollwerkadmin/bollwerk#98
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ziel
Inventardaten in der PostgreSQL-Datenbank gegen unbefugten Direktzugriff schützen (DB-Dump, Backup-Leak, Disk-Diebstahl). Dies ist eine Defense-in-Depth-Maßnahme und schützt nicht gegen volle Server-Kompromittierung (dafür braucht es E2EE).
Kontext
Aktuell liegen alle Inventardaten (Items, Kategorien, Orte, Einstellungen, Nachrichten) als Klartext in PostgreSQL. Ein Angreifer mit Zugriff auf die DB-Dateien, einen Backup-Dump oder eine SQL-Injection kann alle Daten lesen.
Entscheidung: Key-Storage
Gewählt: Option 1 —
.env-Datei auf dem VPS/opt/bollwerk/.envgespeichert (chmod 600, nur root-lesbar)docker-compose.ymlreferenziert die.env-Datei viaenv_file.envist bereits in.gitignore→ Key landet nie im Git.env-Datei manuell auf dem VPS anlegen/aktualisierenAnsatz: pgcrypto + Column-Level Encryption
Warum pgcrypto statt TDE?
pgcryptoist eine offizielle PostgreSQL-Extension, inpostgres:17-alpinebereits enthaltenZu verschlüsselnde Felder
itemsname,notesmessagesbodysettingsvaluecategoriesnamelocationsnameUmsetzung
CREATE EXTENSION IF NOT EXISTS pgcrypto;BOLLWERK_DB_ENCRYPTION_KEYpgp_sym_encrypt(plaintext, key)beim Schreiben (im Ktor Repository Layer)pgp_sym_decrypt(ciphertext, key)beim LesenKey-Management
.env-Datei auf dem VPS gespeichert.env-Datei:chmod 600, nur root-lesbaropenssl rand -base64 32(einmalig bei Ersteinrichtung)Deployment-Änderungen
docker-compose.yml:env_file: .envhinzufügen +BOLLWERK_DB_ENCRYPTION_KEYnutzen.env-Template-Datei:.env.exampleim Repo (ohne echten Key)DatabaseFactory.kt: Encrypt/Decrypt-Wrapper für Exposed-QueriesAkzeptanzkriterien
.envauf dem VPS, nicht im Git.env.exampleals Template im RepoEinschränkungen
LIKEdurchsucht werdenAbgeschlossen (2026-05-17)