Aller au contenu

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

  1. Creer structure kv/keycloak/{env}/ dans Vault
  2. Generer et stocker admin password
  3. Generer et stocker credentials PostgreSQL
  4. Creer policy Vault pour acces Ansible
  5. Valider acces secrets depuis runner CI

12.1 Phase 1 — Infrastructure de base

  1. Provisionner DNS (Terraform)
  2. Installer Keycloak sur VM (Ansible + secrets Vault)
  3. Configurer TLS (Certbot)
  4. Configurer PostgreSQL backend (credentials Vault)

12.2 Phase 2 — Configuration realms

  1. Creer realms par environnement
  2. Configurer algorithmes de signature (B.3)
  3. Configurer token lifespan (B.6)
  4. Configurer event listeners

12.3 Phase 3 — Configuration clients

  1. Creer clients OIDC (B.7)
  2. Generer client secrets et stocker dans Vault
  3. Configurer protocol mappers (claims)
  4. Configurer audiences (B.2)
  5. Tester emission tokens

12.4 Phase 4 — Documentation et audit

  1. Generer inventaire infrastructure
  2. Rediger runbook exploitation
  3. Documenter controle d'acces admin
  4. Documenter acces secrets Vault
  5. Valider artefacts opposables (INV-IAM-10)

12.5 Phase 5 — Tests et validation

  1. Executer tests TC-NOM-*
  2. Executer tests TC-NEG-*
  3. Executer tests TC-INV-*
  4. Valider conformite INV-IAM-*
  5. Verifier aucun secret en clair dans logs/config (INV-05)

References