module

Beryl::CLI::Unlock

Sous-commande beryl unlock <host> (étape H4 du chiffrement) : importe et déchiffre les pools data chiffrés d'un host après un reboot.

Routage par mode (depuis T3 — 28 avril 2026) :

  • mode ssh_unlock (Option C, défaut historique) — la clé du serveur (coffre [tang] de la société, sinon ~/.config/beryl/<société>/<domaine>/<host>.key, sinon --key-file) voyage via stdin SSH jusqu'à zfs load-key. Aucune dépendance Tang.

  • mode tang (Option D) — délègue à clevis-zfs unlock sur le serveur. Le binaire interroge Tang en interne, dérive la clé, la pousse à zfs load-key. Si Tang échoue (pool pas encore enrôlé juste après bootstrap, trop de Tang injoignables) et que la clé du poste existe, elle prend le relais : tang-enroll garde la même clé ZFS (bind --use-existing-key), elle reste donc valable.

Flow général :

  1. Pour chaque pool data déclaré chiffré : a. zpool import -N <pool> si pas déjà importé. b. Selon le mode :
    • ssh_unlock : zfs load-key <pool> avec clé locale via stdin.
    • tang : clevis-zfs unlock --no-mount --dataset <pool>. c. zfs mount -a -l (côté beryl, garde le contrôle du mount).
  2. Idempotent : si le pool est déjà importé et la clé chargée, log « déjà déverrouillé » et passe au suivant.
  3. Actions freebsd.after_unlock (host.yml : service: action) jouées dans l'ordre (service <s> <action>) si au moins une unité était verrouillée et que toutes sont désormais ouvertes. Rien si tout était déjà déverrouillé.

Voir zpool-encryption-architecture.adoc § « Le modèle SSH unlock » pour le contexte complet.

Constants

EXIT_KEY_MISSING = 4
EXIT_MISSING_CONFIG = 7
EXIT_NO_DATA_POOLS = 5
EXIT_OK = 0
EXIT_SERVICES_FAILED = 9
EXIT_SSH_FAILED = 2
EXIT_TANG_BINARY_MISSING = 8
EXIT_UNEXPECTED = 3
EXIT_UNLOCK_FAILED = 6
EXIT_USAGE = 1
TANG_BINARY = "/usr/local/sbin/clevis-zfs"

Chemin attendu du binaire clevis-zfs côté serveur. Le paquet security/clevis-zfs (recette tang-client) l'installe là.

Class methods

read_key_option(source : String, stdin : IO = STDIN) : String

Clé de --key-file : un fichier, ou - pour un tube (jamais au clavier : la clé s'afficherait à l'écran). Blancs et majuscules tolérés (clé recopiée du papier par groupes de 4). Un fichier lisible par d'autres est accepté (clé de secours recopiée à la hâte) mais signalé.

Source
run(config_root : String, args : Array(String)) : Int32
Source