Repository navigation
feat(actions): récupération de l'administrateur (recover-admin) et garde du quorum impossible - #24
Merged
Merged
Conversation
This was referenced Sep 19, 2026
PhilippeVienne
force-pushed
the
feat/quorum
branch
from
September 21, 2026 09:18
5066269 to
23adb9e
Compare
…rde du quorum impossible
ca-server operators recover-admin <nom> --reason <motif> --confirm-recovery
--pin-stdin : rend la main quand les administrateurs « actifs » ont perdu
leurs clés et que personne n'a plus l'autorité de les révoquer, ce que
bootstrap-admin refuse à raison (docs/WEBUI.md §21).
- garde de l'hôte : le PIN du token PKCS#11 est lu sur l'entrée standard,
jamais en argument ni en variable d'environnement, et doit ouvrir le token
de la CA émettrice. La valeur de OPENEIDAS_ISSUING_PIN du service, lisible
de tout accès shell, n'est pas ce qui compte. Un PIN refusé est consigné
(operators.admin_recovery_refused) ;
- un motif écrit et un drapeau explicite sont obligatoires ;
- crée (ou ré-invite) un administrateur sans rien désactiver du registre
existant ; la clé perdue est ensuite révoquée par une action signée ;
- écrit avant de valider l'événement distinct operators.admin_recovery (motif,
nombre d'administrateurs actifs, jamais le jeton) ; journal en échec, rien
n'est créé ;
- la clé de la récupération entre directement dans le registre, sans
confirmation d'un tiers, à la différence de l'amorçage sans contrôle de
l'administrateur actif, puisque c'est précisément son cas d'usage.
Garde « quorum impossible » : une action à N signatures n'est plus créée si
le rôle compte moins de N titulaires actifs (non désactivés, au moins une clé
non révoquée). La laisser en attente ferait croire qu'un second signataire va
venir.
Invite obtient un Debug qui masque le jeton, pour qu'un {:?} ne puisse pas le
laisser passer dans un journal. clippy relève alors un expect() dans un test
d'amorçage, corrigé.
docs/CA.md documente bootstrap-admin et recover-admin.
PhilippeVienne
force-pushed
the
feat/recover-admin
branch
from
September 21, 2026 09:40
d952354 to
a6b0964
Compare
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.
Contenu
Première tranche du §21 de docs/WEBUI.md (modes de défaillance de
ca-server).ca-server operators recover-adminRend la main quand les administrateurs « actifs » ont perdu leurs clés sans qu'elles soient révoquées :
bootstrap-adminrefuse à raison (un administrateur actif existe) et personne n'a plus l'autorité de les révoquer. Le système est verrouillé.OPENEIDAS_ISSUING_PINdu service, lisible de tout accès shell, n'est volontairement pas ce qui compte. Un PIN refusé est consigné (operators.admin_recovery_refused).operators.admin_recovery(motif, nombre d'administrateurs actifs, jamais le jeton). Journal en échec : rien n'est créé.initiated_by = confirmed_by = 'recover-admin'), sans confirmation d'un tiers : il n'y en a plus. Contrairement à l'invitation d'amorçage, elle ne contrôle pas l'administrateur actif, puisque c'est son cas d'usage.Garde « quorum impossible »
Une action à N signatures n'est plus créée si le rôle compte moins de N titulaires actifs (non désactivés, au moins une clé non révoquée). La laisser en attente ferait croire qu'un second signataire va venir.
Divers
Inviteobtient unDebugqui masque le jeton : un{:?}ne peut pas le laisser passer dans un journal. Clippy relève alors unexpect()dans un test d'amorçage dedev, corrigé.docs/CA.mddocumentebootstrap-adminetrecover-admin.Points d'attention
softhsm2-utilet s'ignore sans lui : la CI n'en dispose pas (à vérifier), il y tournera donc à vide. Je l'ai exécuté en local avec SoftHSM ; à traiter comme les tests PostgreSQL (TODO §1).operators audit(re-vérification de la chaîne de signatures du registre) etoperators reconcile(rejeu du journal au démarrage,/healthzen 503 sur divergence). Deux chantiers plus lourds, en TODO.Vérifications
cargo fmt --check,cargo clippy --workspace --all-targets -- -D warnings,cargo test --workspace(avec PostgreSQL, 67 suites),cargo audit --ignore RUSTSEC-2023-0071: verts.bootstrap-adminrefuse → récupération → le nouvel administrateur révoque la clé perdue par une action signée), ré-invitation d'un administrateur existant, usage unique, refus (motif vide ou trop long, nom d'un autre rôle, administrateur désactivé, durée abusive) sans rien créer, journal en échec.