feat(worker): Private Keys im Worker versiegeln, Deployment-Key (#006)

Der zweite Teil von #006 bindet den Kern an Datenbank und Worker. Nur
src/worker/geheimnisse.ts liest Chiffrat und Data-Key; ein struktureller
Test haelt fest, dass der Webprozess nichts von dort importiert und so
nie an den Master-Key kommt.

Die Zusatzdaten binden jedes Chiffrat an ID und Fingerprint seines
Schluessels: kopiert man es in eine andere Zeile, laesst es sich dort
nicht oeffnen. Der Deployment-Key entsteht beim ersten Start; ein Test
prueft, dass ein pg_dump keinen Klartext enthaelt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 09:33:18 +02:00
co-authored by Claude Opus 5.5
parent 855d77cf17
commit 9b807c13ae
5 changed files with 318 additions and 5 deletions
+4
View File
@@ -3,6 +3,7 @@ import type { Job } from "pg-boss";
import { VERSION } from "@/lib/version";
import { WARTESCHLANGE, warteschlangeHolen, type VorgangsJob } from "@/server/vorgaenge/warteschlange";
import { vorgangAusfuehren } from "@/worker/ausfuehren";
import { deploymentKeySicherstellen } from "@/worker/geheimnisse";
import { HANDLER } from "@/worker/handler";
/**
@@ -10,6 +11,9 @@ import { HANDLER } from "@/worker/handler";
* und nur von hier aus spricht sshkv SSH mit den Hosts.
*/
async function starten(): Promise<void> {
// Zuerst: ohne lesbaren Master-Key und Deployment-Key kann der Worker nichts tun, und das
// soll beim Start auffallen, nicht beim ersten Vorgang.
await deploymentKeySicherstellen();
const boss = await warteschlangeHolen();
await boss.work<VorgangsJob>(