Files
nexarch/migrations/0010_audit_events_role_enforcement.down.sql
patrickandClaude Sonnet 5 6866845aca
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 51s
AUD-07: technische-durchsetzung-append-only-audit-log
AUD-02 hat bereits einen Trigger, der UPDATE/DELETE auf audit_events per
RAISE EXCEPTION ablehnt (Akzeptanzkriterium 3 aus AUD-07 war damit schon
erfuellt). Zwei Luecken blieben: (1) die Anwendungsrolle hatte weiterhin
UPDATE/DELETE-Rechte auf DB-Ebene, der Schutz war nur ein Code-Pfad
(Trigger), keine fehlenden Rechte; (2) ein abgelehnter Aenderungsversuch
wurde nirgends selbst protokolliert.

- migrations/0010_audit_events_role_enforcement.{up,down}.sql: Gruppenrolle
  nexarch_app ohne LOGIN/Passwort, REVOKE ALL + GRANT INSERT, SELECT auf
  audit_events fuer PUBLIC/nexarch_app; Trigger-Funktion um RAISE WARNING
  mit Akteur/Session/Client-Kontext ergaenzt, bevor der Versuch weiterhin
  per RAISE EXCEPTION abgelehnt wird (RAISE WARNING ist nicht transaktional,
  landet also auch bei Rollback im Postgres-Server-Log).
- internal/audit/append_only_test.go: Tests je Akzeptanzkriterium -
  TestAppendOnly_AppRoleHasNoUpdateOrDeletePrivilege (AC1/Pruefung1,
  erwartet "permission denied" statt Trigger-Fehler),
  TestAppendOnly_TamperAttemptIsLogged (AC2/Pruefung2, faengt die
  RAISE-WARNING-Notice ueber pgx OnNotice ab),
  TestAppendOnly_NormalWriteAndReadStillWork (AC3/Pruefung3, Regression).

Pruefungen auf 192.168.1.131 durchgefuehrt:
1. UPDATE/DELETE mit Anwendungsrolle (Mitglied nexarch_app) -> "permission
   denied for table audit_events" statt Trigger-Fehler: PASS.
2. Ablehnungsversuch selbst protokolliert (RAISE WARNING mit
   Akteur/Session/Zeitpunkt, unabhaengig von Transaktions-Rollback) via
   pgx-Notice-Capture nachgewiesen: PASS.
3. Regression Schreiben/Lesen (Record + CountByTenant, mehrere Eintraege):
   PASS.
Gesamtlauf go test ./... -p 1 -count=1: internal/audit vollstaendig gruen
(alle 22 Tests inkl. der 3 neuen). Bestehende, dokumentierte Altlasten
unveraendert beobachtet (nicht Bestandteil dieser Kachel): internal/migrate
(TestRolloutAll_* reihenfolgeabhaengig), internal/notify
(TestDispatcher_EnqueueAndProcess flakt), internal/pentest
(TestPentest_KEK_CompromisedMasterKeyCannotDecryptAfterRotation), internal/user
(verwaiste test_iam01_users/test_iam01_superadmins-DBs).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QPsyieCYwvbUBsnN598SbP
2026-09-17 11:48:01 +02:00

14 lines
650 B
PL/PgSQL

-- Trigger-Funktion auf den AUD-02-Stand zuruecksetzen (ohne RAISE WARNING).
CREATE OR REPLACE FUNCTION audit_events_prevent_mutation() RETURNS TRIGGER AS $$
BEGIN
RAISE EXCEPTION 'audit_events ist append-only: % ist nicht erlaubt', TG_OP;
END;
$$ LANGUAGE plpgsql;
REVOKE INSERT, SELECT ON audit_events FROM nexarch_app;
-- PUBLIC hatte vor dieser Migration keine expliziten Rechte auf
-- audit_events (Postgres-Standard: nur der Tabelleneigentuemer), daher kein
-- Re-GRANT hier. Die nexarch_app-Rolle selbst bleibt bestehen (kann von
-- anderen Objekten referenziert sein); nur die audit_events-spezifischen
-- Rechte werden zurueckgenommen.