AUD-06: audit-log-verdrahtung-in-sicherheitsrelevante-core-handler
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
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:
co-authored by
Claude Sonnet 5
parent
d8d5aaf3bc
commit
4de9310213
+28
-1
@@ -7,6 +7,8 @@ import (
|
||||
|
||||
"github.com/jackc/pgx/v5"
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
|
||||
"gitea.perlbach24.de/scripte/nexarch/internal/audit"
|
||||
)
|
||||
|
||||
var ErrNoTenantKEK = errors.New("kek: kein tenant-kek fuer diesen mandanten hinterlegt")
|
||||
@@ -17,13 +19,21 @@ var ErrNoTenantKEK = errors.New("kek: kein tenant-kek fuer diesen mandanten hint
|
||||
// unabhaengiger Store, um TEN-01 nicht um schluesselfremde Belange zu
|
||||
// erweitern, demselben Muster wie internal/license.Store).
|
||||
type Store struct {
|
||||
pool *pgxpool.Pool
|
||||
pool *pgxpool.Pool
|
||||
audit *audit.Log
|
||||
}
|
||||
|
||||
func NewStore(pool *pgxpool.Pool) *Store {
|
||||
return &Store{pool: pool}
|
||||
}
|
||||
|
||||
// WithAudit liefert einen Store, der jede Schluessel-Rotation zusaetzlich im
|
||||
// zentralen, unveraenderlichen Audit-Log protokolliert (AUD-06) — rein
|
||||
// additiv, log == nil bleibt gueltig (z.B. bestehende Tests).
|
||||
func (s *Store) WithAudit(log *audit.Log) *Store {
|
||||
return &Store{pool: s.pool, audit: log}
|
||||
}
|
||||
|
||||
// CreateForTenant erzeugt einen NEUEN, zufaelligen Tenant-KEK und speichert
|
||||
// ihn mit dem Master-Key verpackt (Akzeptanzkriterium 2: JEDER Tenant
|
||||
// erhaelt einen EIGENEN Schluessel, niemals ein gemeinsamer). Wird von der
|
||||
@@ -88,6 +98,14 @@ func (s *Store) RotateTenantKEK(ctx context.Context, tenantID string, masterKey
|
||||
if tag.RowsAffected() == 0 {
|
||||
return nil, ErrNoTenantKEK
|
||||
}
|
||||
if s.audit != nil {
|
||||
_ = s.audit.Record(ctx, audit.Event{
|
||||
TenantSlug: audit.SystemTenant,
|
||||
Actor: "system",
|
||||
Action: "kek.tenant_rotated",
|
||||
Target: tenantID,
|
||||
})
|
||||
}
|
||||
return newPlainKEK, nil
|
||||
}
|
||||
|
||||
@@ -140,5 +158,14 @@ func (s *Store) RotateMasterKey(ctx context.Context, oldKey, newKey MasterKey) (
|
||||
}
|
||||
rotated++
|
||||
}
|
||||
if s.audit != nil {
|
||||
_ = s.audit.Record(ctx, audit.Event{
|
||||
TenantSlug: audit.SystemTenant,
|
||||
Actor: "system",
|
||||
Action: "kek.master_rotated",
|
||||
Target: audit.SystemTenant,
|
||||
Metadata: map[string]any{"rotated": rotated, "failed": failedTenantIDs},
|
||||
})
|
||||
}
|
||||
return rotated, failedTenantIDs, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user