Merge branch 'feature/aud-02-unveraenderliches-protokoll-append-only' into feature/qa-05-abnahme-compliance-pruefung-core

This commit is contained in:
sysops
2026-08-29 17:05:03 +02:00
10 changed files with 468 additions and 4 deletions
@@ -0,0 +1,3 @@
DROP TRIGGER IF EXISTS audit_events_no_delete ON audit_events;
DROP TRIGGER IF EXISTS audit_events_no_update ON audit_events;
DROP FUNCTION IF EXISTS audit_events_prevent_mutation();
+17
View File
@@ -0,0 +1,17 @@
-- Audit-Log technisch gegen Aenderung/Loeschung absichern (AUD-02, siehe
-- core-kanban/tickets/AUD-02.md). Ein Trigger statt nur GRANT/REVOKE, damit
-- der Schutz unabhaengig davon greift, mit welcher Rolle verbunden wird
-- (Akzeptanzkriterium 1: "auf Datenbankebene technisch unterbunden").
CREATE FUNCTION audit_events_prevent_mutation() RETURNS TRIGGER AS $$
BEGIN
RAISE EXCEPTION 'audit_events ist append-only: % ist nicht erlaubt', TG_OP;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER audit_events_no_update
BEFORE UPDATE ON audit_events
FOR EACH ROW EXECUTE FUNCTION audit_events_prevent_mutation();
CREATE TRIGGER audit_events_no_delete
BEFORE DELETE ON audit_events
FOR EACH ROW EXECUTE FUNCTION audit_events_prevent_mutation();
@@ -0,0 +1 @@
DROP TABLE IF EXISTS security_confirmations;
@@ -0,0 +1,14 @@
-- Vier-Augen-Prinzip fuer sicherheitskritische Entscheidungen (AUD-02
-- Akzeptanzkriterium 2), Vorbild: archivdms FOR-UPDATE-Lock + Timing-safe
-- Vergleich. code_hash speichert NIEMALS den Bestaetigungscode im Klartext.
CREATE TABLE security_confirmations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
action TEXT NOT NULL,
target TEXT NOT NULL,
requested_by TEXT NOT NULL,
code_hash BYTEA NOT NULL,
status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'confirmed', 'rejected')),
confirmed_by TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
confirmed_at TIMESTAMPTZ
);