Aller au contenu

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

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.

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.

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).