Skip to content

feat(ra-console): journal d'audit propre à la console (2b-A) - #41

Merged
PhilippeVienne merged 1 commit into
devfrom
feat/ra-console-audit-journal
Sep 25, 2026
Merged

PhilippeVienne merged 1 commit into
devfrom
feat/ra-console-audit-journal

Conversation

@PhilippeVienne

Copy link
Copy Markdown
Contributor

Contexte

Premier morceau de l'étape 2b (GET /api/v1/audit/search, docs/WEBUI.md §7, §15). Base dev : 2a (#40) est mergée.

Gap trouvé en travaillant sur 2b : ra-console n'avait encore aucun journal d'audit, alors que §7 prévoit qu'elle consigne ce qui relève de l'usage de la console — connexions, sessions, refus de connexion (dont les régressions de compteur détectées en 1c-1). Ça n'avait pas été fait pendant 1c.

Contenu

  • Une chaîne distincte de celle de ca-server, jamais partagée (oe_audit::Log, OPENEIDAS_RA_AUDIT_FILE) : un ra-console compromis ne peut ni écrire, ni même ajouter de faux événements dans le journal qui fait foi sur la PKI.
  • ra.login_succeeded / ra.login_refused (raison réelle : challenge inconnu, leurre, clé révoquée, opérateur désactivé, assertion refusée, compteur en régression — jamais dans la réponse HTTP, uniforme par construction, §16).
  • ra.session_opened / ra.session_closed (seulement quand la déconnexion a réellement fermé une session).
  • crate::audit::Recorder, même forme qu'oe_ca_core::Recorder/oe_raflow::Recorder (dupliquée, ces crates ne se recoupent pas autrement), best-effort : un échec d'écriture du journal ne fait pas échouer une connexion par ailleurs valide.

Prochaines tranches (décidées avec vous, PROGRESSION.md §5)

  • B : nouveau crate client S3-compatible (SigV4), auto-hébergé (MinIO/Garage/Ceph — jamais AWS, dans l'esprit souverain qui a déjà guidé oe-replicate en WebDAV) ; ca-server y écrit son journal.
  • C : ra-console écrit le sien sur le même stockage.
  • D : GET /api/v1/audit/search lit et vérifie les deux chaînes.

oe-replicate n'est pas remplacé (il reste utile pour qui préfère WebDAV) ; il n'était de toute façon câblé dans aucun binaire.

Vérifications

  • cargo fmt --check
  • cargo clippy --workspace --all-targets -- -D warnings (1.97 et 1.98.1)
  • cargo test --workspace (avec OE_CASTORE_TEST_DSN) : vert, y compris un test qui relit le vrai journal produit
  • cargo audit --ignore RUSTSEC-2023-0071 : rien à signaler
  • Contrôle par mutation : la journalisation d'un refus échoue pour la bonne raison quand on retire l'appel correspondant

Premier morceau de l'étape 2b (docs/WEBUI.md §7, §15) : ra-console n'avait
encore aucun journal d'audit, alors que §7 prévoit qu'elle consigne ce qui
relève de l'usage de la console — connexions, sessions, refus de connexion
(dont les régressions de compteur détectées). Une chaîne distincte de celle
de ca-server, jamais partagée (oe_audit::Log, OPENEIDAS_RA_AUDIT_FILE) : un
ra-console compromis ne peut ni écrire, ni même ajouter de faux événements
dans le journal qui fait foi sur la PKI.

- ra.login_succeeded / ra.login_refused (raison réelle : challenge inconnu,
  leurre, clé révoquée, opérateur désactivé, assertion refusée, compteur en
  régression — jamais dans la réponse HTTP, uniforme par construction, §16)
- ra.session_opened / ra.session_closed (seulement quand la déconnexion a
  réellement fermé une session, pas à chaque rejeu idempotent)

crate::audit::Recorder (même forme qu'oe_ca_core::Recorder/oe_raflow::Recorder,
dupliquée plutôt que partagée entre crates qui ne se recoupent pas autrement),
best-effort : un échec d'écriture du journal ne fait pas échouer une connexion
par ailleurs valide, seulement une trace dans les logs du service.

Prochaines tranches (2b-B/C/D, PROGRESSION.md §5) : un client S3-compatible
auto-hébergé (MinIO/Garage/Ceph, décision utilisateur — jamais AWS, dans
l'esprit souverain qui a déjà guidé oe-replicate en WebDAV) pour que
ca-server et ra-console y écrivent chacun leur journal, puis
GET /api/v1/audit/search pour les relire et les vérifier.

Vérifications : cargo fmt --check, cargo clippy --workspace --all-targets
(1.97 et 1.98.1), cargo test --workspace (avec OE_CASTORE_TEST_DSN, y
compris un test lisant le vrai journal produit), cargo audit. Contrôle par
mutation : la journalisation d'un refus ("leurre") échoue pour la bonne
raison quand on retire l'appel à self.refuse().
@PhilippeVienne
PhilippeVienne merged commit d3b0309 into dev Sep 25, 2026
15 checks passed
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