module

Beryl::ZfsKeys

Clés de chiffrement ZFS des serveurs : fichier du poste ET coffre de la société.

La clé d'un serveur (64 caractères hex, cf. Beryl::Encryption) vit historiquement dans ~/.config/beryl/<société>/<domaine>/<host>.key (0400, ignoré par git) : perdre le poste, c'est perdre les données dès que Tang ne répond plus. Elle est donc AUSSI rangée dans le coffre chiffré age de la société (<société>/.env.toml.age, versionné), section [tang], une variable par serveur :

[tang]
WEB1 = "<64 hex>"
DB_MAIN = "<64 hex>"

Nom de la variable : nom court du serveur en majuscules, tout caractère hors [A-Z0-9] → _ (même convention que les secrets propres à un serveur, Beryl::Apply.host_secret_name).

Règles :

  • lecture : coffre d'abord, fichier en repli ; les deux présents et DIFFÉRENTS → Conflict, jamais de choix silencieux (une mauvaise clé ne déverrouille rien, mais une clé écrasée par la mauvaise détruit le seul exemplaire de la bonne) ;
  • écriture : ajout seulement ; une valeur déjà présente et différente → Conflict ; identique → rien à faire ;
  • la section [tang] n'est JAMAIS chargée dans ENV (EnvFile::ENV_EXCLUDED_SECTIONS).

Constants

SECTION = "tang"

Section du coffre qui range les clés.

Class methods

fingerprint(hex : String) : String

Empreinte courte d'une clé, pour vérifier une copie (papier, coffre) sans montrer la clé : 16 premiers caractères du SHA-256 de la clé hex, par groupes de 4. Ne permet pas de retrouver la clé. Pur.

Source
groups(hex : String, size : Int32 = 4) : String

abcd1234… → abcd 1234 … (lisible, recopiable sans erreur). Pur.

Source
insert(plaintext : String, var : String, hex : String) : Tuple(String, StoreResult)

Insère var = "<hex>" dans la section [tang] du TOML en clair (section créée à la fin si absente), sans toucher au reste ni aux commentaires. Même valeur déjà là → texte inchangé ; valeur différente → Conflict. Pur.

Source
reconcile(vault_hex : String | Nil, file_hex : String | Nil, var : String, file_path : String) : Found | Nil

Réconcilie les deux exemplaires possibles. nil si aucun ; Conflict s'ils diffèrent. Pur.

Source
resolve(env_file : Beryl::Config::EnvFile, account : String, var : String, file_path : String) : Found | Nil

Clé d'un serveur : coffre de la société (déjà déchiffré par le loader dans env_file) puis fichier file_path. Lève InvalidKey (format, permissions du fichier) ou Conflict.

Source
vault_var(host_short : String) : String

Variable du coffre d'un serveur : web-1 → WEB_1. Pur.

Source

Nested types