Aller au contenu

Sécurité et cloisonnement

Surface exposée

Une seule : l'ingress HTTPS de ca-aim-api. PostgreSQL n'a pas d'adresse publique, le stockage refuse les clés partagées, le registre n'a pas de compte d'administration.

Authentification

flowchart TD
    A[Requête] --> B{Authorization ?}
    B -->|absent| E401[401]
    B -->|"aimk_…"| K{Clé active ?}
    B -->|JWT| J{Signature, émetteur,<br/>audience, expiration}
    K -->|non| E401
    K -->|oui| P[Principal]
    J -->|invalide| E401
    J -->|valide| P

Jetons Entra — validés contre les clés publiques du tenant, mises en cache une heure. Les clés de signature d'Entra tournent : les figer casserait tout un jour, ne pas les mettre en cache coûterait un appel réseau par requête.

Clés d'API — préfixe aimk_, 32 octets aléatoires encodés en URL-safe. Seule l'empreinte SHA-256 est stockée. Une clé perdue se remplace, elle ne se relit pas. Chaque usage met à jour un horodatage, ce qui permet de repérer les clés oubliées.

Un mode dev désactive la validation pour le développement local. Le serveur journalise un avertissement au démarrage, et ce mode n'est jamais activé dans l'image déployée.

Autorisation

Savoir qui parle ne dit rien de ce qu'il a le droit de voir. Toute route métier passe par une résolution d'appartenance avant qu'une donnée ne soit lue.

Rôle Lire Ingérer, réviser Gérer les accès
reader
contributor
owner

Trois garanties de cloisonnement

1. Aucune requête ne peut balayer plusieurs clients. Toutes les méthodes du store prennent un client_slug explicite ; il n'existe pas de méthode capable d'agréger. Une fuite entre tenants ne peut pas venir d'un oubli de filtre.

2. Un client inaccessible est indiscernable d'un client inexistant. Réponse 404, jamais 403.

3. Le MCP et l'API partagent la même implémentation. La résolution du principal est une fonction unique, appelée par la dépendance FastAPI d'un côté et par un middleware ASGI de l'autre. Il n'y a pas deux contrôles à garder cohérents.

Vérifié contre l'environnement réel

Un principal étranger reçoit « client introuvable » sur l'outil conventions et une liste de clients vide. Une requête sans jeton reçoit 401.

Journal d'audit

Table audit_log : principal, horodatage, action, client, détail. Sont tracées la création et la suppression de client, l'ingestion, l'extraction, la consolidation, la révision d'un fait, l'attribution et le retrait d'accès, la création et la révocation de clé.

Données clients

Le code source ne quitte jamais le poste du développeur. Les six signaux de structure sont calculés localement. Ce point est en général le premier soulevé en comité de sécurité côté client.

Les documents déposés, eux, transitent et sont conservés : texte converti en base, original archivé dans Blob Storage. Toute personne alimentant AIM avec de la documentation client doit s'assurer d'en avoir le droit.

Ce qui reste à durcir

Sujet État Piste
Mot de passe PostgreSQL Secret Container App + Key Vault Authentification Entra pour PostgreSQL, sans mot de passe
Rotation des clés d'API Manuelle Expiration optionnelle à la création
Chiffrement au repos Clés gérées par Azure Clés gérées par le client si un client l'exige
Documentation Publique Authentification Entra intégrée, si le besoin apparaît