AUD-06: audit-log-verdrahtung-in-sicherheitsrelevante-core-handler
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s

Schliesst die in QA-05 gefundene Luecke: der zentrale Audit-Log (AUD-01/02)
existierte und war getestet, wurde aber von keinem Produktions-Handler
befuellt. Additive WithAudit(...)-Methode je Store (Konvention aus
lockout.Store.WithPolicy uebernommen, audit==nil bleibt gueltig, kein
Verhaltensbruch fuer bestehende Aufrufer):

- internal/policy.Store.Grant/Revoke -> policy.grant/policy.revoke
- internal/tenant.Registry (Suspend/Reactivate/ScheduleDeletion/
  CancelDeletion via transition) -> tenant.transition
- internal/lockout.Store.RecordFailure/Unlock -> auth.login_failed/
  auth.account_locked/auth.account_unlocked
- internal/kek.Store.RotateTenantKEK/RotateMasterKey -> kek.tenant_rotated/
  kek.master_rotated

Neues Testpaket internal/audit/wiring_test.go: fuer jeden der vier Bereiche
eine reale Aktion ausgefuehrt und per direkter audit_events-Abfrage
nachgewiesen (derselbe Nachweisstil wie der QA-05-Stichprobenabgleich, der
die Luecke fand). Alle bestehenden Tests der vier Pakete bleiben gruen.
51/51 Pakete gruen auf 192.168.1.131.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
This commit is contained in:
sysops
2026-08-29 17:24:26 +02:00
co-authored by Claude Sonnet 5
parent d8d5aaf3bc
commit 4de9310213
7 changed files with 447 additions and 6 deletions
+74
View File
@@ -0,0 +1,74 @@
# AUD-06 Audit-Log-Verdrahtung in sicherheitsrelevante Core-Handler
Welle 8. Voraussetzung: AUD-01, AUD-02, RBAC-02, TEN-04, IAM-07, API-10 (alle
Status "Fertig"). Branch:
`feature/aud-06-audit-log-verdrahtung-in-sicherheitsrelevante-core-handler`,
aufbauend auf dem gemergten Stand von QA-05.
Entstanden aus einem Befund des QA-05-Abnahmegates
(`docs/QA-05-ABNAHME-COMPLIANCE-PRUEFUNG.md` Abschnitt 2): der zentrale
Audit-Log (AUD-01/AUD-02) existierte und war getestet, wurde aber von
keinem Produktions-Handler tatsächlich befüllt.
## Umsetzung
Additive `WithAudit(...)`-Methode je betroffenem Store (Konvention aus
`internal/lockout.Store.WithPolicy` übernommen) — bestehende Konstruktoren
(`NewStore`/`NewRegistry`) bleiben unverändert, `audit == nil` bleibt gültig
und verhält sich exakt wie vorher (kein Verhaltensbruch für bestehende
Aufrufer/Tests):
| Bereich | Datei | Verdrahtete Methode(n) | Audit-Action |
|---|---|---|---|
| Policy (RBAC-02) | `internal/policy/store.go` | `Grant`, `Revoke` | `policy.grant` / `policy.revoke` |
| Tenant-Lifecycle (TEN-04) | `internal/tenant/registry.go`, `lifecycle.go` | `transition` (genutzt von `Suspend`/`Reactivate`/`ScheduleDeletion`/`CancelDeletion`) | `tenant.transition` |
| Lockout (IAM-07) | `internal/lockout/lockout.go` | `RecordFailure`, `Unlock` | `auth.login_failed` / `auth.account_locked` / `auth.account_unlocked` |
| KEK-Rotation (API-10) | `internal/kek/store.go` | `RotateTenantKEK`, `RotateMasterKey` | `kek.tenant_rotated` / `kek.master_rotated` |
`login_attempts` (Lockout) liegt in der Tenant-Datenbank, `audit_events` in
der Registry-Datenbank — `lockout.Store.WithAudit` nimmt daher zusätzlich
zum `*audit.Log` den Tenant-Slug entgegen, damit das Event den korrekten
Tenant-Bezug trägt (`audit.Event.TenantSlug`).
## Prüfung 1: reale Aktion je Bereich, Nachweis per direkter Abfrage von `audit_events`
Neues Testpaket `internal/audit/wiring_test.go`, vier Tests, jeweils: reale
Aktion über den öffentlichen Store-API ausführen, anschließend
`SELECT count(*) FROM audit_events WHERE action = ... AND target = ...`
direkt abfragen — derselbe Nachweisstil wie der QA-05-Stichprobenabgleich.
| Test | Ergebnis |
|---|---|
| `TestWiring_PolicyGrantRevokeAreAudited` | **bestanden** — je 1 Eintrag für `policy.grant`/`policy.revoke` |
| `TestWiring_TenantLifecycleTransitionIsAudited` | **bestanden** — Eintrag für `tenant.transition``suspended` |
| `TestWiring_LockoutFailuresAndUnlockAreAudited` | **bestanden** — je 1 Eintrag für `auth.login_failed`, `auth.account_locked`, `auth.account_unlocked` |
| `TestWiring_KEKRotationIsAudited` | **bestanden** — je 1 Eintrag für `kek.tenant_rotated`, `kek.master_rotated` |
## Prüfung 2: bestehende Tests aller vier Pakete bleiben grün
`internal/policy`, `internal/tenant`, `internal/lockout`, `internal/kek`
alle bestehenden Tests unverändert grün (rein additive Verdrahtung, siehe
Tabelle oben zu `audit == nil`).
## Prüfung 3: QA-05-Stichprobenabgleich wiederholt
Derselbe Stichprobenabgleich wie in QA-05 (`policy.Store.Grant`/`Revoke`
über `internal/pentest`) erneut ausgeführt — jetzt mit Treffer statt 0
Zeilen (siehe `TestWiring_PolicyGrantRevokeAreAudited`, welche exakt diesen
Fall abdeckt).
## Build/Test-Ergebnis
```
go build ./... / go vet ./... -> clean
go test ./... -p 1 -count=1 -> 51/51 Pakete ok, 0 Fehlschläge
```
## Gesamtergebnis
**Bestanden.** Alle drei Akzeptanzkriterien und alle drei Pflichtprüfungen
erfüllt. Die in QA-05 als Auflage vor QA-06 vermerkte Audit-Log-Lücke ist
für die vier dort konkret benannten Bereiche geschlossen. Weiterhin nicht
Bestandteil (siehe QA-05 „Nicht Bestandteil"): Vereinheitlichung der
`*-devserver`-Binaries zu einer zentralen Server-Topologie, sowie
Verdrahtung außerhalb Core.