Protocole formel de migration probatoire vérifiable¶
Référence : PD-254 Version : 1.0.0 Date : 2026-03-13 Normes : NF Z42-013:2020 §12.1, ISO 14641 Statut : VALIDÉ
1. Objet¶
Ce protocole définit les étapes contractuelles, auditables et reproductibles pour toute migration probatoire de stockage. Il garantit l'intégrité cryptographique, la lisibilité post-migration, la traçabilité complète et la conformité NF Z42-013:2020 §12.1.
Le protocole couvre la vérification et la preuve de conformité de migration. L'exécution technique de migration de données n'est pas couverte.
2. Types de migration couverts¶
2.1 Migration de support¶
Transfert d'objets probatoires d'un type de support physique vers un autre (ex: HDD → SSD, bande magnétique → stockage objet cloud) sans changement de provider ni de région.
Prérequis spécifiques :
- Compatibilité des modes de verrouillage WORM entre supports source et cible
- Validation que le support cible supporte Object Lock (si applicable)
2.2 Migration de provider¶
Transfert d'objets probatoires d'un fournisseur cloud vers un autre (ex: OVH → AWS, AWS → Scaleway) avec potentiellement un changement d'API et de format d'adressage.
Prérequis spécifiques :
- Mapping des politiques de rétention WORM entre providers
- Validation des endpoints blockchain accessibles depuis le nouveau provider
- Compatibilité des formats de clé S3 (
s3_object_key)
2.3 Migration de région¶
Transfert d'objets probatoires d'une région géographique vers une autre au sein du même provider (ex: eu-west-3 → eu-central-1) pour des raisons de souveraineté, latence ou résilience.
Prérequis spécifiques :
- Conformité RGPD de la région cible
- Disponibilité du registre d'ancrage blockchain depuis la région cible
- Latence réseau acceptable pour les vérifications HSM
3. Machine d'états formelle¶
3.1 États formels (10)¶
| État | Type | Description |
|---|---|---|
DRAFT | Initial | Campagne créée, préconditions non vérifiées |
PRECHECK_RUNNING | Exécution | Contrôles pré-migration en cours |
PRECHECK_PASSED | Intermédiaire | Tous contrôles préliminaires OK |
PRECHECK_FAILED | Intermédiaire | Au moins un contrôle KO |
CUTOVER_AUTHORIZED | Intermédiaire | Migration autorisée |
POSTCHECK_RUNNING | Exécution | Contrôles post-migration en cours |
VERIFIED | Intermédiaire | Tous contrôles post-migration OK |
ATTESTED | Terminal (succès) | Attestation HSM signée et archivée |
ROLLED_BACK | Terminal (échec maîtrisé) | Annulation effectuée |
RECONCILIATION_FAILED | Terminal (échec technique) | Récupération impossible |
3.2 Table des transitions¶
DRAFT ──────────────────► PRECHECK_RUNNING ✓ AUTORISÉE
DRAFT ──────────────────► (tout autre) ✗ INTERDITE
PRECHECK_RUNNING ───────► PRECHECK_PASSED ✓ AUTORISÉE (tous contrôles OK)
PRECHECK_RUNNING ───────► PRECHECK_FAILED ✓ AUTORISÉE (≥1 contrôle KO)
PRECHECK_RUNNING ───────► DRAFT ✗ INTERDITE
PRECHECK_PASSED ────────► CUTOVER_AUTHORIZED ✓ AUTORISÉE (si TTL precheck non expiré)
PRECHECK_PASSED ────────► PRECHECK_RUNNING ✓ AUTORISÉE (revalidation)
PRECHECK_PASSED ────────► DRAFT ✓ AUTORISÉE (si TTL expiré → PRECHECK_EXPIRED)
PRECHECK_FAILED ────────► PRECHECK_RUNNING ✓ AUTORISÉE (correction puis relance)
PRECHECK_FAILED ────────► CUTOVER_AUTHORIZED ✗ INTERDITE
CUTOVER_AUTHORIZED ─────► POSTCHECK_RUNNING ✓ AUTORISÉE
CUTOVER_AUTHORIZED ─────► PRECHECK_PASSED ✓ AUTORISÉE (retour avant exécution)
CUTOVER_AUTHORIZED ─────► ROLLED_BACK ✓ AUTORISÉE (annulation)
POSTCHECK_RUNNING ──────► VERIFIED ✓ AUTORISÉE (tous contrôles OK)
POSTCHECK_RUNNING ──────► ROLLED_BACK ✓ AUTORISÉE (échec postcheck)
POSTCHECK_RUNNING ──────► RECONCILIATION_FAILED ✓ AUTORISÉE (timeout/retries épuisés)
VERIFIED ───────────────► ATTESTED ✓ AUTORISÉE (attestation signée dans SLA)
VERIFIED ───────────────► ROLLED_BACK ✓ AUTORISÉE (attestation impossible)
ATTESTED ───────────────► (toute transition) ✗ INTERDITE (terminal)
ROLLED_BACK ────────────► (toute transition) ✗ INTERDITE (terminal)
RECONCILIATION_FAILED ──► (toute transition) ✗ INTERDITE (terminal)
3.3 Codes d'erreur métier (distincts des états)¶
| Code | Condition | Transition | Traitement |
|---|---|---|---|
INVALID_INPUT | migration_id/protocol_version invalide | Aucune | Rejet requête |
INVALID_MANIFEST | Champ obligatoire absent | Aucune | Rejet precheck |
CONCURRENT_EXECUTION_DENIED | Lock actif | Aucune | Rejet lancement |
ATTESTATION_FAILED | HSM indisponible au-delà SLA | VERIFIED → ROLLED_BACK | Rollback |
PRECHECK_EXPIRED | TTL precheck dépassé | PRECHECK_PASSED → DRAFT | Relance precheck |
MANIFEST_STALE | source_object_count diverge | POSTCHECK_RUNNING → ROLLED_BACK | Nouvelle campagne |
Règle : les codes métier ne sont PAS des états de la machine d'états. Ils ne provoquent aucune transition sauf les cas explicites ci-dessus.
4. Procédure opérationnelle¶
4.1 Flux F1 — Préparation¶
- Créer une campagne avec
migration_id(UUID v4),migration_typeetprotocol_version - Valider le format de tous les identifiants
- Vérifier l'absence de campagne dupliquée (idempotence)
- Acquérir le lock distribué
migration:lock:{migration_id} - Vérifier le quota de l'initiateur (max 3 lancements/heure)
- Vérifier les préconditions :
- Accès lecture/écriture source
- Accès lecture/écriture cible
- Accès registre d'ancrage blockchain
- Accès HSM (clés dédiées provisionnées)
- Runbook de rollback présent et versionné
- Transition
DRAFT → PRECHECK_RUNNING
4.2 Flux F2 — Precheck et manifest de référence¶
- Inventorier tous les objets source (doc_id, sha3, merkle_root, s3_object_key, size, timestamp, tx_hash)
- Valider le format de chaque champ selon les contraintes contractuelles
- Générer
manifest.jsonen JSON canonique (RFC 8785 JCS) - Calculer
manifest_hash= SHA3-256 du JSON canonique - Signer le manifest via HSM →
manifest_signature - Stocker
manifest_hash+manifest_signaturedans un registre indépendant - Enregistrer
source_object_count - Calculer le Global Root Hash (GRH) :
- Extraire tous les
merkle_root - Trier par ordre lexicographique croissant hex lowercase
- Concaténer les chaînes triées
- SHA3-256 de la concaténation
- Exécuter les contrôles precheck :
- Intégrité SHA3 objet par objet
- Cohérence Merkle root objet par objet
- Vérification ancrages blockchain (100% du lot)
- Lisibilité sur échantillon (3 critères : I/O, MIME, décodage 1024 octets)
- Produire le rapport precheck JSON
- Transition selon résultat :
PRECHECK_PASSEDouPRECHECK_FAILED
4.3 Flux F3 — Postcheck après migration¶
- Vérifier que le TTL du precheck n'est pas expiré (défaut 72h, max 168h)
- Charger le manifest de référence immuable
- Revalidation du manifest :
- Recalculer SHA3-256 du manifest et comparer avec
manifest_hashstocké - Vérifier
manifest_signaturevia HSM - Si divergence → campagne KO immédiate
- Revalidation du nombre d'objets source :
- Comparer le nombre actuel avec
source_object_countenregistré - Si divergence → campagne KO, code
MANIFEST_STALE - Inventorier le dataset cible post-migration
- Calculer
hash_global_after(même algorithme GRH) - Comparer pré/post :
- SHA3 objet par objet
- Merkle root objet par objet
- GRH global
- Ancrages blockchain
- Lisibilité post-migration
- Produire le rapport différentiel JSON
- Transition :
VERIFIED,ROLLED_BACKouRECONCILIATION_FAILED
4.4 Flux F4 — Attestation probatoire¶
- Générer
migration_attestation.jsonconforme au schéma contractuel - Inclure
protocol_version,manifest_hash,hash_global_before/after - Signer l'attestation via HSM
- Archiver l'attestation en stockage probatoire WORM
- Notifier DevOps/TechLead/PO du verdict
- Transition
VERIFIED → ATTESTED(terminal)
4.5 Flux F5 — Dry-run¶
- Exécuter F1 et F2 normalement
- Simuler F3 en comparant le dataset source avec lui-même (source/source)
- Interdire toute transition vers exécution effective
- Produire le rapport dry-run avec code retour CI explicite
5. Checklist pré-migration¶
| # | Vérification | Responsable | Bloquant |
|---|---|---|---|
| 1 | Accès lecture source confirmé | Ops | Oui |
| 2 | Accès écriture cible confirmé | Ops | Oui |
| 3 | Registre blockchain accessible | Ops | Oui |
| 4 | Clés HSM provisionnées (pv-migration-manifest-*, pv-migration-attestation-*) | Security | Oui |
| 5 | Runbook rollback présent et versionné | Ops | Oui |
| 6 | Fenêtre de maintenance planifiée | Ops | Oui |
| 7 | Notification stakeholders programmée | PM | Non |
| 8 | Pipeline CI configuré avec quality gate | DevOps | Oui |
| 9 | Espace disque/stockage cible suffisant | Ops | Oui |
| 10 | Dry-run exécuté avec succès | DevOps | Oui |
6. Runbook de rollback¶
6.1 Déclenchement¶
Le rollback est déclenché si :
- Au moins un invariant est violé au postcheck
- L'attestation HSM ne peut pas être produite dans le SLA (défaut 15min)
- Décision opérationnelle avant exécution effective
6.2 Procédure¶
- Arrêt immédiat de toute opération de migration en cours
- Vérification de l'intégrité des données source (aucune suppression)
- Basculement du routage vers la source originale
- Notification de tous les stakeholders
- Archivage des rapports d'échec (pas de purge — conservation des preuves)
- Transition vers
ROLLED_BACK(terminal)
6.3 Objectif temporel¶
- Cible : ≤ 4 heures (P95)
- Maximum : 8 heures
7. Mécanismes de protection¶
| Mécanisme | Clé | TTL | Comportement |
|---|---|---|---|
| Lock distribué | migration:lock:{migration_id} | 600s (configurable 60-3600s) | Rejet si lock actif |
| Idempotence | migration:idemp:{migration_id}:{phase} | 168h (configurable 1-720h) | Même résultat retourné |
| Rate-limiting | migration:rate:{initiator} | 1h (fenêtre glissante) | Max 3/h/initiateur |
| Réconciliation | Cron 5min (configurable 1-60min) | — | Reprise orphelins |
| Clearing conditionnel | Compteur DB par campagne | — | N cycles conformes consécutifs requis |
8. Références normatives¶
- NF Z42-013:2020 §12.1 — Exigences de migration de supports d'archivage électronique
- ISO 14641 — Archivage électronique — spécifications relatives à la conception et au fonctionnement d'un système d'informations pour la conservation d'informations électroniques
- PD-44 — WORM Object Lock (contraintes de rétention)
- PD-54 — Merkle Tree (arbres de preuves)
- PD-55 — Worker d'ancrage blockchain
- PD-36/37 — HSM PKCS#11 / Audit signature
- PD-245 — Format de preuve multi-chain (hors périmètre changement de format)
Document généré dans le cadre du protocole PD-254. Toute modification requiert une revue formelle et un incrément de version.