Chapitre 7 — Tracabilite et audit¶
Statut : DRAFT | Derniere mise a jour : 2026-02-26 | Story : PD-249
7.1 Piste d'audit append-only¶
Principe fondamental¶
ProbatioVault maintient un journal d'audit immutable conforme aux exigences de tracabilite de la norme NF Z42-013:2020 SS9.2 et de la norme ISO 14641:2018 SS11.4. Chaque action significative -- ingestion, consultation, destruction, administration -- genere un evenement enregistre de maniere irreversible dans le schema vault_secure.audit_log.
Le caractere immutable repose sur un mecanisme de protection au niveau de la base de donnees : un trigger PostgreSQL BEFORE UPDATE OR DELETE intercepte toute tentative de modification ou de suppression et leve une exception. Aucun chemin applicatif ne permet de contourner cette protection, car le trigger est execute par le moteur de base de donnees lui-meme, independamment de la couche applicative.
Propriete WORM du journal : le journal d'audit fonctionne selon le principe Write Once Read Many. Une fois une entree inseree, elle ne peut etre ni modifiee, ni supprimee, ni reordonnee. Cette garantie est assurée par :
- le trigger PostgreSQL bloquant les operations
UPDATEetDELETE; - l'absence de toute route API permettant la modification d'une entree existante ;
- la signature cryptographique HSM rendant toute alteration detectable (cf. section 7.3).
Schema de la table audit_log¶
La table vault_secure.audit_log constitue le registre central de tracabilite. Chaque entree contient les champs suivants :
| Champ | Type | Description |
|---|---|---|
id | UUID | Identifiant unique de l'entree d'audit |
entry_canonical | TEXT | Representation JSON canonique RFC 8785 de l'evenement |
entry_hash | BYTEA | Empreinte SHA3-256 (32 octets) du JSON canonique |
hsm_signature | BYTEA | Signature ECDSA au format DER produite par le HSM |
hsm_key_id | VARCHAR | Label de la cle HSM utilisee pour la signature |
created_at | TIMESTAMPTZ | Horodatage de creation (genere cote serveur) |
actor_id | UUID | Identifiant de l'utilisateur ayant declenche l'action |
action_type | VARCHAR | Type d'evenement au format domaine.action |
entity_id | UUID | Identifiant de l'entite concernee (document, dossier, cle) |
Les champs actor_id, action_type et entity_id sont indexes pour permettre des recherches performantes lors des audits.
Stockage et retention¶
Le journal d'audit est stocke dans le schema securise vault_secure de la base PostgreSQL, protege par les mecanismes RLS (Row-Level Security) du systeme. La retention des entrees d'audit est indefinie : aucune politique de purge automatique ne s'applique au journal. Cette conservation permanente repond a l'exigence normative de tracabilite complete sur toute la duree de vie du SAE.
7.2 Journalisation des evenements¶
Taxonomie des evenements¶
Le systeme d'audit couvre l'ensemble des actions significatives du SAE, organisees en six domaines fonctionnels. Chaque type d'evenement suit la convention de nommage domaine.action pour garantir une classification non ambigue.
Domaine Document -- Cycle de vie des archives :
| Type d'evenement | Declencheur |
|---|---|
document.upload | Ingestion d'un nouveau document dans le SAE |
document.download | Consultation et telechargement d'un document |
document.delete | Demande de suppression d'un document |
document.seal | Scellement probatoire (hash, Merkle, horodatage) |
document.verify | Verification d'integrite a la demande |
document.archive | Archivage d'un document |
Domaine Partage -- Operations de re-chiffrement delegue (PV-PRE) :
| Type d'evenement | Declencheur |
|---|---|
pre.share.create | Creation d'un partage delegue |
pre.share.revoke | Revocation d'un partage existant |
pre.reencrypt | Operation de re-chiffrement par le proxy |
pre.access | Acces a un document via partage delegue |
Domaine Cles -- Gestion du materiel cryptographique :
| Type d'evenement | Declencheur |
|---|---|
key.rotation | Rotation d'une cle de chiffrement |
key.envelope.create | Creation d'une enveloppe de cle |
key.envelope.revoke | Revocation d'une enveloppe de cle |
key.device.register | Enregistrement d'un appareil |
key.device.revoke | Revocation d'un appareil |
key.recovery.init | Initialisation d'une procedure de recuperation |
key.recovery.complete | Finalisation d'une recuperation de cle |
Domaine Authentification -- Sessions et identite :
| Type d'evenement | Declencheur |
|---|---|
user.login | Connexion reussie |
user.login.failed | Tentative de connexion echouee |
user.logout | Deconnexion |
user.mfa.enable | Activation de l'authentification multi-facteurs |
user.mfa.disable | Desactivation de l'authentification multi-facteurs |
user.password.change | Changement de mot de passe |
user.session.revoke | Revocation de session |
Domaine Administration -- Operations privilegiees :
| Type d'evenement | Declencheur |
|---|---|
admin.user.create | Creation d'un compte utilisateur |
admin.user.delete | Suppression d'un compte utilisateur |
admin.user.suspend | Suspension d'un compte |
admin.user.reactivate | Reactivation d'un compte suspendu |
admin.role.assign | Attribution d'un role |
admin.role.revoke | Revocation d'un role |
Domaine Systeme et Securite -- Evenements internes et alertes :
| Type d'evenement | Declencheur |
|---|---|
system.backup | Sauvegarde systeme |
system.restore | Restauration systeme |
system.maintenance | Operation de maintenance |
audit.export | Export du journal d'audit |
audit.verify | Verification de l'integrite du journal |
audit.violation.detected | Detection d'une violation d'audit |
security.invariant.violation | Violation d'un invariant de securite |
security.ddl.detected | Detection d'une operation DDL non autorisee |
access.allow | Acces autorise a une ressource |
access.deny | Acces refuse a une ressource |
Controle d'acces : journal des autorisations et refus¶
Au-dela des evenements metier, le SAE journalise chaque decision de controle d'acces. Chaque tentative d'acces a une ressource protegee genere un evenement access.allow ou access.deny contenant :
- l'identite de l'acteur (ou
nullpour les requetes non authentifiees) ; - la ressource ciblee (type et identifiant) ;
- l'action tentee (lecture, ecriture, suppression) ;
- le code de refus le cas echeant (
UNAUTHORIZED,FORBIDDEN,RATE_LIMITED,RESOURCE_SEALED, etc.) ; - le contexte de la requete (methode HTTP, chemin, identifiant de requete, claims JWT).
Ce mecanisme est implemente par un intercepteur NestJS (AccessAuditInterceptor) associe a un decorateur @AuditedResource qui permet d'annoter chaque endpoint avec le type de ressource et l'action concernee. L'interception est systematique : aucun acces a une ressource protegee ne peut echapper a la journalisation.
Format canonique des evenements¶
Chaque evenement d'audit est serialise selon la norme RFC 8785 (JSON Canonicalization Scheme -- JCS) avant signature. Cette canonicalisation produit une representation JSON deterministe garantissant que deux evenements identiques produisent exactement la meme chaine d'octets. Les regles appliquees sont :
- Tri lexicographique des cles d'objet par points de code Unicode ;
- Absence d'espaces blancs superflus (pas d'indentation, pas de separateurs) ;
- Nombres : representation minimale sans notation scientifique pour les entiers ;
- Chaines : echappement minimal conforme a la specification JSON.
Seuls les champs fonctionnels sont inclus dans le perimetre signe : actorId, actionType, entityId, entityType, metadata, timestamp. Les champs contextuels ipAddress et userAgent sont stockes a des fins d'investigation mais exclus de la signature pour des raisons de confidentialite (ces donnees peuvent varier sans que l'evenement metier soit altere).
Retention¶
La politique de retention des evenements d'audit est alignee sur la conservation indefinie du journal (cf. section 7.1). Aucun mecanisme de purge automatique n'est implemente. Cette approche garantit la disponibilite de la piste d'audit complete pour toute verification future, conformement aux exigences ISO 14641 SS11.4 et NF Z42-013 SS9.2.
7.3 Signature HSM des journaux¶
Architecture de signature¶
Chaque entree du journal d'audit est signee cryptographiquement par un HSM (Hardware Security Module) via le protocole PKCS#11. Cette signature garantit deux proprietes essentielles pour la valeur probante :
- Integrite : toute modification d'une entree invalide sa signature ;
- Non-repudiation : la cle privee de signature ne quitte jamais le HSM, rendant impossible la production de fausses signatures en dehors du materiel securise.
L'algorithme de signature utilise est ECDSA sur courbe P-384 avec SHA-384 (ECDSA_SHA384), offrant un niveau de securite de 192 bits adapte a la conservation probatoire de longue duree. La cle dediee porte le label probatiovault-audit-ecdsa-p384 et presente les attributs suivants :
| Attribut PKCS#11 | Valeur | Justification |
|---|---|---|
CKA_EXTRACTABLE | false | Cle non exportable |
CKA_SIGN | true | Autorisation de signature |
CKA_DECRYPT | false | Usage restreint a la signature |
CKA_DERIVE | false | Pas de derivation de cle |
CKA_SENSITIVE | true | Materiel sensible |
CKA_TOKEN | true | Cle persistante dans le HSM |
Pipeline de signature¶
Le processus de signature d'une entree d'audit suit quatre etapes sequentielles, illustrees par le diagramme ci-dessous :
sequenceDiagram
participant App as Application
participant Canon as JsonCanonicalizeService
participant Hash as HashService
participant HSM as HSM PKCS#11
participant DB as PostgreSQL
App->>Canon: Extraction champs signes
Canon->>Canon: Canonicalisation RFC 8785
Canon->>Hash: JSON canonique
Hash->>Hash: SHA3-256 (32 octets)
Hash->>HSM: Hash buffer
HSM->>HSM: ECDSA P-384 Sign
HSM-->>App: Signature DER
App->>DB: INSERT append-only
Note over DB: Trigger immutabilite actif Etape 1 -- Extraction : les champs fonctionnels de l'evenement (actorId, actionType, entityId, entityType, metadata, timestamp) sont extraits. Les champs contextuels (ipAddress, userAgent) sont exclus du perimetre signe.
Etape 2 -- Canonicalisation : le JsonCanonicalizeService produit une representation JSON conforme a la RFC 8785. Le service offre egalement une methode de verification isCanonical() permettant de confirmer qu'une chaine JSON est deja sous forme canonique.
Etape 3 -- Hachage : le HashService calcule l'empreinte SHA3-256 du JSON canonique, produisant un hash de 32 octets. Ce hash constitue le message soumis au HSM pour signature.
Etape 4 -- Signature HSM : le HSM signe le hash avec la cle dediee via l'interface PKCS#11. La cle privee reste dans le perimetre materiel du HSM durant toute l'operation. La signature produite est au format DER (Distinguished Encoding Rules).
L'ensemble (JSON canonique, hash, signature, identifiant de cle) est persiste dans la table vault_secure.audit_log en une seule operation INSERT, protegee par le trigger d'immutabilite.
Resilience : queue de signature asynchrone¶
En cas d'indisponibilite temporaire du HSM, le systeme ne bloque pas le flux operationnel. L'architecture prevoit une file de traitement asynchrone BullMQ pour gerer les retentatives de signature :
graph TB
subgraph Flux nominal
A[Evenement audit] --> B[AuditLogService]
B --> C{HSM disponible ?}
C -->|Oui| D[Signature synchrone]
D --> E[INSERT audit_log]
end
subgraph Flux de resilience
C -->|Non| F[Queue BullMQ<br/>audit-signature]
F --> G[AuditSignatureProcessor]
G --> H{Signature OK ?}
H -->|Oui| E
H -->|Non, retries epuises| I[Dead Letter Queue]
I --> J[DLQ Retry Processor]
J --> K[Alerte si age > 24h]
end La file audit-signature est configuree avec les parametres suivants :
| Parametre | Valeur | Description |
|---|---|---|
| Tentatives maximales | 3 | Nombre de retentatives avant mise en DLQ |
| Strategie de backoff | Exponentiel | Delais croissants : 1s, 2s, 4s |
| Jobs completes conserves | 100 | Historique des signatures reussies |
| Jobs echoues conserves | 1000 | Historique des echecs pour investigation |
Apres epuisement des retentatives, l'entree est transferee dans une Dead Letter Queue (DLQ) persistee en base de donnees (audit_signature_dlq). Un processeur dedie (AuditDlqRetryProcessor) retente periodiquement la signature des entrees DLQ. Les entrees non resolues declenchent une alerte operationnelle apres 24 heures, et une alerte critique lorsque le nombre d'entrees en attente depasse 10.
Un administrateur peut egalement declencher une retentative manuelle ou marquer une entree comme irrecuperable (ABANDONED) avec justification tracee. Les etats possibles d'une entree DLQ sont : PENDING, RETRYING, RESOLVED, ABANDONED.
Verification d'integrite¶
Le systeme expose une capacite de verification permettant de valider l'integrite de toute entree d'audit. La verification procede en trois etapes :
- Verification du hash : recalcul du SHA3-256 a partir du
entry_canonicalstocke et comparaison avec leentry_hashenregistre ; - Verification de la signature : validation de la signature ECDSA via la cle publique du HSM ;
- Verification de la coherence : controle que le JSON canonique stocke est bien sous forme canonique (via
isCanonical()).
Le resultat de verification contient un indicateur global (valid/invalid) et le detail de chaque controle (hashMatch, signatureValid, entryIntact). Cette capacite peut etre invoquee unitairement ou par lot, et constitue le mecanisme de base pour les audits externes et la verification d'integrite periodique (cf. section 7.5).
7.4 Bordereau de destruction¶
Contexte et cadre normatif¶
La destruction definitive d'un document archive est une operation irreversible qui necessite une preuve probatoire autonome. Le bordereau de destruction (PD-250, statut : DONE) constitue cette preuve : il atteste de maniere incontestable quels documents ont ete detruits, quand, et dans quelles conditions.
Ce mecanisme repond aux exigences suivantes :
- ISO 14641:2018 SS11.4 : tracabilite et preuve de destruction, auditabilite ;
- NF Z42-013:2020 SS9.2 : journalisation, integrite et conservation des preuves ;
- Reglement eIDAS art. 26 (signature qualifiee) et art. 42 (horodatage qualifie) ;
- RGPD : minimisation des donnees (aucune donnee personnelle dans le bordereau).
Principe fail-closed¶
La destruction physique d'un document (suppression de l'objet S3 et de la reference en base) n'est autorisee qu'apres la production et la validation complete du bordereau. Si la signature ou l'horodatage du bordereau echoue, aucune destruction n'est executee. Ce principe fail-closed garantit qu'il ne peut exister de destruction sans preuve associee.
Contenu du bordereau¶
Chaque batch de destruction produit exactement un bordereau consolide au format PDF/A. Le contenu est strictement limite aux champs techniques autorises, a l'exclusion de toute donnee personnelle directe :
| Champ autorise | Description |
|---|---|
batchId | Identifiant unique du batch de destruction (UUID) |
| Horodatage du run | Date et heure d'execution du job de destruction |
documentId technique | Identifiant interne du document detruit |
| Type documentaire | Classification du document |
| Hash probatoire | Empreinte SHA3-256 du document au moment du scellement |
| Date de scellement | Horodatage du scellement initial du document |
| Date d'expiration | Date de fin de la periode de retention |
| Date de destruction prevue | Date calculee d'eligibilite a la destruction |
Exclusions : nom, prenom, email, adresse, numero de telephone, numero de securite sociale et toute donnee permettant l'identification directe d'une personne physique.
Scellement du bordereau¶
Le bordereau suit un processus de scellement en trois etapes :
- Generation PDF/A : le contenu est mis en forme dans un document PDF/A conforme ;
- Signature electronique : le bordereau est signe par un service de signature qualifie (eIDAS art. 26) ;
- Horodatage RFC 3161 : un jeton d'horodatage qualifie (eIDAS art. 42) est appose sur le bordereau signe.
Si l'horodatage echoue apres les tentatives de retentative configurees (3 par defaut), le batch passe en etat FAILED et aucune destruction n'est executee.
Conservation¶
Les bordereaux de destruction beneficient d'une conservation indefinie. Ils sont stockes en tant que documents probatoires avec les protections suivantes :
- statut
SEALEDsans date d'expiration (jamais eligibles a la destruction automatique) ; - protection WORM PostgreSQL via triggers
SECURITY DEFINER; - Object Lock COMPLIANCE sur S3 avec retention maximale.
Un endpoint d'administration, restreint au role ADMIN, permet la consultation des bordereaux avec filtrage par date et par batch.
Tracabilite unitaire¶
Chaque document detruit dans un batch genere une entree d'audit individuelle contenant la reference au documentId, au batchId et au bordereauId. Ces entrees respectent les proprietes de non-perte (persistance transactionnelle ACID), d'ordre causal (sequence PostgreSQL audit_seq monotone croissante) et de completude (exactement une entree par document traite).
7.5 Rapports d'integrite¶
Statut : En cours de developpement (PD-251, Q1 2026). Cette section decrit l'architecture cible et les mecanismes deja specifies. Les implementations partielles sont signalees.
Objectif¶
Le mecanisme de verification d'integrite periodique vise a detecter de maniere proactive toute corruption de la chaine probatoire (documents WORM, preuves Merkle, jetons TSA, ancres blockchain). Il repond a l'exigence NF Z42-013 SS11.1 et ISO 14641 SS6.2 concernant la verification periodique de l'integrite avec tracabilite.
Chaine de preuve verifiee¶
Chaque cycle de verification (run) examine quatre maillons pour chaque archive selectionnee :
| Maillon | Verification | Resultat attendu |
|---|---|---|
| Integrite document | Recalcul SHA3-256 et comparaison avec le hash de reference | OK / KO / INDETERMINE |
| Coherence Merkle | Validation de la preuve d'inclusion dans l'arbre de Merkle | OK / KO / INDETERMINE |
| Horodatage TSA | Verification du jeton RFC 3161 | OK / KO / INDETERMINE |
| Ancre blockchain | Validation de l'ancrage sur la chaine publique | OK / KO / INDETERMINE |
Aucune archive ne peut etre marquee "verifiee" si l'un des quatre maillons n'a pas un resultat explicite.
Double verification avant gel¶
En cas de mismatch de hash detecte, une procedure de confirmation en deux etapes evite les faux positifs :
- Relecture via une nouvelle connexion S3 et recalcul independant du SHA3-256 ;
- Lecture alternative (endpoint HEAD + GET) avec recalcul.
Si le mismatch est confirme apres ces verifications (3 tentatives maximum, timeout de 5 secondes par tentative), le document transite vers l'etat SUSPECT et la procedure de reaction graduee est declenchee.
Reaction graduee¶
La reponse a une anomalie confirmee suit quatre phases :
| Phase | Action | Sortie |
|---|---|---|
| Phase 1 -- Gel | Passage en etat SUSPECT, blocage lecture publique et export | Evenement signe append-only |
| Phase 2 -- Snapshot forensique | Collecte : hash attendu/observe, preuve Merkle, etat TSA et blockchain | Snapshot signe HSM |
| Phase 3 -- Restauration | Tentative depuis CRR Francfort, recalcul hash post-restauration | RESTORED si coherent, CORRUPTED_CONFIRMED sinon |
| Phase 4 -- Rapport d'incident | JSON canonique RFC 8785 signe HSM + PDF signe | Rapport complet traçable |
Format du rapport de run¶
Chaque run de verification produit un rapport, y compris en l'absence d'anomalie. Le rapport contient :
- le perimetre traite (nombre d'archives, criteres de selection) ;
- les metriques de verification (duree, nombre de verifications par maillon) ;
- les anomalies detectees avec detail de chaque phase de reaction ;
- le statut final du run ;
- l'horodatage du rapport.
La retention des rapports est configurable (defaut : 3 650 jours, soit 10 ans), avec des bornes contractuelles de 1 a 36 500 jours.
Priorisation et frequence¶
Les archives sont priorisees selon un score multi-criteres (0.00 a 1.00) tenant compte du statut juridique, de l'age et de la criticite contractuelle. Les archives dont le score depasse le seuil de haute priorite (defaut : 0.80) sont traitees en premier. La frequence de verification est configurable par cron, avec des politiques de scope (complet, partitionne, rotatif).
Conformite normative du module de tracabilite¶
Le tableau suivant recapitule la couverture des exigences normatives par les mecanismes decrits dans ce chapitre :
| Exigence normative | Mecanisme ProbatioVault | Section |
|---|---|---|
| ISO 14641 SS11.4 -- Tracabilite | Journal append-only signe HSM | 7.1, 7.3 |
| NF Z42-013 SS9.2 -- Journalisation | Evenements exhaustifs, format canonique | 7.2 |
| ISO 14641 SS11.4 -- Preuve de destruction | Bordereau PDF/A signe et horodate | 7.4 |
| NF Z42-013 SS11.1 -- Verification periodique | Rapports d'integrite (en cours) | 7.5 |
| ISO 14641 SS6.2 -- Verification periodique | Verification 4 maillons avec reaction graduee | 7.5 |
| eIDAS art. 26 -- Signature qualifiee | Signature HSM ECDSA P-384 | 7.3, 7.4 |
| eIDAS art. 42 -- Horodatage qualifie | Jeton RFC 3161 sur les bordereaux | 7.4 |
| RGPD -- Minimisation des donnees | Exclusion des donnees personnelles des bordereaux | 7.4 |
References¶
- RFC 8785 -- JSON Canonicalization Scheme (JCS) : https://www.rfc-editor.org/rfc/rfc8785
- RFC 3161 -- Time-Stamp Protocol : https://www.rfc-editor.org/rfc/rfc3161
- PKCS#11 -- Cryptographic Token Interface Standard : https://docs.oasis-open.org/pkcs11/
- ISO 14641:2018 -- Archivage electronique : conception et exploitation d'un SAE
- NF Z42-013:2020 -- Archivage electronique : specifications relatives a la conception et a l'exploitation de systemes informatiques
- eIDAS (UE) n 910/2014 -- Reglement sur l'identification electronique et les services de confiance