GOMODEL_ENCRYPTION_KEY setzen, werden
sie vor dem Schreiben verschlüsselt. Eine Datenbankdatei, ein Dump, ein Backup
oder ein Replikat enthält sie dann nicht mehr im Klartext.
Verschlüsselte Felder:
Zugangsdaten, die in Umgebungsvariablen oder in
config.yaml deklariert sind,
werden nie in die Datenbank geschrieben und sind daher nicht betroffen.
Standardwert: nicht gesetzt. Secrets werden im Klartext gespeichert, und GoModel
protokolliert beim Start eine Warnung, wenn ein aktiviertes Feature (Provider
sowie MCP oder Guardrails, sofern aktiviert) ein Secret im Klartext lädt.
Aktivieren
Erzeugen Sie einen Key und übergeben Sie ihn an jede Instanz, die die Datenbank gemeinsam nutzt:GOMODEL_ENCRYPTION_KEY=${file:/run/secrets/gomodel-encryption-key}
funktioniert ebenfalls.
Vorhandene Klartext-Secrets
Das Aktivieren des Keys schreibt nichts um. Klartextwerte funktionieren weiterhin und werden verschlüsselt, sobald der jeweilige Eintrag das nächste Mal gespeichert wird. Um alles auf einmal zu verschlüsseln, führen Sie Folgendes aus:Den Key rotieren
UmGOMODEL_ENCRYPTION_KEY zu ändern, starten Sie mit dem neuen Key und dem
alten Key in GOMODEL_ENCRYPTION_KEY_PREVIOUS:
GOMODEL_ENCRYPTION_KEY_PREVIOUS.
Um den Data Key selbst zu ersetzen, zum Beispiel nach einem vermuteten Leck einer
Datenbankkopie zusammen mit dem alten Key, führen Sie Folgendes aus:
gomodel secrets reencrypt auszuführen.
Funktionsweise
Jede Datenbank erhält einen zufälligen 256-Bit-Data-Key, der ausschließlich in verpackter Form in der Tabelleencryption_keys gespeichert wird. Der Key, der
ihn verpackt, wird mit Argon2id aus GOMODEL_ENCRYPTION_KEY abgeleitet.
Secret-Werte werden mit AES-256-GCM verschlüsselt und als
enc:v1:<key-id>:<ciphertext> gespeichert; Zeile und Feld sind in den
Chiffretext eingebunden. Ein Wert, der in eine andere Zeile oder ein anderes Feld
kopiert wird, lässt sich daher nicht entschlüsseln, statt dort verwendet zu
werden.
Die Admin API bleibt unverändert: Secrets werden in Responses weiterhin maskiert.
Die Verschlüsselung ruhender Daten schützt Kopien der Datenbank. Sie schützt
nicht vor jemandem, der die Umgebung oder den Speicher des Gateways lesen kann,
und sie ersetzt nicht die Einschränkung des Zugriffs auf die Datenbank und ihre
Backups.
Eigene Distributionen
Eine auf GoModel aufbauende Distribution kann den Data Key statt mitGOMODEL_ENCRYPTION_KEY mit einem KMS verpacken, indem sie
LoadResult.SetKeyWrapper mit einem config.KeyWrapper aus
run.Options.SetupConfig aufruft. Lassen Sie beim ersten Start mit einem neuen
Wrapper GOMODEL_ENCRYPTION_KEY einmal gesetzt, damit der vorhandene Data Key
dorthin übertragen werden kann. Um von einem Wrapper zu einem anderen zu
wechseln, übergeben Sie den alten als vorherigen Wrapper:
SetKeyWrapper(next, previous).