PD-XX — Mise en place du fournisseur d’identité (IdP OAuth2 / OIDC)¶
1. Objectif¶
Définir de manière canonique, contractuelle et auditable la mise en place d’un fournisseur d’identité OAuth2 / OpenID Connect servant de socle transverse d’authentification et d’autorisation pour l’ensemble du système ProbatioVault.
Cette User Story vise à établir un référentiel d’identité unique, standardisé, souverain et testable, sans introduire de dépendance métier ni de logique cryptographique applicative.
2. Périmètre / Hors périmètre¶
Inclus¶
- Mise en place d’un IdP OAuth2 / OIDC auto‑hébergé.
- Définition d’une implémentation de référence basée sur Keycloak.
- Séparation stricte des environnements (au minimum : non‑prod / prod).
- Émission de tokens JWT signés conformes aux standards OAuth2/OIDC.
- Mise à disposition des documents de découverte OIDC et du JWKS.
- Support des claims d’identité et d’autorisation normatifs.
- Journalisation minimale permettant l’audit des authentifications et émissions de tokens.
Exclu¶
- Authentification zero‑knowledge utilisateur (SRP‑6a).
- Gestion des clés de chiffrement applicatives.
- Fédération d’identité externe (Google, FranceConnect, SAML, etc.).
- MFA / authentification forte.
- Gestion du cycle de vie métier des comptes utilisateurs.
- Toute logique métier ProbatioVault.
3. Définitions¶
- IdP : Identity Provider, composant émettant des identités vérifiables.
- OAuth2 / OIDC : standards d’autorisation et d’identité.
- JWT : Jeton signé transportant des claims.
- Issuer (iss) : Autorité émettrice du token.
- Audience (aud) : Destinataire(s) du token.
- JWKS : Jeu de clés publiques de vérification.
- Realm : Domaine de sécurité isolé.
4. Invariants (non négociables)¶
| ID | Règle | Justification |
|---|---|---|
| INV‑01 | Le système repose sur un IdP OAuth2 / OIDC unique et transverse. | Cohérence globale |
| INV‑02 | L’IdP est auto‑hébergé et sous contrôle opérationnel de ProbatioVault. | Souveraineté |
| INV‑03 | Chaque environnement dispose d’un espace d’identité isolé. | Sécurité / audit |
| INV‑04 | Les tokens émis sont des JWT signés, vérifiables hors‑ligne. | Résilience |
| INV‑05 | L’IdP ne détient aucune clé de chiffrement applicative. | Zero‑knowledge |
| INV‑06 | Les comportements d’authentification et d’émission de tokens sont déterministes et testables. | Auditabilité |
| INV‑IAM‑08 | Chaque environnement ProbatioVault est identifié de manière univoque par un issuer OIDC distinct. Tout token accepté doit porter un claim iss correspondant exclusivement à l’issuer autorisé de l’environnement courant ; toute autre valeur est rejetée, indépendamment de la validité cryptographique ou des droits. | Cloisonnement / opposabilité |
| INV‑IAM‑09 | Tout événement d’authentification ou d’émission de token est journalisé avec un format minimal : type d’événement (authentification, émission, refus), environnement concerné, résultat (succès/échec), horodatage. Aucune entrée de journal ne doit contenir un token JWT en clair, un secret, une clé cryptographique ou toute donnée permettant la reconstitution d’un secret. Les journaux sont structurés de manière déterministe. Les journaux IAM sont conservés pour une durée minimale de trente (30) jours calendaires, de manière à garantir leur disponibilité pour audit et analyse a posteriori ; la méthode/support/purge n’est pas normée, sous réserve de pouvoir démontrer cette disponibilité minimale. | Auditabilité / sécurité |
| INV‑IAM‑10 | Le caractère auto‑hébergé de l’IdP et l’absence de secrets applicatifs ProbatioVault doivent être démontrables via des artefacts opposables : inventaire d’infrastructure ou d’actifs, documentation d’exploitation (runbook), preuve de contrôle des accès administrateur, documentation de responsabilité opérationnelle. L’IdP ne doit contenir aucune clé de chiffrement applicative ProbatioVault, aucun secret permettant l’accès aux données ProbatioVault, aucun jeton applicatif longue durée utilisé par les services ProbatioVault ; seuls les secrets strictement nécessaires au fonctionnement de l’IdP sont autorisés. Les artefacts de preuve doivent être disponibles pour audit. | Souveraineté / confidentialité |
| INV‑IAM‑11 | Toute indisponibilité de l’IdP doit produire un signal d’erreur observable et déterministe attestant du refus d’émission de token : aucun token n’est émis, un état d’erreur explicite et distinct d’un refus d’autorisation ou d’un token invalide est observable par l’appelant. Le signal doit être observable via au moins un canal normatif : (1) un signal applicatif retourné à l’appelant, ou (2) un événement de journalisation conforme à l’INV‑IAM‑09, ou (3) un indicateur d’état exposé (état, métrique, health). Le canal utilisé est documenté et vérifiable en audit. Absence de canal observable = non conformité. | Résilience / testabilité |
4.1 Bloc normatif IAM / JWT (transverse)¶
Statut : NORMATIF — opposable contractuellement. Applicable à tout token d’identité/autorisation utilisé dans le système ProbatioVault.
-
INV‑IAM‑01 — Émetteur (issuer) normatif
Tout token accepté doit être émis par un issuer explicitement autorisé, liste fermée par environnement. Toute valeurissnon autorisée est rejetée. -
INV‑IAM‑02 — Audience(s) autorisée(s)
Le token doit contenir au moins une audience appartenant à l’ensemble des audiences autorisées pour le composant consommateur. Absence ou incompatibilité ⇒ rejet. -
INV‑IAM‑03 — Algorithmes et clés cryptographiques
Seuls les algorithmes explicitement autorisés sont acceptés (liste fermée). Tout algorithme non autorisé est interdit par défaut. Les clés de signature doivent respecter une taille minimale conforme ; algorithmes non signés ou affaiblis interdits. -
INV‑IAM‑04 — Claims normatifs requis
Claims obligatoires :iss,aud,sub,iat,exp(etnbfsi présent). L’absence ou la non‑conformité d’un seul claim entraîne un rejet systématique. Les claims supplémentaires sont ignorés à des fins décisionnelles sauf mention contraire dans une US spécifique. -
INV‑IAM‑05 — Contraintes temporelles
Les claims temporels (iat,nbf,exp) sont évalués selon une politique déterministe. Un token expiré ou non encore valide est rejeté. Une tolérance d’horloge maximale est définie et appliquée de manière homogène. -
INV‑IAM‑06 — Politique de flux d’émission
Les tokens acceptés doivent provenir d’un flux d’émission autorisé pour le type de client concerné (catégorie de client ↔ flux OIDC autorisés). Tout flux non autorisé entraîne un rejet, même si le token est valide cryptographiquement. -
INV‑IAM‑07 — Isolation par environnement
Les tokens sont strictement liés à leur environnement d’émission. Un token émis pour un environnement ne doit jamais être accepté dans un autre, indépendamment des audiences ou droits.
5. Flux nominaux¶
F1 — Découverte OIDC¶
- Un client récupère le document de découverte OIDC de l’IdP.
- Les endpoints et métadonnées sont exposés conformément au standard.
F2 — Émission d’un token¶
- Une identité valide est présentée à l’IdP (mécanisme hors périmètre).
- L’IdP émet un access_token JWT signé.
- Le token contient les claims normatifs requis et respecte l’ensemble des invariants INV‑IAM‑01 à INV‑IAM‑07.
- Le token est explicitement rattaché à un environnement unique par la valeur de son claim
iss, conformément à l’invariant INV‑IAM‑08. - L’émission (ou le refus) de token donne lieu à un événement journalisé conforme à l’invariant INV‑IAM‑09.
F3 — Consommation du token¶
- Un service ProbatioVault reçoit un token.
- Il valide le token sans appel réseau à l’IdP.
- La décision d’accès est prise localement.
- Chaque authentification, émission ou refus de token produit un événement journalisé conforme à l’invariant INV‑IAM‑09.
- Les éléments nécessaires à la démonstration de l’auto‑hébergement de l’IdP et de l’absence de secrets applicatifs sont maintenus et accessibles conformément à l’invariant INV‑IAM‑10.
5bis. Diagrammes¶
D1 — Cycle de vie d’un token JWT (state diagram)¶
Réf. invariants : INV‑IAM‑01 à INV‑IAM‑08, INV‑04, INV‑IAM‑11.
stateDiagram-v2
[*] --> Requested : Client présente identité
Requested --> Emitted : IdP valide identité\n+ claims conformes (INV‑IAM‑04)
Requested --> EmissionRefused : Identité invalide\nou IdP indisponible (INV‑IAM‑11)
EmissionRefused --> [*] : Signal d’erreur observable\n(INV‑IAM‑09 journalisé)
Emitted --> Valid : iat ≤ now ≤ exp\n(INV‑IAM‑05, tolérance ±2min)
Emitted --> NotYetValid : now < nbf\n(INV‑IAM‑05)
NotYetValid --> Valid : nbf atteint
Valid --> Accepted : iss ✓ (INV‑IAM‑01/08)\naud ✓ (INV‑IAM‑02)\nalg ✓ (INV‑IAM‑03)\nflux ✓ (INV‑IAM‑06)\nenv ✓ (INV‑IAM‑07)
Valid --> Rejected : Échec validation\n(un ou plusieurs invariants)
Valid --> Expired : now > exp + tolérance\n(INV‑IAM‑05)
Expired --> Rejected : Rejet systématique
Accepted --> [*]
Rejected --> [*] : Événement journalisé\n(INV‑IAM‑09) D2 — Flux F2 : Émission d’un token (sequence diagram)¶
Réf. invariants : INV‑01, INV‑02, INV‑04, INV‑05, INV‑IAM‑01, INV‑IAM‑04, INV‑IAM‑08, INV‑IAM‑09.
sequenceDiagram
autonumber
participant C as Client
participant IdP as IdP Keycloak<br/>(auto‑hébergé, INV‑02)
participant Log as Journal IAM
C->>IdP: Présentation identité<br/>(flux autorisé, INV‑IAM‑06)
IdP->>IdP: Validation identité
alt Identité valide
IdP->>IdP: Construction JWT signé (INV‑04)<br/>claims: iss, aud, sub, iat, exp (INV‑IAM‑04)<br/>iss = issuer environnement (INV‑IAM‑08)<br/>aucun secret applicatif (INV‑05)
IdP->>Log: Événement EMISSION_OK (INV‑IAM‑09)
IdP-->>C: access_token JWT
else Identité invalide
IdP->>Log: Événement EMISSION_REFUS (INV‑IAM‑09)
IdP-->>C: Erreur 401
end D3 — Flux F3 : Consommation et validation d’un token (sequence diagram)¶
Réf. invariants : INV‑04, INV‑IAM‑01 à INV‑IAM‑08, INV‑IAM‑09, INV‑IAM‑10.
sequenceDiagram
autonumber
participant C as Client
participant S as Service ProbatioVault
participant JWKS as JWKS (clés publiques,<br/>cache local)
participant Log as Journal IAM
C->>S: Requête + access_token JWT
S->>JWKS: Récupération clé publique<br/>(vérification hors‑ligne, INV‑04)
JWKS-->>S: Clé publique
S->>S: 1. Vérification signature (INV‑IAM‑03)
S->>S: 2. Vérification iss ∈ issuers autorisés (INV‑IAM‑01/08)
S->>S: 3. Vérification aud (INV‑IAM‑02)
S->>S: 4. Vérification claims requis (INV‑IAM‑04)
S->>S: 5. Vérification temporelle iat/exp/nbf (INV‑IAM‑05)
S->>S: 6. Vérification flux d’émission (INV‑IAM‑06)
S->>S: 7. Vérification isolation env (INV‑IAM‑07)
alt Toutes validations OK
S->>Log: Événement AUTH_OK (INV‑IAM‑09)
S-->>C: Réponse 200
else Au moins un invariant échoue
S->>Log: Événement AUTH_REFUS (INV‑IAM‑09)
S-->>C: Erreur 401 (message uniforme)
end 6. Cas d’erreur¶
- IdP indisponible → aucun token n’est émis.
- Token non signé ou invalide → rejet par les services consommateurs.
- Token émis hors environnement attendu → rejet.
- En cas d’indisponibilité de l’IdP, l’absence d’émission de token est accompagnée d’un signal d’erreur observable, conformément à l’invariant INV‑IAM‑11.
- Le signal d’indisponibilité emprunte un canal normatif documenté (signal applicatif, journalisation INV‑IAM‑09 ou indicateur d’état), conformément à INV‑IAM‑11.
7. Critères d’acceptation (testables)¶
| ID | Critère | Observable |
|---|---|---|
| CA‑01 | L’IdP expose un document de découverte OIDC valide | Endpoint accessible |
| CA‑02 | Les tokens émis sont des JWT signés | Vérification cryptographique |
| CA‑03 | Les environnements sont isolés | Token non réutilisable |
| CA‑04 | Aucun secret applicatif n’est stocké dans l’IdP | Inspection config |
| CA‑05 | Les événements d’authentification sont journalisés | Logs |
| CA‑IAM‑01 | Conformité aux invariants IAM (INV‑IAM‑01 à INV‑IAM‑11) | Scénarios de test associés aux invariants IAM |
8. Scénarios de test (GWT)¶
S1 — Découverte OIDC
Given un IdP opérationnel
When le document de découverte est demandé
Then les métadonnées OIDC sont exposées
S2 — Isolation environnement
Given deux environnements distincts
When un token d’un environnement est utilisé dans l’autre
Then le token est rejeté
9. Hypothèses explicites¶
| ID | Hypothèse | Impact si faux |
|---|---|---|
| H‑01 | Un IdP OAuth2/OIDC est requis pour ProbatioVault | Refonte auth |
| H‑02 | Keycloak est l’implémentation de référence | Alternative à définir |
10. Points à clarifier¶
- Politique de rétention des logs (périmètre d’infra opérationnelle).
- Les valeurs concrètes (noms d’issuer, audiences, algorithmes précis, flux autorisés) sont fournies au niveau environnement/implémentation et ne modifient pas les règles normatives ci‑dessus. La durée minimale de conservation des journaux IAM est définie de manière normative par l’invariant INV‑IAM‑09.
11. Annexe A — Principes et bonnes pratiques IAM / JWT¶
Statut : NON NORMATIF — EXPLICATIF. Cette annexe est strictement non contractuelle. Les valeurs concrètes des paramètres IAM/JWT (issuers, audiences, algorithmes, tailles de clés, durées, flux autorisés) sont définies exclusivement dans l’Annexe B — NORMATIVE. Elle fournit un cadre explicatif et des bonnes pratiques sans valeur opposable.
A.1 — Objectif de l’annexe¶
Cette annexe vise à expliciter les principes de conception retenus pour l’IAM, fournir un contexte de compréhension aux équipes et aux auditeurs, et justifier les choix de sécurité généraux sans figer de paramètres. Elle ne définit aucune valeur normative.
A.2 — Séparation des responsabilités¶
Le modèle IAM repose sur une séparation stricte entre : identité/authentification/autorisation (émission et validation de tokens, gestion des identités, contrôle d’accès) et gestion des secrets applicatifs (stockage de clés, secrets applicatifs, accès aux données). Objectif : réduire la surface d’attaque, limiter les fuites de secrets, améliorer l’auditabilité.
A.3 — Principes de validation JWT¶
Validation cryptographique stricte ; rejet par défaut de toute valeur non explicitement autorisée ; absence d’hypothèse implicite ; décisions déterministes (acceptation/rejet).
A.4 — Isolation par environnement (principe)¶
Garantir qu’un token émis dans un environnement ne puisse pas être accepté dans un autre ; aucune escalade ni confusion inter-environnements. Le mécanisme précis d’identification est défini de manière normative en Annexe B.
A.5 — Gestion des erreurs et observabilité¶
En cas d’erreur IAM : aucun token émis, indisponibilité observable, erreurs distinguables des refus d’autorisation. Formats/codes/signaux précis non imposés ici.
A.6 — Journalisation (principes généraux)¶
Objectifs : traçabilité des événements de sécurité, auditabilité, détection d’anomalies. Exigences : éviter toute fuite de secrets, rester exploitable sans exposer de données sensibles. Les exigences minimales opposables sont définies dans le corps normatif.
A.7 — Évolutivité et gouvernance¶
Annexe évolutive sans impact contractuel, accompagnant les mises à jour de sécurité et support d’audit. Toute divergence avec l’Annexe B est sans effet juridique.
12. Annexe B — Paramètres IAM / JWT normatifs¶
Statut : NORMATIF — CONTRACTUEL. Cette annexe fait partie intégrante de PD-235. Elle constitue la seule source de vérité normative pour les paramètres IAM/JWT utilisés par les invariants INV-IAM-01 à INV-IAM-11. Toute implémentation, tout test et tout audit doit s’y référer.
B.1 — Issuers autorisés par environnement¶
Chaque environnement ProbatioVault est identifié par un issuer OIDC unique et exclusif.
| Environnement | Issuer autorisé |
|---|---|
| dev | https://id.dev.probatiovault.com |
| staging | https://id.staging.probatiovault.com |
| prod | https://id.probatiovault.com |
Règle normative : tout token dont le claim iss ne correspond pas à l’issuer de l’environnement courant est rejeté.
B.2 — Audiences autorisées¶
| Audience |
|---|
| probatiovault-api |
| probatiovault-services |
| probatiovault-workers |
| probatiovault-frontend |
Règle normative : un token doit contenir au moins une audience appartenant à cette liste ; toute autre audience entraîne un rejet.
B.3 — Algorithmes cryptographiques autorisés¶
| Algorithmes autorisés |
|---|
| ES256 |
| ES384 |
| RS256 |
Algorithmes interdits : none et tout algorithme non listé ci-dessus. Règle : tout token signé avec un algorithme non autorisé est rejeté.
B.4 — Exigences de clés cryptographiques¶
| Type de clé | Taille minimale |
|---|---|
| EC P-256 | 256 bits |
| EC P-384 | 384 bits |
| RSA | ≥ 2048 bits |
Toute clé ne respectant pas ces tailles rend le token invalide.
B.5 — Claims JWT requis¶
Claims obligatoires : iss, aud, sub, iat, exp. Le claim nbf est optionnel ; s’il est présent, il est évalué. L’absence ou l’invalidité d’un claim requis entraîne un rejet.
B.6 — Contraintes temporelles¶
| Paramètre | Valeur |
|---|---|
| Durée maximale d’un access token | 15 minutes |
| Tolérance d’horloge | ± 2 minutes |
B.7 — Flux OAuth2 / OIDC autorisés¶
| Type de client | Flux autorisé |
|---|---|
| Service à service | Client Credentials |
| Backend applicatif | Authorization Code |
| Frontend web | Authorization Code + PKCE |
| Client mobile | Authorization Code + PKCE |
Tout token issu d’un flux non listé est rejeté.
B.8 — Gouvernance et évolution¶
Annexe fermée : toute valeur non listée est interdite. Toute modification doit être versionnée, peut être effectuée sans modifier les invariants, et ne doit pas introduire d’ambiguïté rétroactive.
Références¶
- Epic : Socle IAM / Sécurité
- JIRA : PD‑XX
- Repos concernés : infra / backend
- Documents associés : PD‑26‑specification.md