Repository navigation
feat(tsa-server): scellement périodique du journal et copie S3 (constat J-1) - #101
Merged
Merged
Conversation
…at J-1) Le chaînage SHA-256 du journal n'a pas de clé : qui peut écrire dans le fichier peut le réécrire en recalculant la chaîne. Les variables de scellement étaient lues, aucun binaire ne scellait (audit du 2026-09-25, EN 319 401 REQ-7.10-02 et REQ-7.10-08). - `tsa-server serve` lance une tâche de fond : au démarrage puis à chaque OPENEIDAS_AUDIT_SEAL_INTERVAL, la TSU horodate la tête de chaîne et consigne `log.sealed` avec la tête scellée et le jeton RFC 3161, certificat compris. `openssl ts -verify -digest <tête>` le vérifie. - Après chaque scellement, le journal entier est déposé sur un stockage objet compatible S3 s'il est configuré (`log.replicated`). Mêmes variables OPENEIDAS_S3_* que ca-server et ra-console ; un point d'accès sans compartiment ni identifiants refuse le démarrage. - La copie est périodique, pas faite à chaque jeton : l'émission ne dépend pas du stockage. Un échec se compte ; au-delà de trois passes, `/healthz` se déclare dégradé (`journal.degraded`) sans passer en erreur, la sonde servant aussi à la vivacité. Un scellement en échec est retenté après une minute au plus. - Le réplica WebDAV que le chart et le compose déployaient pour la TSA sans jamais l'alimenter est retiré, avec OPENEIDAS_AUDIT_REPLICA_* et la clé `webdav-password`. Le chart gagne `tsa.audit.s3.*`. - Matrice, ARCHITECTURE §7, CPS B.3, API : l'écart J-1 reste ouvert pour le contreseing tiers et pour les journaux de la CA et de la console. Six mutations tuées : jeton ne couvrant pas la tête de chaîne, échec de copie ou de scellement non compté, copie consignée sans avoir abouti, scellement en échec jamais signalé, /healthz taisant le journal dégradé. Co-authored-by: Claude <noreply@anthropic.com>
1 of 6 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Objet
Première tranche du constat J-1 de l'audit du 2026-09-25, seule non-conformité majeure restante (EN 319 401
REQ-7.10-02,REQ-7.10-08). Basedev, PR indépendante. Le chaînage SHA-256 du journal n'a pas de clé : qui peut écrire dans le fichier peut le réécrire en recalculant la chaîne. Les variables de scellement étaient lues, aucun binaire ne scellait.tsa-server servelance une tâche de fond. Au démarrage puis à chaqueOPENEIDAS_AUDIT_SEAL_INTERVAL, la TSU horodate la tête de chaîne et consignelog.sealedavec la tête scellée et le jeton RFC 3161, certificat compris.log.replicated), avec les mêmes variablesOPENEIDAS_S3_*queca-serveretra-console./healthzrend l'état du journal (journal.last_seal,seal_failures,offsite_copy,last_copy,copy_failures,degraded).OPENEIDAS_AUDIT_REPLICA_*,auditReplica.*et la cléwebdav-password. Le chart gagnetsa.audit.s3.*.Décisions prises avec l'utilisateur :
/healthzsans suspendre l'émission.oe-replicatereste, appelé par aucun binaire.Points d'attention pour la revue :
/healthzreste en 200 quand le journal est dégradé : la sonde sert aussi à la vivacité et à la disponibilité dans le chart, un 503 ferait redémarrer ou retirer le service. Le libellé passe à « dégradé — journal d'audit : … » etjournal.degradedàtrue: c'est à la supervision d'alerter, et aucune alerte n'est branchée par cette PR.timestamp.grantedavantlog.sealed. Le test du binaire qui comptait un seultimestamp.grantedest ajusté en conséquence.enforce, l'heure peut ne pas être encore traçable). Une copie en échec attend l'intervalle, pour ne pas ajouter un sceau au journal à chaque essai. « Trois passes » peut donc valoir trois minutes pour le scellement, trois intervalles pour la copie.webdav-passworddevenue inutile, sans conséquence. Aucun S3 n'y est configuré : le journal de la TSA y sera scellé mais pas copié, ce que/healthzdira (offsite_copy: "non configurée").tsa.audit.s3.existingSecretdoit porteraccess-keyetsecret-key; le rendu échoue si le point d'accès est renseigné sans compartiment ni Secret (étape ajoutée au jobhelm-lint).Vérifications
cargo fmt --check,cargo clippy --workspace --all-targets -- -D warnings(toolchain locale et 1.98.1) : verts.cargo test --workspace --features oe-castore/postgres -- --nocaptureavec PostgreSQL et SoftHSM : vert, 96 suites, aucun test ignoré. Après l'ajout de la reprise rapide, seulsclippyet les tests detsa-serveront été rejoués.bin/tsa-server/tests/serve.rs, token SoftHSM) : au démarrage, unlog.sealedapparaît, son jeton est vérifié paropenssl ts -verify -digest <tête> -CAfile chain.pem, et/healthzrend l'état du journal.cargo audit --ignore RUSTSEC-2023-0071,cargo deny check licenses: verts.helm lint(défaut et console), rendu avecvalues-staging.yaml,docker compose config: verts.docs/CONFORMITE-ETSI.mdrégénéré.a_pass_seals_the_head_with_a_token_openssl_verifiesprolonged_failures_degrade_health_until_a_pass_succeeds/healthztait le journal dégradéhealth_reports_the_journal_without_taking_the_service_downNon vérifié : la copie contre un vrai MinIO ou Garage (les tests utilisent un service HTTP qui se comporte comme S3, comme ceux de
ca-server), et les jobs de démonstration kind et compose, qui ne tournent qu'en CI.Revue humaine obligatoire
Voir PROVENANCE.md. Chaque case est cochée par le
contributeur humain qui valide la PR, après l'avoir fait lui-même.
make licenses)Assistance par IA
Co-authored-by: Claude <noreply@anthropic.com>, auteur et committer restent humains, etscripts/provenance.py archivea été lancéhttps://claude.ai/code/session_01YRg8X9dbmth9GXcR9hP4QQ