docs(betrieb): Handbuch, Bedrohungsanalyse, geprobte Sicherung (#029)
Handbuch mit Bildern fuer alle Ablaeufe, darunter der Kern- Anwendungsfall und der Deployment-Zugang fuer Claude Code. Betriebsdoku zu Installation, authentik und Reverse Proxy sowie eine Bedrohungsanalyse mit Notfallplan fuer den Fall, dass sshkv selbst kompromittiert wird. Sicherung und Wiederherstellung als Skripte, auf einem Wegwerf-Stapel geprobt. Dabei fielen zwei Fehler auf: das Schema der Warteschlange liess sich nicht zurueckspielen, und ein Abbruch ohne Transaktion loeschte es halb. Jetzt nur Schema public, in einer Transaktion, mit Pruefwert des Master-Keys. Der Worker startet nicht, wenn der Master-Key nicht zur Datenbank passt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -219,3 +219,21 @@ export async function deploymentKeySicherstellen(): Promise<string> {
|
||||
});
|
||||
return neu.id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Passt der Master-Key zur Datenbank? (#029) Oeffnet probeweise den Deployment-Key. Schlaegt
|
||||
* das fehl, ist entweder die falsche Master-Key-Datei eingebunden oder eine Sicherung ohne den
|
||||
* dazugehoerigen Master-Key zurueckgespielt worden – beides soll beim Start auffallen, nicht
|
||||
* erst beim ersten Ausrollen.
|
||||
*/
|
||||
export async function masterKeyPruefen(deploymentKeyId: string): Promise<void> {
|
||||
try {
|
||||
const klartext = await privateKeyLaden(deploymentKeyId);
|
||||
klartext.fill(0);
|
||||
} catch {
|
||||
throw new Error(
|
||||
"Der Master-Key passt nicht zur Datenbank: Der Deployment-Key lässt sich nicht entschlüsseln. " +
|
||||
"Ist SSHKV_MASTER_KEY_FILE die Datei, die zu dieser Datenbank gehört (Sicherung)?",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -10,7 +10,7 @@ import {
|
||||
} from "@/server/vorgaenge/warteschlange";
|
||||
import { vorgangAusfuehren } from "@/worker/ausfuehren";
|
||||
import { abholungenAufraeumen } from "@/worker/ablaeufe/privatekey";
|
||||
import { deploymentKeySicherstellen } from "@/worker/geheimnisse";
|
||||
import { deploymentKeySicherstellen, masterKeyPruefen } from "@/worker/geheimnisse";
|
||||
import { HANDLER } from "@/worker/handler";
|
||||
|
||||
/**
|
||||
@@ -20,7 +20,7 @@ import { HANDLER } from "@/worker/handler";
|
||||
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();
|
||||
await masterKeyPruefen(await deploymentKeySicherstellen());
|
||||
const boss = await warteschlangeHolen();
|
||||
|
||||
await boss.work<VorgangsJob>(
|
||||
|
||||
Reference in New Issue
Block a user