feat(datenbank): Datenmodell mit Datenbankregeln und Seed (#003)

Alle Modelle fuer die fuenf Phasen in einer Migration, damit spaetere
Phasen keine Umbauten an Kerntabellen brauchen. Was auch an der
Service-Schicht vorbei gelten muss, steht als CHECK, partieller Index
oder Trigger in der Datenbank: Personen-Keys ohne Private Key, genau
ein Instanz-Deployment-Key, ein vertrauter Host-Key je Algorithmus,
shell-sichere Zielbenutzer und Pfade.

Das Protokoll ist append-only und per Hash-Kette verbunden; den Hash
berechnet ein Trigger, damit keine Zeile ohne Verkettung entstehen
kann (#005 baut darauf auf).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 09:12:06 +02:00
co-authored by Claude Opus 5.5
parent 224386106b
commit 03c7c45576
15 changed files with 1480 additions and 13 deletions
+45
View File
@@ -0,0 +1,45 @@
import type { Prisma } from "../src/generated/prisma/client";
/**
* Eingebaute Vorlagen (#019). Sie werden beim Seed angelegt, aber nie ueberschrieben:
* was ein Admin daran aendert, bleibt.
*/
export const EINGEBAUTE_VORLAGEN: Prisma.VorlageCreateInput[] = [
{
name: "Deployment-Zugang",
beschreibung:
"Projektbezogener Zugang, z. B. für Claude Code: eigener Benutzer deploy, Ablaufdatum, nur von der Quell-IP aus.",
eingebaut: true,
schluesselTyp: "ED25519",
kategorie: "DIENST",
standardLaufzeitTage: 90,
zielbenutzer: "deploy",
zielbenutzerAnlegen: true,
sudoModus: "KEINER",
authorizedKeysOptionen: 'from="{{quellHostIp}}"',
sshConfigAlias: "deploy-{{zielHost}}",
knownHostsEintragen: true,
},
{
name: "Backup-Zugang",
beschreibung: "Host-zu-Host-Zugang für Sicherungen, typischerweise als root, ohne Weiterleitungen.",
eingebaut: true,
schluesselTyp: "ED25519",
kategorie: "DIENST",
zielbenutzer: "root",
authorizedKeysOptionen:
'from="{{quellHostIp}}",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty',
sshConfigAlias: "backup-{{zielHost}}",
knownHostsEintragen: true,
},
{
name: "Admin-Zugang Person",
beschreibung: "Persönlicher Schlüssel eines Admins; der Private Key bleibt bei der Person.",
eingebaut: true,
schluesselTyp: "ED25519",
kategorie: "PERSON",
standardLaufzeitTage: 365,
zielbenutzer: "root",
knownHostsEintragen: false,
},
];