RFC PV-AUDIT-001 : Audit immuable et anti-rollback¶
Statut : Proposition interne Version : 1.1.0 Date : 2026-03-02 Auteur : ProbatioVault Engineering Verification formelle : TLA+ (TLC), Alloy (SAT), Z Notation, Prolog Revision : 1.1.0 — chaine de certificats dans export, schema canonique versionne, taxonomie normative probatif/informatif, chainage inter-entrees, procedure gaps destruction_seq, politique de retention
1. Introduction¶
1.1 Objectif¶
Ce document specifie le protocole PV Audit, le systeme d'audit immuable et anti-rollback de ProbatioVault. Le protocole unifie les contrats d'audit des normes ENV (PV-ENV-001) et PRE (PV-PRE-001) en un pipeline d'audit unique garantissant l'immutabilite, la tracabilite et la valeur probante des evenements.
1.2 Portee¶
Ce protocole couvre :
- Le format d'evenement canonique (JSON per RFC 8785)
- La liaison cryptographique : hash SHA3-256 + signature ECDSA P-384 via HSM
- L'append-only avec triggers PostgreSQL (BEFORE UPDATE OR DELETE)
- La revocation de TRUNCATE
- La verification offline via cle publique
- L'audit de destruction avec sequence PostgreSQL monotone
- Le fail-closed : l'indisponibilite de l'audit bloque la destruction
- Les evenements probatifs legaux : HSM + TSA obligatoires
- Les evenements informatifs legaux : TSA best-effort, HSM obligatoire
1.3 References normatives¶
| Reference | Titre | Usage |
|---|---|---|
| PV-ENV-001 | ProbatioVault Envelope Protocol | Hierarchie de cles, HSM signing |
| PV-PRE-001 | ProbatioVault PRE Protocol | Lifecycle ReKey, evidence PRE |
| PV-PROOF-001 | ProbatioVault ProofEnvelope Protocol | Preuve composite, evidence audit |
| RFC 3161 | Internet X.509 PKI TSP | Tokens d'horodatage |
| RFC 8785 | JCS (JSON Canonicalization Scheme) | Serialisation canonique |
| FIPS 202 | SHA-3 Standard | Hash SHA3-256 |
| FIPS 186-5 | Digital Signature Standard | ECDSA P-384 |
1.4 Terminologie¶
| Terme | Definition |
|---|---|
| AuditEntry | Enregistrement immuable dans l'audit log. Contient le contenu canonique, le hash SHA3-256, la signature HSM, et le timestamp. |
| Canonical Form | Serialisation JSON deterministe per RFC 8785 (JCS). Garantit un hash reproductible. |
| Destruction Audit | Audit specifique a la destruction de documents. Utilise une sequence PostgreSQL monotone pour garantir l'ordonnancement. |
| Legal Probative Event | Evenement a valeur probante legale. Requiert HSM + TSA obligatoires. |
| Legal Informative Event | Evenement informatif legal. Requiert HSM obligatoire, TSA best-effort. |
| Fail-Closed | Principe de securite : si l'audit est indisponible, les operations de destruction sont bloquees. |
| CheckResult | Resultat de verification d'une entree : OK, KO, ou INDETERMINATE. |
| AuditProof | Export d'une entree audit avec toutes les evidences pour verification offline. |
2. Vue d'ensemble du protocole¶
2.1 Structure de l'Audit Log¶
+----------------------------------------------------------------------+
| Audit Log (append-only) |
| Table: audit_logs |
| Schema: vault_audit |
+----------------------------------------------------------------------+
| |
| +------------------------------------------------------------+ |
| | AuditEntry | |
| | id : UUID | |
| | previous_entry_hash : BYTEA (SHA3-256, chainage) | |
| | entry_canonical : JSONB (RFC 8785) | |
| | entry_hash : BYTEA (SHA3-256) | |
| | hsm_signature : BYTEA (ECDSA P-384) | |
| | hsm_key_id : VARCHAR (pv-master-signing-*) | |
| | tsa_token : BYTEA (RFC 3161, optional for inform.) | |
| | created_at : TIMESTAMPTZ | |
| +------------------------------------------------------------+ |
| |
| Triggers: |
| BEFORE UPDATE OR DELETE -> RAISE EXCEPTION (immutable) |
| REVOKE TRUNCATE ON audit_logs FROM public |
| |
+----------------------------------------------------------------------+
| |
| +------------------------------------------------------------+ |
| | Destruction Audit | |
| | destruction_seq : BIGINT (monotone PostgreSQL sequence) | |
| | document_id : UUID | |
| | destruction_reason : VARCHAR | |
| | audit_entry_id : UUID -> AuditEntry | |
| +------------------------------------------------------------+ |
| |
| +------------------------------------------------------------+ |
| | Verification Material | |
| | HSM key label : pv-master-signing-* | |
| | Hash algorithm : SHA3-256 | |
| | Sig algorithm : ECDSA_SHA384 (P-384) | |
| | Public key : SPKI/DER | |
| +------------------------------------------------------------+ |
| |
+----------------------------------------------------------------------+
2.2 Flux d'audit¶
- LogEntry : Serialisation canonique (RFC 8785), hash SHA3-256, signature ECDSA P-384 via HSM, insertion append-only
- LogProbativeEvent : Comme LogEntry + token TSA obligatoire (RFC 3161)
- LogInformativeEvent : Comme LogEntry + token TSA best-effort
- LogDestruction : Comme LogProbativeEvent + increment sequence monotone + fail-closed check
- VerifyEntry : Recalcul du hash, verification de la signature via cle publique
- ExportProof : Export d'une entree avec evidences cryptographiques pour verification offline
- VerifyExportedProof : Verification offline d'un proof exporte (sans acces ProbatioVault)
- EnsureAvailable : Verification de la disponibilite de l'audit (fail-closed gate)
2.3 Proprietes de securite¶
Immutabilite : Les entrees d'audit ne peuvent etre ni modifiees ni supprimees (triggers PostgreSQL). La commande TRUNCATE est revoquee.
Anti-rollback : La sequence de destruction est monotone croissante. Tout gap dans la sequence est detectable.
Fail-closed : Si l'audit est indisponible, les operations de destruction sont bloquees. Aucune destruction silencieuse n'est possible.
3. Specifications detaillees¶
3.1 Format d'evenement canonique¶
EXIGENCE AUDIT-01 : Chaque entree d'audit DOIT etre serialisee au format JSON canonique (RFC 8785 / JCS) avant le calcul du hash. Ce format garantit un hash reproductible independamment de l'ordre des cles ou du formatage. Prouve formellement (TLA+ INV-02 EntryHashBinding, Alloy HashBindingValid).
3.2 Hash cryptographique¶
EXIGENCE AUDIT-02 : Le hash de chaque entree DOIT etre calcule avec SHA3-256 (FIPS 202) sur la forme canonique. Prouve formellement (TLA+ INV-02 EntryHashBinding, Z INV-02).
3.3 Signature HSM¶
EXIGENCE AUDIT-03 : Chaque entree d'audit DOIT etre signee par le HSM avec ECDSA P-384 (FIPS 186-5). La cle HSM utilisee DOIT porter un label pv-master-signing-*. Prouve formellement (TLA+ INV-03 EntrySignatureBinding, Alloy SignatureBindingValid, Z INV-03).
3.4 Append-only¶
EXIGENCE AUDIT-04 : La table d'audit DOIT etre protegee par un trigger PostgreSQL BEFORE UPDATE OR DELETE qui leve une exception. Aucune modification ou suppression n'est autorisee apres insertion. Prouve formellement (TLA+ INV-04 AppendOnly, Alloy AppendOnlyEnforced, Z INV-04).
3.5 Revocation TRUNCATE¶
EXIGENCE AUDIT-05 : Le privilege TRUNCATE DOIT etre revoque sur la table d'audit pour tous les roles applicatifs. Prouve formellement (TLA+ INV-10 NoUpdateOrDelete, Prolog check_audit_truncate_revoked).
3.6 Sequence de destruction monotone¶
EXIGENCE AUDIT-06 : Les operations de destruction DOIVENT utiliser une sequence PostgreSQL monotone croissante (destruction_seq). Tout gap dans la sequence est un indicateur de corruption ou de manipulation. Prouve formellement (TLA+ INV-06 DestructionSeqMonotone, Alloy SequenceMonotone, Z INV-06).
3.7 Fail-closed¶
EXIGENCE AUDIT-07 : Si le service d'audit est indisponible, les operations de destruction DOIVENT echouer (fail-closed). Aucune destruction ne peut avoir lieu sans trace d'audit. Prouve formellement (TLA+ INV-07 FailClosed, Z INV-07).
3.8 Evenements probatifs legaux¶
EXIGENCE AUDIT-08 : Les evenements a valeur probante legale DOIVENT inclure un token TSA (RFC 3161) en plus de la signature HSM. Le token TSA est obligatoire. Prouve formellement (TLA+ INV-08 ProbativeEventComplete, Alloy ProbativeEventsHaveTSA, Z INV-08).
3.9 Evenements informatifs legaux¶
EXIGENCE AUDIT-09 : Les evenements informatifs legaux DOIVENT inclure la signature HSM. Le token TSA est en mode best-effort (present si le service TSA est disponible). Prouve formellement (TLA+ INV-03, Z INV-09).
3.10 Verification offline¶
EXIGENCE AUDIT-10 : Chaque entree d'audit DOIT etre verifiable offline a l'aide de la cle publique HSM, sans acces a ProbatioVault. La verification recalcule le hash SHA3-256 et verifie la signature ECDSA P-384. Prouve formellement (TLA+ VerifyEntry, Alloy OfflineVerificationPossible, Z INV-10).
3.11 Format de cle HSM¶
EXIGENCE AUDIT-11 : Le label de la cle HSM utilisee pour signer les entrees d'audit DOIT respecter le format pv-master-signing-*. Prouve formellement (TLA+ INV-09 KeyLabelFormat, Alloy KeyLabelConsistent, Z INV-11).
3.12 Export de preuve¶
EXIGENCE AUDIT-12 : L'export d'une preuve d'audit (AuditProof) DOIT inclure : l'entree canonique, le hash, la signature, le label de cle, l'algorithme de hash, l'algorithme de signature, la cle publique, la chaine de certificats HSM (PEM array), et les preuves de non-revocation au moment de la signature (reponses OCSP stapled ou CRL pertinentes, DER Base64). Aucun secret cryptographique (cle privee) ne DOIT etre inclus dans l'export. L'inclusion de la chaine de certificats permet de verifier non seulement l'integrite technique (signature) mais aussi l'authenticite de la cle publique (chaine de confiance). Prouve formellement (Alloy NoSecretsInExport, Z INV-12).
3.13 Sequence monotone globale¶
EXIGENCE AUDIT-13 : Le compteur de sequence general (sequence_counter) est monotone croissant. Chaque nouvelle entree d'audit recoit un numero de sequence strictement superieur au precedent. Prouve formellement (TLA+ INV-05 SequenceMonotone, Z INV-13).
3.14 Timestamp¶
EXIGENCE AUDIT-14 : Le timestamp de creation (created_at) DOIT etre au format TIMESTAMPTZ (avec fuseau horaire). Le clock de l'audit ne recule jamais. Prouve formellement (Z INV-14).
3.15 Audit append-only structurel¶
EXIGENCE AUDIT-15 : L'audit log ne perd jamais d'entrees. Garanti structurellement par le modele (append-only, pas de suppression). Prouve formellement (TLA+ INV-11 AuditAppendOnly, Z INV-15).
3.16 Schema canonique versionne des evenements¶
EXIGENCE AUDIT-16 : Chaque entree d'audit DOIT respecter un schema JSON canonique versionne. Le schema definit les champs obligatoires :
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
schemaVersion | string (semver) | oui | Version du schema d'evenement |
eventType | enum | oui | Type d'evenement (taxonomie section 3.17) |
eventCategory | enum | oui | Categorie de l'evenement |
sourceProtocol | enum | oui | Protocole source |
subjectId | UUID (string) | oui | Identifiant de l'objet concerne |
actorId | UUID (string) | oui | Identifiant de l'acteur |
timestamp | string (ISO 8601 UTC) | oui | Horodatage de l'evenement |
payload | object | oui | Donnees specifiques a l'evenement |
L'ajout de nouveaux champs est autorise (extensibilite forward-compatible). La suppression ou modification de champs existants requiert un bump de schemaVersion MAJEUR. Le schema initial est "1.0.0".
3.17 Taxonomie normative des types d'evenements¶
EXIGENCE AUDIT-17 : Chaque type d'evenement DOIT etre classe comme PROBATIVE ou INFORMATIVE. La classification est normative et ne peut pas etre modifiee par l'implementation. Un evenement classe PROBATIVE ne peut pas etre "down-grade" en INFORMATIVE.
| Protocole | Type d'evenement | Categorie | Justification |
|---|---|---|---|
| PV-ENV | ENVELOPE_CREATE | PROBATIVE | Creation de l'identite cryptographique |
| PV-ENV | ENVELOPE_ROTATE | PROBATIVE | Changement de cle d'enveloppement |
| PV-ENV | DEVICE_REVOKE | PROBATIVE | Revocation d'acces device |
| PV-PRE | REKEY_GENERATE | PROBATIVE | Creation d'une capacite d'acces legal |
| PV-PRE | REKEY_VALIDATE | PROBATIVE | Double validation DPO + autorite legale |
| PV-PRE | REKEY_REENCRYPT | PROBATIVE | Exercice effectif de l'acces legal |
| PV-PRE | REKEY_REVOKE | PROBATIVE | Revocation d'acces legal |
| PV-PRE | REKEY_DESTROY | PROBATIVE | Destruction cryptographique (RGPD art. 17) |
| PV-PROOF | PROOF_GENERATE | PROBATIVE | Generation de preuve composite |
| PV-PROOF | PROOF_FINALIZE | PROBATIVE | Scellement de preuve |
| PV-ANCHOR | BATCH_CREATE | INFORMATIVE | Demarrage d'un batch d'ancrage |
| PV-ANCHOR | BATCH_SUBMIT | PROBATIVE | Soumission transaction blockchain |
| PV-ANCHOR | BATCH_FINALIZE | PROBATIVE | Finalisation avec finality confirmee |
| PV-ANCHOR | BATCH_FAIL | INFORMATIVE | Echec d'un batch |
| PV-ANCHOR | BATCH_RETRY | INFORMATIVE | Re-tentative d'un batch echoue |
| PV-ANCHOR | SIGNER_REVOKE | PROBATIVE | Revocation adresse de signature |
| PV-ANCHOR | FINALITY_POLICY_CHANGE | PROBATIVE | Modification politique de finalite |
| PV-AUDIT | DESTRUCTION | PROBATIVE | Destruction de document |
| PV-AUDIT | GAP_QUALIFICATION | PROBATIVE | Qualification d'un gap destruction_seq |
3.18 Chainage cryptographique inter-entrees¶
EXIGENCE AUDIT-18 : Chaque entree d'audit DOIT inclure le hash SHA3-256 de l'entree precedente dans son contenu canonique (champ previousEntryHash). La premiere entree utilise un hash sentinelle de 32 bytes de zeros (0x0000...0000, 64 caracteres hex "0"*64). Ce chainage permet de detecter toute suppression ou insertion d'entree, meme par un attaquant disposant d'un acces superuser PostgreSQL ayant contourne les triggers.
La verification du chainage recalcule la chaine H(entry_n-1) pour chaque entree et compare avec le previousEntryHash stocke. Toute rupture de chaine est un indicateur de corruption.
3.19 Procedure de qualification des gaps destruction_seq¶
EXIGENCE AUDIT-19 : Tout gap detecte dans destruction_seq DOIT declencher une alerte de securite. La procedure de qualification est :
- Detection : verification periodique (CRON, toutes les 6 heures minimum) de la continuite de
destruction_seq - Correlation crash : tentative de correlation avec un crash PostgreSQL (WAL logs,
pg_stat_activity, journaux systeme) - Qualification BENIGN : si correle a un crash PostgreSQL documente, le gap est qualifie BENIGN. Un audit entry de qualification (type
GAP_QUALIFICATION, PROBATIVE) est emis avec la justification. - Qualification SUSPICIOUS : si non correle, le gap est qualifie SUSPICIOUS. Les operations de destruction sont suspendues (fail-closed) jusqu'a investigation manuelle. Un audit entry de qualification est emis.
- Remediation : investigation manuelle obligatoire pour les gaps SUSPICIOUS. Reprise des destructions uniquement apres validation par le DPO.
3.20 Politique de retention¶
EXIGENCE AUDIT-20 : Les entrees d'audit DOIVENT etre conservees pour la duree la plus longue parmi :
- 10 ans (exigence eIDAS pour les preuves electroniques qualifiees)
- La duree de retention du document audite
- Toute obligation legale applicable (RGPD art. 5.1.e — conservation limitee a la finalite)
L'archivage a froid est autorise apres 2 ans si les conditions suivantes sont remplies : (a) l'integrite du chainage (AUDIT-18) est verifiee avant archivage, (b) la signature HSM reste verifiable avec la cle publique historique, © l'archivage est trace dans l'audit log (event PROBATIVE).
4. Modele formel¶
4.1 Etats et transitions¶
Le protocole est modelise comme un systeme a etats avec 9 actions :
LogEntry -----> LogProbativeEvent -----> LogInformativeEvent
|
LogDestruction
|
VerifyEntry <----------+
|
ExportProof -----> VerifyExportedProof
|
EnsureAvailable
|
Tick (clock advance)
| Action | Preconditions | Postconditions |
|---|---|---|
| LogEntry(data) | data non-vide | entry canonicalisee, hashee, signee, inseree |
| LogProbativeEvent(data) | data non-vide | LogEntry + token TSA obligatoire |
| LogInformativeEvent(data) | data non-vide | LogEntry + token TSA best-effort |
| LogDestruction(docId) | audit disponible (fail-closed) | LogProbativeEvent + destruction_seq++ |
| VerifyEntry(entryId) | entry existe | recalcul hash + verification signature |
| ExportProof(entryId) | entry existe | proof exporte avec evidences crypto |
| VerifyExportedProof(proof) | proof non-vide | verification offline |
| EnsureAvailable | — | check disponibilite audit |
| Tick | — | clock avance (monotone) |
4.2 Invariants de surete¶
| ID | Invariant | Description | Preuve |
|---|---|---|---|
| INV-01 | TypeInvariant | Types corrects pour toutes les variables | TLC |
| INV-02 | EntryHashBinding | Hash = SHA3-256(canonical(entry)) | TLC + Alloy |
| INV-03 | EntrySignatureBinding | Signature = ECDSA_P384(hash, hsm_key) | TLC + Alloy |
| INV-04 | AppendOnly | Entrees jamais modifiees/supprimees (trigger DB) | TLC + Alloy |
| INV-05 | SequenceMonotone | sequence_counter strictement croissant | TLC |
| INV-06 | DestructionSeqMonotone | destruction_seq strictement croissant | TLC + Alloy |
| INV-07 | FailClosed | Destruction bloquee si audit indisponible | TLC |
| INV-08 | ProbativeEventComplete | Event probatif a HSM sig + TSA token | TLC + Alloy |
| INV-09 | KeyLabelFormat | Label HSM = pv-master-signing-* | TLC + Alloy |
| INV-10 | NoUpdateOrDelete | Trigger BEFORE UPDATE OR DELETE actif | TLC |
| INV-11 | AuditAppendOnly | Audit log ne perd jamais d'entrees | TLC |
| INV-12 | HashChainIntegrity | Chainage SHA3-256 inter-entrees coherent | TLC + Alloy |
| INV-13 | TaxonomyEnforced | Classification probatif/informatif respectee | Alloy |
Note sur TLC : Le model checking utilise une configuration bornee (MAX_ENTRIES=3, MAX_DESTRUCTION=2, MAX_ITERATIONS=12). Des garanties complementaires proviennent des assertions structurelles Alloy (scope 5) et des schemas Z.
4.3 Theoremes prouves¶
- THM-01 :
Spec => []TypeInvariant - THM-02 :
Spec => []EntryHashBinding - THM-03 :
Spec => []EntrySignatureBinding - THM-04 :
Spec => []AppendOnly - THM-05 :
Spec => []SequenceMonotone - THM-06 :
Spec => []DestructionSeqMonotone - THM-07 :
Spec => []FailClosed - THM-08 :
Spec => []AuditAppendOnly
4.4 Assertions structurelles (Alloy)¶
| Assertion | Propriete | Resultat |
|---|---|---|
| HashBindingValid | Hash lie a la forme canonique | UNSAT (prouve) |
| SignatureBindingValid | Signature lie au hash | UNSAT (prouve) |
| NoDuplicateEntries | Pas de doublons dans l'audit | UNSAT (prouve) |
| SequenceMonotone | Sequence destruction monotone | UNSAT (prouve) |
| ProbativeEventsHaveTSA | Events probatifs ont TSA | UNSAT (prouve) |
| DestructionEntriesHaveSequence | Destructions ont sequence | UNSAT (prouve) |
| NoSecretsInExport | Pas de secrets dans l'export | UNSAT (prouve) |
| OfflineVerificationPossible | Verification offline possible | UNSAT (prouve) |
| KeyLabelConsistent | Labels HSM conformes | UNSAT (prouve) |
| AppendOnlyEnforced | Append-only enforce | UNSAT (prouve) |
5. Considerations de securite¶
5.1 Modele de menace¶
| Menace | Mitigation | Verification |
|---|---|---|
| Falsification d'entree d'audit | Signature HSM non falsifiable | AUDIT-03, INV-03 |
| Modification post-insertion | Triggers BEFORE UPDATE OR DELETE | AUDIT-04, INV-04 |
| Suppression d'entrees (TRUNCATE) | TRUNCATE revoque | AUDIT-05, INV-10 |
| Destruction silencieuse | Fail-closed, sequence monotone | AUDIT-07, INV-07 |
| Rollback de sequence | Sequence PostgreSQL monotone | AUDIT-06, INV-06 |
| Verification impossible offline | Cle publique + algos dans l'export | AUDIT-10, AUDIT-12 |
| Fuite de cles privees | Export ne contient que des cles publiques | AUDIT-12 |
| Event probatif sans horodatage | TSA obligatoire pour probatifs | AUDIT-08, INV-08 |
| Usurpation de cle HSM | Labels stricts pv-master-signing-* | AUDIT-11, INV-09 |
| Suppression d'entree intermediaire | Chainage SHA3-256 inter-entrees | AUDIT-18, INV-12 |
| Downgrade probatif -> informatif | Taxonomie normative non modifiable | AUDIT-17, INV-13 |
| Perte de donnees audit (retention) | Conservation 10 ans + archivage conditionnel | AUDIT-20 |
5.2 Limitations connues¶
- La verification offline necessite la cle publique HSM correspondant a la cle de signature. Si la cle a ete tournee, la cle publique historique doit etre conservee.
- Le token TSA pour les evenements informatifs est en mode best-effort. En cas d'indisponibilite du service TSA, l'event est tout de meme signe par le HSM.
- La sequence de destruction detecte les gaps mais ne peut pas les prevenir a 100% en cas de crash de la base pendant un NEXTVAL.
6. Ancrage au code reel¶
| Systeme | Mecanisme d'ancrage | Verification |
|---|---|---|
| TLA+ | ASSUME verifiant les actions du code | Echec TLC si divergence |
| Alloy | one sig Real_* + fact some Real_* | Echec SAT si artefact manquant |
| Z | Schemas valides contre entities TypeORM | Lint FAIL si non matche |
| Prolog | Facts extraits du code vs 24 regles de conformite | Checks code reel |
6.1 Etat d'implementation¶
| Composant | Statut | Checks Prolog |
|---|---|---|
| AuditLogService.log() | Implemente | 2/2 PASS |
| AuditLogService.verify() | Implemente | 1/1 PASS |
| audit_log entity (colonnes) | Implemente | 5/5 PASS |
| AuditSignatureService | Implemente | 2/2 PASS |
| AuditVerificationService | Implemente | 3/3 PASS |
| DestructionAuditService | Implemente | 2/2 PASS |
| LegalAuditTrailService | Implemente | 2/2 PASS |
| Trigger immutabilite | Implemente | 1/1 PASS |
| TRUNCATE revoque | Implemente | 1/1 PASS |
| HSM FIPS cluster | Implemente | 1/1 PASS |
| HashService (SHA3-256) | Implemente | 1/1 PASS |
| HSM public key service | Implemente | 1/1 PASS |
7. Annexes¶
7.1 Specifications formelles associees¶
| Fichier | Systeme | Contenu |
|---|---|---|
PV_Audit.tla | TLA+ | Modele temporel (9 actions, 11 invariants, 8 theoremes) |
PV_Audit.cfg | TLA+ | Configuration TLC (MAX_ENTRIES=3, MAX_DESTRUCTION=2) |
PV_Audit.als | Alloy | Modele structurel (8 signatures, 10 assertions) |
PV_Audit.zed | Z | Specification ensembliste (15 invariants, 8 operations) |
pv_audit_compliance.pl | Prolog | 24 regles de conformite code |
7.2 Matrice de tracabilite¶
| Exigence | TLA+ | Alloy | Z | Prolog |
|---|---|---|---|---|
| AUDIT-01 (canonical JSON) | INV-02 | HashBindingValid | INV-02 | check_audit_entry_canonical |
| AUDIT-02 (SHA3-256 hash) | INV-02 | HashBindingValid | INV-02 | check_audit_entry_hash |
| AUDIT-03 (ECDSA P-384 sig) | INV-03 | SignatureBindingValid | INV-03 | check_audit_hsm_signature |
| AUDIT-04 (append-only trigger) | INV-04 | AppendOnlyEnforced | INV-04 | check_audit_trigger_update_delete |
| AUDIT-05 (TRUNCATE revoque) | INV-10 | AppendOnlyEnforced | INV-05 | check_audit_truncate_revoked |
| AUDIT-06 (destruction seq) | INV-06 | SequenceMonotone | INV-06 | check_destruction_sequence |
| AUDIT-07 (fail-closed) | INV-07 | — | INV-07 | check_destruction_fail_closed |
| AUDIT-08 (probative HSM+TSA) | INV-08 | ProbativeEventsHaveTSA | INV-08 | check_legal_probative_event |
| AUDIT-09 (informative HSM) | INV-03 | SignatureBindingValid | INV-09 | check_legal_informative_event |
| AUDIT-10 (offline verify) | VerifyEntry | OfflineVerificationPossible | INV-10 | check_audit_verify_entry |
| AUDIT-11 (key label) | INV-09 | KeyLabelConsistent | INV-11 | check_hsm_key_label |
| AUDIT-12 (export proof) | ExportProof | NoSecretsInExport | INV-12 | check_audit_export_proof |
| AUDIT-13 (seq monotone) | INV-05 | SequenceMonotone | INV-13 | check_audit_sequence_counter |
| AUDIT-14 (timestamp) | — | — | INV-14 | check_audit_created_at |
| AUDIT-15 (append-only struct) | INV-11 | AppendOnlyEnforced | INV-15 | check_audit_log_entity |
| AUDIT-16 (schema canonique) | — | — | — | check_audit_schema_version |
| AUDIT-17 (taxonomie) | — | TaxonomyEnforced | — | check_event_category |
| AUDIT-18 (chainage inter-entrees) | INV-12 | HashChainIntegrity | — | check_previous_entry_hash |
| AUDIT-19 (gaps destruction_seq) | — | — | — | check_gap_detection_cron |
| AUDIT-20 (retention) | — | — | — | — |
7.3 Vecteurs de test¶
| Test | Entree | Sortie attendue |
|---|---|---|
| Entry standard | Payload JSON | Hash SHA3-256 + signature HSM, insertion OK |
| Event probatif | Payload + type=PROBATIVE | Hash + signature + TSA token obligatoire |
| Event informatif | Payload + type=INFORMATIVE | Hash + signature + TSA best-effort |
| Destruction | Document ID | Entry + destruction_seq incrementee |
| Fail-closed | Audit indisponible + destruction | ERREUR (destruction bloquee) |
| Verification OK | Entry valide + cle publique | CheckResult = OK |
| Verification KO | Entry avec hash altere | CheckResult = KO |
| Export proof | Entry existante | Proof avec crypto material, pas de secrets |
| Verify exported proof | Proof + cle publique | Verification OK offline |
| UPDATE attempt | UPDATE sur audit_log | ERREUR (trigger BEFORE UPDATE) |
| DELETE attempt | DELETE sur audit_log | ERREUR (trigger BEFORE DELETE) |
| TRUNCATE attempt | TRUNCATE audit_log | ERREUR (privilege revoque) |
| Chainage valide | Sequence d'entrees + previousEntryHash | Recalcul OK pour toute la chaine |
| Chainage rompu | Suppression entree intermediaire | Rupture detectee a l'entree suivante |
| Premiere entree | Premiere insertion | previousEntryHash = 0x00...00 (sentinelle) |
| Taxonomie enforced | REKEY_REENCRYPT sans TSA | ERREUR (event PROBATIVE, TSA obligatoire) |
| Taxonomie downgrade | DESTRUCTION en INFORMATIVE | ERREUR (classification normative PROBATIVE) |
| Gap destruction_seq | Sequence 1,2,4 (gap 3) | Alerte SUSPICIOUS, destructions suspendues |
| Export avec certificats | ExportProof | Chaine de certificats + OCSP presentes |
| Schema version | Entry sans schemaVersion | ERREUR (champ obligatoire) |
7.4 Historique des revisions¶
| Version | Date | Description |
|---|---|---|
| 1.0.0 | 2026-02-26 | Version initiale, generee depuis modeles formels |
| 1.1.0 | 2026-03-02 | Verrouillage interop : (1) AUDIT-12 etendu avec chaine de certificats HSM + OCSP/CRL dans l'export, (2) AUDIT-16 schema canonique versionne des evenements, (3) AUDIT-17 taxonomie normative probatif/informatif complete (16 types d'events), (4) AUDIT-18 chainage cryptographique SHA3-256 inter-entrees, (5) AUDIT-19 procedure de qualification des gaps destruction_seq, (6) AUDIT-20 politique de retention (10 ans eIDAS + archivage conditionnel) |