# 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.