Ga naar inhoud

Rollen & toegang

Role Beschrijving
analyst read-only op eigen tenant
admin beheerder eigen tenant — agents, rules, billing, identity
owner volledige controle eigen tenant + role-management
auditor externe accountant; bundle-export download via Auditor Workbench (TOTP-prod)
msp_operator cross-tenant operator — uitsluitend /api/v1/msp/overview
(is_superadmin) platform-superadmin; alle MSP-endpoints + tenant-suspend

Cookie-auth + tenant scope is de baseline voor alle user.* routes. Op top hiervan:

Endpoint Extra gate
POST /api/v1/trust-score/weights role=admin|owner + TOTP-prod
POST /api/v1/auditor/bundle role=admin|owner|auditor + TOTP-prod
GET /api/v1/auditor/bundles/:t/download atomic one-shot, 24h expiry
GET /api/v1/msp/overview role=msp_operator OR is_superadmin
POST /api/v1/agents/:id/console/start role=admin|owner + TOTP-prod + reden ≥20 chars

Alle agentAuth.* routes (ingest, register, whoami, heartbeat) gaan via SHA-256 bearer-token check; geen role-check nodig.

Elke TOTP-gated actie heeft een eigen purpose zodat replay tussen features impossible is:

Purpose Gebruikt door
console_session console-start
trust_score_weights weights override POST
auditor_bundle bundle generation POST
force_update force-update push naar agents
unlock_evidence AI evidence-pack content unlock

Een 6-cijferige code die geconsumeerd is voor console_session blijft 30 seconden lang ongeldig voor diezelfde purpose, maar IS gebruikbaar voor auditor_bundle in datzelfde 30-sec window — verschillende rij in consumed_totp_codes.

Elke tenant-tabel heeft ENABLE ROW LEVEL SECURITY met een tenant_isolation policy. Belangrijk: deze is defense-in-depth. set_config('app.current_tenant', …, true) overleeft pgxpool’s connection-recycling niet, dus elke productie-query MOET expliciet WHERE tenant_id = $1 bevatten.

Uitzondering: hub-side workers (TrustScoreWorker, IdentityHygieneWorker, SupplyChainWorker, CorrelationWorker, AuthGeoWorker) draaien intentioneel cross-tenant — ze emitten/aggregeren per tenant via de inner-loop scope.

Elke role-change, weights-update, bundle-creation/download, link-creation en delete-operation gaat via audit_log met event_type = <feature>.<action>. Filterbaar in de Audit-page (/audit).