Rôles et accès
Rôles
| Rôle | Description |
|---|---|
analyst | read-only sur son propre tenant |
admin | administrateur de son propre tenant — agents, rules, billing, identity |
owner | contrôle complet de son propre tenant + gestion des rôles |
auditor | comptable externe ; téléchargement de bundle export via Auditor Workbench (TOTP requis en production) |
msp_operator | opé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 :
| Endpoint | Gate supplémentaire |
|---|---|
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, expiration 24 h |
GET /api/v1/msp/overview | role=msp_operator OU is_superadmin |
POST /api/v1/agents/:id/console/start | role=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 :
| Purpose | Utilisé par |
|---|---|
console_session | démarrage de console |
trust_score_weights | POST d’override des weights |
auditor_bundle | POST de génération de bundle |
force_update | push de force-update vers les agents |
unlock_evidence | unlock 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).