Der mitgelieferte Objektspeicher kann keine Dokumente aufnehmen #42
Notifications
Total Time Spent: 3 minutes
florian.wilde
3 minutes
No due date set.
Dependencies
No dependencies set.
Reference: florian.wilde/betreuungs-cockpit#42
Reference in New Issue
Block a user
Symptom
Beim Ablegen eines Schreibens scheitert die Anwendung:
Kein Dokument lässt sich ablegen. Wer der
INSTALLATION.mdexakt folgt, landet zwangsläufig hier — es ist kein Konfigurationsfehler des Betreibers, sondern der Auslieferungszustand.Ursache
src/lib/speicher/s3.tssetzt bei jedemPutObject:Das mitgelieferte MinIO (
docker-compose.yml, Dienstminio) läuft ohne KMS und lehnt serverseitige Verschlüsselung mitNotImplementedab.Warum die Zeile überflüssig geworden ist
Seit v1.11.0 verschlüsselt die Anwendung jede Datei selbst, bevor sie den Server verlässt (
src/lib/speicher/umschlag.ts, AES-256-GCM, Schlüssel aus der Umgebung). Serverseitige Verschlüsselung schützt vor nichts, was der eigene Umschlag nicht schon abdeckt.Im Kommentar von v1.11.0 steht dazu „bleibt zusätzlich stehen; sie kostet nichts". Das ist falsch: Auf MinIO ohne KMS kostet sie die gesamte Funktion. Der Kommentar gehört mit korrigiert.
Umsetzung
ServerSideEncryptionnur senden, wenn ausdrücklich konfiguriert — etwaS3_SSE=AES256, Standard leer und damit aus. Wer einen Anbieter nutzt, der SSE anbietet und verlangt, schaltet es per.envdazu.Der Umweg über
MINIO_KMS_SECRET_KEYin einerdocker-compose.override.ymlist als Notlösung auf dem Livesystem im Einsatz. Er soll wieder verschwinden: Er handelt sich einen zweiten unverzichtbaren Schlüssel ein, dessen Verlust die Objekte unlesbar macht.Akzeptanzkriterien
S3_SSEenthält diePutObject-Anfrage keinenServerSideEncryption-Kopf.S3_SSEenthält sie ihn mit dem konfigurierten Wert..env.exampleundINSTALLATION.mderklären, wann man den Wert setzt — und dass der mitgelieferte Stack ihn nicht braucht.s3.tsist korrigiert.🚀 Umgesetzt und nach
mainübernommen.Vorgehen
env.s3.serverseitigeVerschluesselungergänzt — liestS3_SSE, leer bedeutet aus. Auch eine Zeile mit Leerzeichen zählt als leer..env.exampleundINSTALLATION.mderklären, wann man den Wert braucht — und dass der mitgelieferte Stack ihn nicht verträgt.tests/speicher-s3.test.ts.Der eigentliche Gewinn sind die Tests. Der S3-Pfad lief in keinem Test — weder in den 731 Unit-Tests noch in den 95 E2E-Tests, weil in der Entwicklung der Dateitreiber arbeitet. Genau deshalb ist dieser Fehler bis in den Betrieb durchgerutscht, und zwar zweimal: erst beim Einbau der Verschlüsselung, dann beim Stehenlassen der SSE-Zeile.
Die neuen Tests fangen den Befehl ab, bevor er das Netz sieht. Damit ist jetzt belegt statt angenommen, was an den Objektspeicher geht: kein SSE-Kopf ohne Konfiguration, verschlüsselter Inhalt mit
BCD1-Kopf, Klartext nicht auffindbar,application/octet-streamals Typ.Geprüft: 731 Unit-Tests ·
tscsauber · Lint sauber · drei Mutationen (SSE fest verdrahtet, leere Angabe nicht abgefangen, Inhalt unverschlüsselt) — jede wird rot.Für das Livesystem — die Notlösung kann weg
⚠️ Vorher das vorhandene Dokument einmal herunterladen und prüfen, ob es sich öffnen lässt. Es liegt mit SSE abgelegt im Speicher, und MinIO braucht den KMS-Schlüssel, um es herauszugeben.
Danach:
MINIO_KMS_SECRET_KEYausdocker-compose.override.ymlund.enventfernendocker compose up -dDamit verschwindet ein Schlüssel, dessen Verlust die Objekte unlesbar gemacht hätte.
Pull Request: #49 (gemergt)