Aller au contenu

Rôles et accès

Rôles

RôleDescription
analystread-only sur son propre tenant
adminadministrateur de son propre tenant — agents, rules, billing, identity
ownercontrôle complet de son propre tenant + gestion des rôles
auditorcomptable externe ; téléchargement de bundle export via Auditor Workbench (TOTP requis en production)
msp_operatoropérateur cross-tenant — exclusivement /api/v1/msp/overview
(is_superadmin)superadmin de la plateforme ; tous les endpoints MSP + tenant-suspend

Gates par endpoint

L’auth par cookie + le scope tenant est la baseline pour toutes les routes user.*. Par-dessus :

EndpointGate supplémentaire
POST /api/v1/trust-score/weightsrole=admin|owner + TOTP-prod
POST /api/v1/auditor/bundlerole=admin|owner|auditor + TOTP-prod
GET /api/v1/auditor/bundles/:t/downloadatomic one-shot, expiration 24 h
GET /api/v1/msp/overviewrole=msp_operator OU is_superadmin
POST /api/v1/agents/:id/console/startrole=admin|owner + TOTP-prod + raison ≥20 chars

Toutes les routes agentAuth.* (ingest, register, whoami, heartbeat) passent par la vérification du bearer-token SHA-256 ; pas de role-check nécessaire.

Buckets de purpose TOTP

Chaque action TOTP-gated a son propre purpose pour qu’un replay entre features soit impossible :

PurposeUtilisé par
console_sessiondémarrage de console
trust_score_weightsPOST d’override des weights
auditor_bundlePOST de génération de bundle
force_updatepush de force-update vers les agents
unlock_evidenceunlock du contenu d’un AI evidence pack

Un code à 6 chiffres consommé pour console_session reste invalide pour ce même purpose pendant 30 secondes, mais EST utilisable pour auditor_bundle dans cette même fenêtre de 30 secondes — ligne distincte dans consumed_totp_codes.

RLS

Chaque table tenant a ENABLE ROW LEVEL SECURITY avec une policy tenant_isolation. Important : il s’agit de défense en profondeur. set_config('app.current_tenant', …, true) ne survit pas au connection-recycling de pgxpool, donc chaque requête de production DOIT contenir un WHERE tenant_id = $1 explicite.

Exception : les workers côté hub (TrustScoreWorker, IdentityHygieneWorker, SupplyChainWorker, CorrelationWorker, AuthGeoWorker) tournent intentionnellement en cross-tenant — ils émettent/agrègent par tenant via le scope de l’inner loop.

Audit log

Chaque changement de rôle, mise à jour des weights, création/téléchargement de bundle, création de lien et opération de suppression passe par audit_log avec event_type = <feature>.<action>. Filtrable dans la page Audit (/audit).