Skip to content

feat(ca): provenance des décisions RA et des révocations (R-1) - #58

Open
PhilippeVienne wants to merge 1 commit into
devfrom
feat/cli-decision-provenance
Open

PhilippeVienne wants to merge 1 commit into
devfrom
feat/cli-decision-provenance

Conversation

@PhilippeVienne

Copy link
Copy Markdown
Contributor

Objet

Constat R-1 de l'audit du 2026-09-25 (EN 319 411-1 GEN-6.5.5-04, CSS-6.5.5-06, REG-6.3.2-01 ; EN 319 401 REQ-7.4.1-05/-11/-12), tranche B du découpage validé (A : #57 → B : cette PR → C : revue a posteriori). Base dev.

Décision de l'utilisateur, conforme à docs/WEBUI.md §20 : le CLI ra approve|reject / revoke reste comme voie de secours (une panne de ra-console ne doit jamais empêcher une révocation d'urgence), sans PIN ; ses décisions sont désormais distinguées et tracées, pas reconstruites après coup.

  • oe_ca_core::provenance : Via (WebAuthn, Cli(SystemIdentity), Automatic) ; SystemIdentity::current() relève l'UID réel (/proc/self/status), le nom d'utilisateur (/etc/passwd) et l'hôte (nom du pod sous Kubernetes). Ce qui ne peut être lu reste vide.
  • La voie est un paramètre fixé par l'appelant : Issuer::revoke(…, via), Decider::approve|reject(…, via). CLI → Via::Cli ; oe-actions et le Revoker de ca-server (branché sur la seule action signée) → Via::WebAuthn ; révocation superseded du renouvellement → Via::Automatic.
  • Journal : ca.request_approved|rejected et ca.certificate_revoked gagnent "authenticated_via": "webauthn"|"cli"|"automatique" (nom de §20) ; pour le CLI, "identite_systeme": {"authentifiee": false, "uid", "utilisateur", "hote"}.
  • Commentaire obligatoire pour une décision CLI : refusé par clap et par la bibliothèque, avant toute écriture (la demande reste PENDING, le certificat reste émis).
  • docs/CA.md : voie de secours, champs du journal, et le fait que derrière kubectl exec la personne n'apparaît que dans le journal d'audit de l'API Kubernetes (le contrôle réel est le RBAC exec).

Limites et ordre de merge

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.
  • Nouveaux tests : each_decision_records_how_its_operator_was_identified (les trois voies au journal, dont automatique sur un vrai renouvellement), a_cli_decision_without_a_comment_is_refused_before_the_request_changes, a_cli_revocation_without_a_comment_is_refused_before_the_store_is_touched, tests unitaires de provenance.
  • Mutation (4 mutants, tous tués) : sans check_comment dans Decider ou dans Issuer::revoke, sans annotate, et Via::Automatic remplacé par WebAuthn au renouvellement.
  • ca-server ra approve <tx> <op> sans commentaire : refusé par clap.

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

Constat R-1 de l'audit du 2026-09-25 (EN 319 411-1 GEN-6.5.5-04,
CSS-6.5.5-06 ; EN 319 401 REQ-7.4.1-11/-12) et docs/WEBUI.md §20 : le CLI
reste la voie de secours, mais ses décisions ne se distinguaient pas des
décisions signées.

- oe-ca-core : nouveau module provenance (Via : WebAuthn, Cli, Automatic ;
  SystemIdentity relevée par le système : UID réel, utilisateur, hôte).
  Issuer::revoke prend la voie en paramètre, fixée par l'appelant.
- oe-raflow : Decider::approve|reject aussi ; la révocation superseded du
  renouvellement est Via::Automatic.
- Journal : `authenticated_via` (webauthn|cli|automatique) sur
  ca.request_approved|rejected et ca.certificate_revoked ; pour le CLI,
  `identite_systeme` marquée `authentifiee: false`.
- Voie de secours : commentaire obligatoire (clap et bibliothèque), refusé
  avant toute écriture.
- oe-actions et le Revoker de ca-server : Via::WebAuthn.

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