Aller au contenu principal

Isolation multi-tenant

STOA implémente un modèle de multi-tenancy strict où chaque tenant est entièrement isolé au niveau de l'infrastructure, de l'identité, des données et du réseau. Cela permet à un seul déploiement STOA de servir plusieurs organisations sans fuite de données inter-tenant.

Modèle de données du tenant

Chaque tenant dans STOA possède les propriétés suivantes :

ChampTypeDescription
idstringIdentifiant slug (ex. oasis, acme-corp) — immuable
namestringNom d'affichage (ex. « OASIS Gunters »)
descriptionstringDescription optionnelle
statusenumactive, suspended, archived
settingsJSONQuotas, feature flags, configuration personnalisée
created_attimestampDate de création

Cycle de vie du statut du tenant

  • Active — Accès complet à toutes les fonctionnalités de la plateforme
  • Suspended — Accès en lecture seule, pas d'appels API, pas de déploiements. Utilisé pour les problèmes de facturation ou les blocages de conformité.
  • Archived — Données conservées pour l'audit, aucun accès. En attente de suppression selon la politique de rétention.

Cinq couches d'isolation

1. Isolation par namespace Kubernetes

Chaque tenant opère dans un namespace dédié avec des labels pour l'application des politiques :

apiVersion: v1
kind: Namespace
metadata:
name: tenant-acme
labels:
stoa.io/tenant-id: acme
stoa.io/tier: enterprise
pod-security.kubernetes.io/enforce: restricted

Les quotas de ressources empêchent un tenant unique de consommer les ressources du cluster :

apiVersion: v1
kind: ResourceQuota
metadata:
name: tenant-quota
namespace: tenant-acme
spec:
hard:
requests.cpu: "10"
requests.memory: 20Gi
persistentvolumeclaims: "5"
services.loadbalancers: "2"

2. Isolation réseau

Les politiques réseau empêchent la communication inter-tenant au niveau du CNI :

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tenant-isolation
namespace: tenant-acme
spec:
podSelector: {}
policyTypes: [Ingress, Egress]
ingress:
- from:
- namespaceSelector:
matchLabels:
stoa.io/tenant-id: acme
egress:
- to:
- namespaceSelector:
matchLabels:
stoa.io/tenant-id: acme
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: stoa-system

Les tenants peuvent communiquer avec leur propre namespace et le namespace partagé stoa-system (pour l'API Control Plane et la passerelle), mais jamais avec d'autres tenants.

3. Isolation au niveau de la passerelle

La passerelle STOA applique les limites des tenants au niveau de la couche API :

  • Routage par tenant — Chaque API est scopée à un identifiant de tenant
  • Limites de débit séparées — Application des quotas par tenant
  • Politiques indépendantes — Les politiques OPA évaluent le contexte du tenant
  • Certificats spécifiques au tenant — Certificats mTLS scopés par tenant

Dans les déploiements multi-passerelle, chaque adapter de passerelle (Kong, Gravitee, webMethods, STOA) maintient l'isolation des tenants via ses mécanismes natifs.

4. Isolation de l'authentification

L'architecture multi-realm de Keycloak fournit l'isolation des identités :

  • Un realm par tenant — Magasins d'utilisateurs isolés, identifiants séparés
  • Configurations clients isolées — Chaque tenant a ses propres clients OIDC
  • Validation de jetons indépendante — Les jetons d'un realm sont invalides dans un autre
  • Rôles scopés au tenanttenant-admin ne peut gérer que son propre tenant

5. Isolation des données

  • Schéma par tenant — Schémas de base de données isolés par tenant
  • Chiffrement au repos — Toutes les données tenant chiffrées (AES-256)
  • Politiques de sauvegarde séparées — Planifications de sauvegarde par tenant
  • Journalisation d'audit — Chaque accès aux données journalisé avec le contexte du tenant

RBAC et scope par tenant

Le modèle RBAC de STOA combine des rôles à l'échelle de la plateforme et des rôles scopés par tenant :

RôleScopePermissions
cpi-adminPlateformeAccès complet à tous les tenants, toutes les opérations
tenant-adminTenantAccès complet à son propre tenant uniquement
devopsTenantDéployer et promouvoir au sein de son propre tenant
viewerTenantAccès en lecture seule à son propre tenant

Comportements clés :

  • Un tenant-admin pour le tenant acme ne peut pas voir les ressources du tenant globex
  • Un viewer peut parcourir les API et outils mais ne peut pas invoquer, créer ou modifier
  • Un cpi-admin voit tous les tenants et peut effectuer des opérations inter-tenant
  • Le mode d'environnement (dev/staging/prod) restreint davantage les opérations — la production est en lecture seule par défaut

Paramètres du tenant

Le champ JSON settings sur chaque tenant permet une configuration par tenant :

{
"quotas": {
"max_apis": 50,
"max_subscriptions": 200,
"max_rate_limit": 10000
},
"features": {
"mcp_enabled": true,
"shadow_mode": false,
"advanced_analytics": true
},
"notifications": {
"webhook_url": "https://hooks.acme.com/stoa",
"email_alerts": true
}
}

Niveaux de tenant

NiveauRessourcesFonctionnalitésSLA
CommunityLimitéesAPI de base, MCP basiqueBest effort
StarterModéréesAPI + outils MCP, portail99%
BusinessÉlevéesPlateforme complète, multi-passerelleSur accord
EnterprisePersonnaliséesWhite-label, support dédiéSLA personnalisé

Observabilité par tenant

Chaque métrique dans STOA est labellisée avec l'identifiant du tenant, permettant des tableaux de bord par tenant :

  • Taux de requêtes APIstoa_api_requests_total{tenant="acme"}
  • Taux d'erreurstoa_api_errors_total{tenant="acme"}
  • Percentiles de latencestoa_api_duration_seconds{tenant="acme"}
  • Utilisation des ressources — CPU, mémoire, stockage par namespace
  • Attribution des coûts — Consommation de ressources par tenant pour la facturation

Les tableaux de bord Grafana peuvent être filtrés par tenant pour les tenant-admins, ou visualisés à travers tous les tenants pour les administrateurs plateforme.

Liens connexes