Rôles et accès
| 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
Section intitulée « 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
Section intitulée « 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.
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
Section intitulée « 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).