Skip to content

feat(ca-server): revue a posteriori des décisions de la voie de secours (R-1) - #59

Closed
PhilippeVienne wants to merge 1 commit into
feat/cli-decision-provenancefrom
feat/cli-decision-review
Closed

PhilippeVienne wants to merge 1 commit into
feat/cli-decision-provenancefrom
feat/cli-decision-review

Conversation

@PhilippeVienne

Copy link
Copy Markdown
Contributor

Objet

Constat R-1 de l'audit du 2026-09-25, docs/WEBUI.md §20, décision O4 : tranche C du découpage validé (A : #57 → B : #58 → C : cette PR). Empilée sur #58 (feat/cli-decision-provenance) : elle lit le champ authenticated_via que #58 introduit. Merger #58 d'abord, puis rebaser celle-ci (git rebase --onto origin/dev <tête de #58>) et la rebrancher sur dev.

  • ca-server audit cli-decisions relit le journal chaîné — ni base ni token, une copie répliquée suffit (--journal) — et liste les décisions authenticated_via = "cli" non encore revues (ou depuis --since <RFC 3339>), en texte ou --json. Codes de sortie 0 (rien à revoir), 1 (à revoir), 2 (journal illisible ou rompu : rien n'est jugé) — même logique que operators audit, exploitable par une CronJob d'alerte.
  • --acknowledge --reviewer <nom> <commentaire> consigne ra.cli_decisions_reviewed (relecteur, commentaire, jusqu_a = tête lue, séquences couvertes), annoté Via::Cli + identité système ; la revue suivante repart de là. Refusé sur une copie (--journal) et sans commentaire ; l'acquittement lui-même n'est jamais relisté comme décision.
  • docs/CA.md : procédure de revue.

Limites assumées

  • La fréquence de revue (O4) reste à fixer par l'association : la commande la rend possible et prouvable, elle ne l'impose pas.
  • Le relecteur n'est que déclaré (voie CLI, comme le reste du secours) ; son identité système est consignée.

Vérifications

  • cargo fmt --check, cargo clippy --workspace --all-targets -- -D warnings (1.97 et 1.98.1), cargo test --workspace avec PostgreSQL, cargo audit --ignore RUSTSEC-2023-0071 : verts.
  • bin/ca-server/tests/cli_review.rs : logique de revue (fenêtre par acquittement, --since), binaire réel (codes 0/1/2, acquittement refusé sans commentaire ou sur une copie sans rien écrire), journal falsifié → code 2 et rien de listé.
  • Le test a trouvé un vrai défaut en cours d'écriture : l'acquittement (lui-même cli) se relistait comme décision — corrigé.
  • Mutation (4 mutants, tous tués) : sans le filtre cli, sans la fenêtre d'acquittement, sans le refus d'acquitter une copie, sans l'exclusion de l'événement de revue.

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.

  • Revue d'architecture validée par l'humain
  • Code relu et tests unitaires/intégration vérifiés localement
  • Absence de dépendances tierces incompatibles avec la double licence EUPL-1.2 / AGPL-3.0 (make licenses)
  • Validation de l'apport intellectuel et de la paternité humaine sur la modification

Assistance par IA

  • Cette PR a été produite avec l'assistance de Claude Code : les commits concernés portent la remorque Co-authored-by: Claude <noreply@anthropic.com>, auteur et committer restent humains, et scripts/provenance.py archive a été lancé
  • Cette PR a été écrite sans assistance par IA

…rs (R-1)

Constat R-1 de l'audit du 2026-09-25, docs/WEBUI.md §20 et décision O4 :
chaque décision prise par le CLI (authenticated_via: cli) doit être relue,
et cette relecture doit laisser une trace.

- `ca-server audit cli-decisions` relit le journal chaîné (ni base ni
  token ; une copie répliquée suffit, `--journal`) et liste les décisions
  de secours non encore revues, ou depuis `--since`. Codes de sortie
  0 (rien à revoir), 1 (à revoir), 2 (journal illisible ou rompu).
- `--acknowledge --reviewer … -- commentaire` consigne
  ra.cli_decisions_reviewed (relecteur, jusqu'au n°, séquences couvertes),
  annoté Via::Cli ; la revue suivante repart de là. Refusé sur une copie
  ou sans commentaire ; l'acquittement n'est pas relisté.

Co-authored-by: Claude <noreply@anthropic.com>
@PhilippeVienne

Copy link
Copy Markdown
Contributor Author

Remplacée par #82 (base dev) : fermée par GitHub à la suppression de sa branche de base après la fusion de #58.

PhilippeVienne added a commit that referenced this pull request Oct 1, 2026
…a matrice (#84)

Les correctifs de l'audit du 2026-09-25 sont tous sur dev (#52 à #59, via
#76, #80, #82) : la matrice le dit, avec pour chaque ligne repassée en
« couvert » une preuve de mise en service (règle D-2, #79) — pas seulement
un test de bibliothèque.

- bin/tsa-server/tests/serve.rs, le test du binaire, prouve désormais aussi :
  le refus de démarrer quand OPENEIDAS_ACCURACY ne couvre pas la dérive
  tolérée (T-1), le refus d'émettre avec une clé TSU expirée mais un
  certificat encore valide (T-3), la fraction de seconde de genTime (T-1),
  et le journal du jeton relu (série, empreinte soumise, état de l'horloge :
  J-3), en relisant audit-monitor.log après un horodatage réel.
- Le job de démonstration Helm/kind interroge le répondeur OCSP pour un
  numéro jamais émis et exige `unknown` (O-1).
- C-1 : preuve par les tests du binaire ca-server (ARL et certificat de la
  racine servis aux adresses gravées) ; R-2 : étape Helm qui refuse
  l'approbation automatique en production ; R-1 : actions signées relayées
  par ra-console et revue de la voie de secours, toutes deux testées sur les
  binaires.
- Restent en écart, cible resserrée : l'authentification multifacteur
  (GEN-6.5.5-04 : la voie de secours CLI n'a pas de second facteur, son
  contrôle compensatoire — RBAC de l'hôte, trace non authentifiée, revue —
  est nommé dans le mécanisme, décision de l'utilisateur), la durée de
  conservation côté tsa-server (§7.10) et la nouvelle bi-clé à chaque
  renouvellement TSU (TIS-7.6.7). docs/ARCHITECTURE.md décrit le journal
  tel qu'il est.

Bilan : 23 couvertes, 1 implémentée, 10 écarts, 2 hors périmètre (avant :
17 / 1 / 16 / 2). docs/CONFORMITE-ETSI.md régénéré.

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant