PD-235 — Plan d'implémentation¶
Navigation User Story
| Document | | | ---------- | -- | | [Specification](PD-235-specification.md) | | | **Plan d'implementation** | *(ce document)* | | [Tests contractuels](PD-235-tests.md) | | | Criteres d'acceptation | *(a venir)* | | Retour d'experience | *(a venir)* |1. Decoupage en composants¶
1.1 Composants infrastructure (Keycloak)¶
| Composant | Responsabilite | Fichiers/Emplacement |
|---|---|---|
| Keycloak Server | IdP OAuth2/OIDC auto-heberge | ansible/roles/keycloak/ |
| Realm pv-dev | Espace identite dev | Configuration Keycloak |
| Realm pv-staging | Espace identite staging | Configuration Keycloak |
| Realm pv-prod | Espace identite production | Configuration Keycloak |
| Clients OIDC | Clients applicatifs (API, services, frontend) | Configuration realm |
| Protocol Mappers | Emission claims normatifs (tenant, authz) | Configuration realm |
| Event Listeners | Journalisation evenements auth | Configuration realm |
1.2 Composants Terraform¶
| Composant | Responsabilite | Fichiers |
|---|---|---|
| DNS Records | Enregistrements DNS pour IdP | terraform/modules/ovh_dns/ |
1.3 Composants Ansible¶
| Composant | Responsabilite | Fichiers |
|---|---|---|
| Role keycloak | Installation et configuration | ansible/roles/keycloak/ |
| Role keycloak-realm | Configuration realms par env | ansible/roles/keycloak-realm/ |
| Role keycloak-clients | Configuration clients OIDC | ansible/roles/keycloak-clients/ |
| Role keycloak-audit | Configuration journalisation | ansible/roles/keycloak-audit/ |
| Role keycloak-vault | Integration secrets Vault | ansible/roles/keycloak-vault/ |
| Role certbot | Certificats TLS Let's Encrypt | ansible/roles/certbot/ |
| Role nginx | Reverse proxy + TLS termination | ansible/roles/nginx/ |
1.4 Secrets HashiCorp Vault¶
Les secrets Keycloak sont stockes dans HashiCorp Vault (INV-05 : pas de secrets en clair).
| Secret | Path Vault | Usage | Rotation |
|---|---|---|---|
| Admin password | kv/keycloak/{env}/admin | Console admin Keycloak | Manuelle |
| DB credentials | kv/keycloak/{env}/database | Connexion PostgreSQL | Manuelle |
| Client secret API | kv/keycloak/{env}/clients/probatiovault-api | Authorization Code flow (backend applicatif) | Automatique |
| Client secret services | kv/keycloak/{env}/clients/probatiovault-services | Client Credentials flow (service a service) | Automatique |
| Client secret workers | kv/keycloak/{env}/clients/probatiovault-workers | Client Credentials flow (service a service) | Automatique |
Principe : Les playbooks Ansible lisent les secrets depuis Vault au deploiement. Aucun secret n'est stocke dans le repository Git ni dans les variables d'environnement en clair.
flowchart LR
subgraph Vault["HashiCorp Vault"]
S1[kv/keycloak/prod/admin]
S2[kv/keycloak/prod/database]
S3[kv/keycloak/prod/clients/*]
end
subgraph Ansible
P[Playbook keycloak]
end
subgraph Keycloak
K[Keycloak Server]
DB[(PostgreSQL)]
end
P -->|vault lookup| Vault
P -->|configure| K
K -->|credentials| DB 1.5 Artefacts de preuve (INV-IAM-10)¶
| Artefact | Responsabilite | Emplacement |
|---|---|---|
| Inventaire infrastructure | Preuve auto-hebergement | docs/artifacts/infra-inventory.md |
| Runbook exploitation | Procedures operationnelles | docs/runbooks/keycloak-ops.md |
| Controle d'acces admin | Preuve governance | docs/artifacts/admin-access-control.md |
| Documentation responsabilite | Chain of custody | docs/artifacts/operational-responsibility.md |
2. Flux techniques¶
2.1 Flux F1 — Decouverte OIDC¶
sequenceDiagram
participant C as Consumer (Backend)
participant K as Keycloak IdP
C->>K: GET /.well-known/openid-configuration
K-->>C: Discovery doc (issuer, jwks_uri, endpoints)
C->>K: GET /protocol/openid-connect/certs
K-->>C: JWKS (public keys) Points de verification : - Issuer correspond a l'environnement (INV-IAM-08) - JWKS accessible pour validation hors-ligne (INV-04)
2.2 Flux F2 — Emission d'un token¶
sequenceDiagram
participant CL as Client
participant K as Keycloak
participant EL as Event Logger
CL->>K: Auth Request (credentials / auth code)
Note over K: 1. Valider identite<br/>2. Generer JWT<br/>3. Signer (ES256/ES384/RS256)<br/>4. Ajouter claims normatifs
K->>EL: Log event (TOKEN_ISSUED)
K-->>CL: JWT Response (access_token) Claims emis (INV-IAM-04, Annexe B.5) : - iss : Issuer environnement (B.1) - aud : Audience(s) autorisee(s) (B.2) - sub : Identifiant utilisateur - iat : Timestamp emission - exp : Expiration (max 15min, B.6) - tenant : Identifiant tenant - authz : { roles: [...], scopes: [...] }
2.3 Flux F3 — Validation temporelle (INV-IAM-05, B.6)¶
flowchart TD
subgraph Validation["Validation temporelle (consumer)"]
T[Token recu] --> C1{iat <= now + skew ?}
C1 -->|Non| R1[Rejet: TOKEN_NOT_YET_ISSUED]
C1 -->|Oui| C2{nbf present ?}
C2 -->|Oui| C3{nbf <= now + skew ?}
C3 -->|Non| R2[Rejet: TOKEN_NOT_YET_VALID]
C3 -->|Oui| C4{exp > now - skew ?}
C2 -->|Non| C4
C4 -->|Non| R3[Rejet: TOKEN_EXPIRED]
C4 -->|Oui| OK[Token temporellement valide]
end
style skew fill:#f9f,stroke:#333 Parametres (B.6) : - skew = 120 secondes (±2 minutes) - exp - iat <= 900 secondes (15 minutes max)
Mecanisme cote consumer (backend PD-26) : - Configuration clockTolerance: 120 dans le service de validation JWT - Application homogene sur tous les claims temporels (iat, nbf, exp) - Rejet deterministe avec code d'erreur specifique
Observables : - Logs de rejet avec raison temporelle (TOKEN_EXPIRED, TOKEN_NOT_YET_VALID) - Metriques de tokens rejetes par cause temporelle - Tests contractuels TC-NEG-02 (expiration) valident le comportement
2.4 Flux F4 — Indisponibilite IdP (INV-IAM-11)¶
sequenceDiagram
participant CL as Client
participant GW as Gateway/Backend
participant K as Keycloak (DOWN)
participant EL as Event Logger
participant HC as Health Check
Note over GW,K: Detection indisponibilite
GW->>K: Health probe
K--xGW: Timeout / Connection refused
GW->>HC: Update status: IDP_UNAVAILABLE
GW->>EL: Log SERVICE_UNAVAILABLE (mandatory)
Note over CL,GW: Requete client
CL->>GW: Auth Request
GW-->>CL: HTTP 503 + error_code: "idp_unavailable" Canaux normatifs de signalisation (INV-IAM-11, spec §6) :
| Canal | Mecanisme | Observable | Distinct de 401/403 |
|---|---|---|---|
| Signal applicatif | HTTP 503 + body {"error": "idp_unavailable", "error_description": "..."} | Response HTTP | Oui (code 503 ≠ 401/403) |
| Journalisation | Event SERVICE_UNAVAILABLE obligatoire (INV-IAM-09) | Logs structures | Oui (event type distinct) |
| Indicateur d'etat | Endpoint /health/idp expose status: DOWN | Health check | Oui (endpoint dedie) |
Garanties de determinisme : - Journalisation obligatoire (pas "si possible") lors de detection d'indisponibilite - Code erreur idp_unavailable distinct de invalid_token (401) et forbidden (403) - Health endpoint /health/idp avec refresh <= 30s - Metriques exposees : idp_availability_status, idp_last_successful_check_timestamp
Implementation : - Backend PD-26 : health check periodique vers Keycloak (circuit breaker pattern) - Nginx/Gateway : probe active vers /health/ready de Keycloak - Fallback : si timeout > 5s, signaler immediatement IDP_UNAVAILABLE
3. Mapping invariants → mecanismes¶
| Invariant ID | Exigence | Mecanisme | Composant | Observable | Risque |
|---|---|---|---|---|---|
| INV-01 | IdP unique transverse | Instance Keycloak unique par plateforme | ansible/roles/keycloak/ | Endpoint discovery accessible | Instance multiple = incoherence |
| INV-02 | Auto-hebergement | VM OVH, controle ProbatioVault | Terraform + Ansible | Inventaire infra, acces admin documente | SaaS externe = non-souverainete |
| INV-03 | Isolation environnements | Realms separes dev/staging/prod | ansible/roles/keycloak-realm/ | Issuers distincts par env | Token cross-env accepte |
| INV-04 | JWT signes verifiables | Signature ES256/ES384/RS256, JWKS expose | Config realm + Protocol Mappers | JWKS endpoint, validation hors-ligne | Signature non verifiable |
| INV-05 | Pas de secrets applicatifs | Aucune cle ProbatioVault dans Keycloak | Audit config | Inspection artefacts | Fuite de secrets |
| INV-06 | Determinisme testable | Config declarative, idempotence | Ansible playbooks | Reproductibilite deploiement | Config drift |
| INV-IAM-01 | Issuer normatif | URL issuer configurable par env | keycloak-realm/vars/ | Discovery doc iss | Issuer incorrect |
| INV-IAM-02 | Audiences autorisees | Clients declares avec audiences | keycloak-clients/ | Token aud claim | Audience invalide |
| INV-IAM-03 | Algorithmes autorises | Config realm sig alg | keycloak-realm/ | JWKS alg, token header | Algo non autorise |
| INV-IAM-04 | Claims requis | Protocol Mappers configures | keycloak-clients/ | Token payload | Claim manquant |
| INV-IAM-05 | Contraintes temporelles | Token lifespan 15min (Keycloak) + clockTolerance 120s (consumer PD-26) | keycloak-realm/ + auth/services/ | Token exp, logs rejet temporel, config skew | Token longue duree, derive horloge |
| INV-IAM-06 | Flux autorises | Clients configures par flux | keycloak-clients/ | Auth flow | Flux non autorise |
| INV-IAM-07 | Isolation environnement | Realms isoles, issuers distincts | keycloak-realm/ | Validation issuer | Cross-env |
| INV-IAM-08 | Issuer environnement | URL issuer = env | keycloak-realm/vars/ | Token iss claim | Confusion env |
| INV-IAM-09 | Journalisation conforme | Event listeners + buffer local + retry + reconciliation (§7.4) | keycloak-audit/ + /var/log/keycloak/ | Logs structures sans secrets, metriques delivery, alerte perte | Fuite logs, perte evenements |
| INV-IAM-10 | Artefacts opposables | Documentation exploitation | docs/artifacts/ | Disponibilite audit | Non prouvable |
| INV-IAM-11 | Signal indisponibilite | 3 canaux normatifs: HTTP 503 + idp_unavailable, log obligatoire, endpoint /health/idp | keycloak/health/ + auth/health/ | HTTP 503 distinct 401/403, log SERVICE_UNAVAILABLE, health DOWN | Fail silencieux, signal non deterministe |
4. Mapping criteres d'acceptation → mecanismes¶
| Critere ID | Mecanisme(s) | Composant | Observable | Risque |
|---|---|---|---|---|
| CA-01 | Endpoint discovery OIDC | Nginx + Keycloak | GET /.well-known/openid-configuration HTTP 200 | Endpoint non expose |
| CA-02 | Signature JWT ES256/ES384/RS256 | Keycloak realm config | Token signé verifiable via JWKS | Algo interdit |
| CA-03 | Realms isoles par env | Keycloak multi-realm | Issuers distincts, tokens non portables | Realm partage |
| CA-04 | Aucun secret ProbatioVault | Audit configuration | Inspection vars/secrets Keycloak | Secret oublie |
| CA-05 | Journalisation evenements | Event listeners | Logs structures, requetables | Logs absents |
| CA-IAM-01 | Conformite INV-IAM-* | Tous les mecanismes | Tests contractuels TC-* | Non-conformite |
5. Mapping tests (TC-*) → mecanismes + observables¶
| Test ID | Reference spec | Mecanisme(s) | Point(s) d'observation | Niveau de test vise |
|---|---|---|---|---|
| TC-NOM-01 | F1, INV-01, CA-01 | Endpoint discovery | HTTP 200, JSON valide avec issuer/jwks_uri | E2E |
| TC-NOM-02 | F2, INV-04, CA-02 | Signature JWT | Verification crypto JWKS reussie | Integration |
| TC-NOM-03 | F3, INV-03, CA-03 | Isolation realm | Token env A rejete sur env B | E2E |
| TC-NOM-04 | INV-05, CA-04 | Audit config | Aucun secret appli dans Keycloak | Security audit |
| TC-NOM-05 | INV-06, INV-IAM-09, CA-05 | Event listeners | Logs auth/token structures | Integration |
| TC-NOM-06 | INV-IAM-09, CA-05 | Format logs | JSON structure, pas de secrets | Integration |
| TC-INV-02 | INV-02, CA-04 | Artefacts exploitation | Inventaire, runbook accessibles | Audit |
| TC-INV-03 | INV-IAM-10, CA-04 | Preuve auto-hebergement | Documentation disponible | Audit |
| TC-ERR-01 | Cas erreur | Indisponibilite IdP | Aucun token emis, erreur observable | E2E chaos |
| TC-ERR-02 | Cas erreur | Token invalide | Rejection deterministe | Unit |
| TC-ERR-03 | INV-IAM-11, CA-05 | Signal indispo (3 canaux) | HTTP 503 + idp_unavailable distinct 401/403, log obligatoire, /health/idp DOWN | E2E |
| TC-NEG-01 | INV-IAM-01 | Issuer validation | Token autre issuer rejete | Security |
| TC-NEG-02 | INV-IAM-05 | Expiration avec skew | Token expire (exp < now - 120s) rejete | Unit |
| TC-NEG-02b | INV-IAM-05 | Tolerance horloge exp | Token dans tolerance (exp > now - 120s) accepte | Unit |
| TC-NEG-02c | INV-IAM-05 | Token pas encore valide | Token nbf > now + 120s rejete | Unit |
| TC-NEG-02d | INV-IAM-05 | Tolerance horloge nbf | Token dans tolerance (nbf < now + 120s) accepte | Unit |
| TC-NEG-03 | INV-IAM-07 | Cross-env | Token autre env rejete | Security |
| TC-NEG-04 | INV-IAM-06 | Flux non autorise | Aucun token emis | Security |
| TC-NEG-05 | INV-IAM-08 | iss autre env | Token rejete | Security |
| TC-NEG-06 | INV-IAM-09, CA-05 | Logs securises | Pas de token/secret en clair | Security audit |
| TC-NR-01 | Non-regression | Discovery stable | Diff document = detection | E2E |
| TC-NR-02 | Non-regression | JWKS stable | Rotation detectable | E2E |
| TC-NR-03 | Non-regression | Isolation | Aucun contournement | E2E |
| TC-LOG-01 | INV-IAM-09, H-07 | Buffer local logs | Events ecrits dans /var/log/keycloak/events.log | Integration |
| TC-LOG-02 | INV-IAM-09, H-07 | Retry collecteur | Retry sur echec forward, alerte declenchee | Chaos |
| TC-LOG-03 | INV-IAM-09, H-07 | Reconciliation | Delta count events detecte | E2E |
6. Gestion des erreurs¶
| Code | Cas | Reponse HTTP | Message | Log (conforme INV-IAM-09) |
|---|---|---|---|---|
| E1 | Credentials invalides | 401 | invalid_grant | { event: "LOGIN_ERROR", env, result: "failure", ts } |
| E2 | Client inconnu | 401 | invalid_client | { event: "CLIENT_ERROR", env, result: "failure", ts } |
| E3 | Flux non autorise | 400 | unauthorized_client | { event: "AUTH_ERROR", env, result: "failure", ts } |
| E4 | Token invalide | 401 | invalid_token | { event: "TOKEN_ERROR", env, result: "failure", ts } |
| E5 | IdP indisponible (INV-IAM-11) | 503 | idp_unavailable (distinct de 401/403) | { event: "SERVICE_UNAVAILABLE", env, result: "unavailable", channel: "idp", ts } — obligatoire |
| E6 | Realm inconnu | 404 | realm_not_found | { event: "REALM_ERROR", env, result: "failure", ts } |
| E7 | Token expire (INV-IAM-05) | 401 | token_expired | { event: "TOKEN_TEMPORAL_ERROR", env, result: "failure", reason: "expired", ts } |
| E8 | Token pas encore valide (INV-IAM-05) | 401 | token_not_yet_valid | { event: "TOKEN_TEMPORAL_ERROR", env, result: "failure", reason: "nbf", ts } |
Format de journalisation (INV-IAM-09) :
{
"event": "LOGIN|TOKEN_ISSUED|TOKEN_DENIED|TOKEN_TEMPORAL_ERROR|SERVICE_UNAVAILABLE",
"env": "dev|staging|prod",
"result": "success|failure|unavailable",
"channel": "auth|idp",
"ts": "2025-01-06T12:00:00Z"
}
Note INV-IAM-11 : L'evenement SERVICE_UNAVAILABLE avec channel: "idp" est obligatoire lors de detection d'indisponibilite IdP. Ce log constitue l'un des 3 canaux normatifs de signalisation.
Interdits dans les logs : - Tokens JWT complets - Secrets/credentials - Cles cryptographiques - Donnees permettant reconstitution de secrets
7. Impacts securite¶
7.1 Risques identifies¶
| Risque | Probabilite | Impact | Mitigation |
|---|---|---|---|
| Compromission IdP | Faible | Critique | Isolation reseau, MFA admin, audit logs |
| Token forgery | Moyenne | Critique | Signature ES256/ES384/RS256, rotation cles |
| Cross-env attack | Moyenne | Critique | Issuers distincts, validation stricte |
| Secrets leakage logs | Moyenne | Majeur | Event listeners filtrants, audit |
| JWKS spoofing | Faible | Critique | HTTPS only, validation issuer |
| Admin access abuse | Moyenne | Critique | RBAC admin, audit trail |
7.2 Mesures de securite¶
| Mesure | Implementation | Verification |
|---|---|---|
| TLS obligatoire | Certbot + Nginx | Test SSL Labs A+ |
| Signature forte | ES256/ES384 (P-256/P-384) ou RS256 (2048+ bits) | JWKS inspection |
| Token courte duree | max 15 min (B.6) | Config realm |
| Rotation cles | Procedure documentee | Runbook |
| Audit admin | Event listeners | Logs admin |
| Isolation reseau | Security groups | Terraform |
7.3 Journalisation securisee (INV-IAM-09)¶
Conservation : Minimum 30 jours calendaires
Champs autorises (liste fermee) : - Type d'evenement (auth, emission, refus) - Environnement concerne - Resultat (succes/echec) - Horodatage
Champs interdits : - Tokens JWT - Credentials - Cles cryptographiques - Tout secret
7.4 Fiabilite de la journalisation (mitigation H-07)¶
Problematique : Les event listeners Keycloak peuvent etre asynchrones selon la configuration. En cas de perte de connexion au collecteur de logs, des evenements peuvent etre perdus, violant INV-IAM-09.
Mecanismes de garantie :
flowchart LR
subgraph Keycloak
EL[Event Listener]
BUF[(Buffer local<br/>fichier)]
end
subgraph Collecteur
LOG[Log Aggregator<br/>Loki/ELK]
end
subgraph Monitoring
MON[Prometheus]
ALT[Alerting]
end
EL -->|1. Write| BUF
BUF -->|2. Forward| LOG
BUF -.->|retry si echec| LOG
EL -->|metrics| MON
MON -->|seuil| ALT | Mecanisme | Implementation | Observable |
|---|---|---|
| Buffer local | Fichier /var/log/keycloak/events.log (rotation logrotate) | Taille buffer, age plus ancien event |
| Forward asynchrone | Filebeat/Promtail vers collecteur central | Latence delivery, queue depth |
| Retry avec backoff | 3 tentatives, backoff exponentiel (1s, 5s, 30s) | Compteur retries, echecs permanents |
| Alerte perte logs | Metrique keycloak_events_dropped_total > 0 | Alert Prometheus |
| Reconciliation | Comparaison count events IdP vs collecteur (quotidien) | Delta rapport |
Garanties : - Aucun evenement perdu tant que le buffer local est disponible (disque) - Detection rapide de toute perte via metriques et alertes (< 5 min) - Retention locale de 7 jours en fallback si collecteur indisponible - Audit de reconciliation quotidien pour verifier integrite
Tests associes : - TC-LOG-01 : Verifier que les evenements sont bufferises localement - TC-LOG-02 : Simuler perte collecteur, verifier retry et alerte - TC-LOG-03 : Verifier reconciliation detecte les ecarts
8. Hypotheses techniques¶
| ID | Hypothese | Impact si faux |
|---|---|---|
| H-01 | VM OVH disponible avec ressources suffisantes (4 vCPU, 8GB RAM) | Performances degradees |
| H-02 | Keycloak 24+ supporte ES256/ES384/RS256 | Algorithme non disponible |
| H-03 | DNS OVH permet CNAME pour id.*.probatiovault.com | Pas de custom domain |
| H-04 | PostgreSQL disponible pour persistence Keycloak | Fallback H2 non prod |
| H-05 | Certificats Let's Encrypt renouvelables automatiquement | Expiration TLS |
| H-06 | Ansible peut atteindre la VM via SSH | Deploiement impossible |
| H-07 | Event listeners Keycloak sont synchrones | Logs potentiellement perdus — mitigation: buffer local + retry + monitoring (voir §7.4) |
| H-08 | Clock sync NTP < 2 min entre IdP et consumers (pre-requis B.6 clockTolerance) | Tokens valides rejetes si derive > skew configure |
| H-09 | HashiCorp Vault disponible et accessible depuis Ansible | Deploiement impossible (secrets non disponibles) |
| H-10 | Policy Vault permet lecture kv/keycloak/* pour role deploiement | Acces secrets refuse |
9. Points de vigilance (risques, dette, pieges)¶
9.1 Risques techniques¶
| Point | Risque | Surveillance |
|---|---|---|
| Single point of failure | IdP down = auth impossible | HA planning V2 |
| Rotation cles | Tokens en vol invalides | Grace period |
| Backup/restore | Perte config realms | Backup quotidien |
| Upgrade Keycloak | Breaking changes | Tests pre-upgrade |
9.2 Dette technique acceptee¶
| Dette | Raison | Plan de remediation |
|---|---|---|
| Pas de HA | Complexite MVP | V2 avec clustering |
| Pas de DR | Budget | Plan DR documente |
| Monitoring basic | MVP | Prometheus/Grafana V2 |
| Pas de rate limiting | MVP | WAF V2 |
9.3 Pieges d'implementation¶
- Realm names : Ne pas confondre realm name et issuer path
- Flux OIDC (B.7) : Respecter strictement les flux autorises — Authorization Code pour backends applicatifs, Client Credentials pour service-a-service, Authorization Code + PKCE pour frontends. Ne jamais utiliser implicit flow.
- Mappers : Verifier l'ordre des protocol mappers (peut affecter claims)
- Logs : Desactiver default logging qui peut exposer des secrets
- Admin console : Restreindre l'acces (pas d'exposition publique)
- CORS : Configurer precisement pour eviter CSRF
- Vault : Ne jamais stocker de secrets dans les variables Ansible ou Git ; toujours utiliser
community.hashi_vault.vault_read - Client secrets rotation : Synchroniser la rotation entre Keycloak et Vault pour eviter les interruptions de service
10. Hors perimetre¶
- Federation externe (Google, FranceConnect, SAML)
- MFA / authentification forte
- Gestion cycle de vie utilisateurs (KYC, eIDAS)
- Rate limiting / WAF
- High Availability / Clustering
- Disaster Recovery automatise
- Monitoring avance (APM)
- Integration SIEM
- Automatisation rotation cles
11. Architecture cible¶
11.1 Vue d'ensemble¶
flowchart LR
subgraph External
C[Consumer<br/>Backend]
end
subgraph OVH["OVH Cloud"]
V[(HashiCorp<br/>Vault)]
N[Nginx<br/>TLS termination]
K[Keycloak<br/>Server]
P[(PostgreSQL<br/>state)]
N --> K
K --> P
K -.->|secrets| V
end
C -->|HTTPS| N 11.2 Configuration par environnement¶
| Environnement | Issuer URL | Realm | VM |
|---|---|---|---|
| dev | https://id.dev.probatiovault.com | pv-dev | vps-dev |
| staging | https://id.staging.probatiovault.com | pv-staging | vps-staging |
| prod | https://id.probatiovault.com | pv-prod | vps-prod |
11.3 Clients OIDC (Annexe B.7)¶
| Client ID | Type Keycloak | Categorie B.7 | Flux autorise | Audiences |
|---|---|---|---|---|
| probatiovault-api | Confidential | Backend applicatif | Authorization Code | probatiovault-api |
| probatiovault-services | Confidential | Service a service | Client Credentials | probatiovault-services |
| probatiovault-workers | Confidential | Service a service | Client Credentials | probatiovault-workers |
| probatiovault-frontend | Public | Frontend web | Authorization Code + PKCE | probatiovault-frontend |
Note : Conformement a B.7, les backends applicatifs (API principale) utilisent Authorization Code, tandis que les services internes autonomes (services, workers) utilisent Client Credentials. Les frontends utilisent Authorization Code + PKCE.
12. Plan de deploiement¶
12.0 Phase 0 — Provisionnement secrets Vault¶
- Creer structure
kv/keycloak/{env}/dans Vault - Generer et stocker admin password
- Generer et stocker credentials PostgreSQL
- Creer policy Vault pour acces Ansible
- Valider acces secrets depuis runner CI
12.1 Phase 1 — Infrastructure de base¶
- Provisionner DNS (Terraform)
- Installer Keycloak sur VM (Ansible + secrets Vault)
- Configurer TLS (Certbot)
- Configurer PostgreSQL backend (credentials Vault)
12.2 Phase 2 — Configuration realms¶
- Creer realms par environnement
- Configurer algorithmes de signature (B.3)
- Configurer token lifespan (B.6)
- Configurer event listeners
12.3 Phase 3 — Configuration clients¶
- Creer clients OIDC (B.7)
- Generer client secrets et stocker dans Vault
- Configurer protocol mappers (claims)
- Configurer audiences (B.2)
- Tester emission tokens
12.4 Phase 4 — Documentation et audit¶
- Generer inventaire infrastructure
- Rediger runbook exploitation
- Documenter controle d'acces admin
- Documenter acces secrets Vault
- Valider artefacts opposables (INV-IAM-10)
12.5 Phase 5 — Tests et validation¶
- Executer tests TC-NOM-*
- Executer tests TC-NEG-*
- Executer tests TC-INV-*
- Valider conformite INV-IAM-*
- Verifier aucun secret en clair dans logs/config (INV-05)
References¶
- Epic : EPIC-193 — Infrastructure Souveraine
- JIRA : PD-235
- Repos : infra
- Specification : PD-235-specification.md
- Tests : PD-235-tests.md
- Relation : PD-26 (backend consumer)