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 |