Rollen & toegang
Rollen
| 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 |
Endpoint-gates
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.
TOTP purpose-buckets
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.
RLS
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.
Audit log
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).