Sauvegarde & Restauration des Secrets
Procédures essentielles pour protéger et restaurer les clés de chiffrement qui sécurisent tous les secrets de la Forge.
Vue d’Ensemble
Section intitulée « Vue d’Ensemble »Les secrets sont chiffrés avec sops-nix et des clés age.
Les fichiers chiffrés (.yaml) sont versionnés dans git — c’est sans risque, personne ne peut les lire
sans la clé privée correspondante. Ce qu’il faut absolument protéger, c’est la clé privée age de exampleHost.
Fichiers de Secrets
Section intitulée « Fichiers de Secrets »| Fichier | Chiffré avec |
|---|---|
secrets/kuri_exampleHost.yaml | clé age de exampleHost uniquement |
secrets/clochette.yaml | clé age de clochette + clé age de exampleHost |
secrets/RogueLeader.yaml | clé age de RogueLeader + clé age de exampleHost |
Clés Age par Machine
Section intitulée « Clés Age par Machine »exampleHost
Section intitulée « exampleHost »- Type : clé age dédiée, gérée manuellement
- Emplacement :
/etc/sops/age/keys.txt - Permissions :
0640 root:users(lisible par le groupeusers) - Clé publique :
age1xr32hdvanup0zk63v8hrcv2u2c09wplz6fd42w47mkjrd49j39xqaqqckq
C’est la seule clé qui doit être sauvegardée hors-ligne. Voir la procédure ci-dessous.
clochette
Section intitulée « clochette »- Type : clé age dérivée de la clé SSH host ed25519
- Source :
/etc/ssh/ssh_host_ed25519_key(généré automatiquement à l’install) - Clé publique :
age18594hnd4mk3736a36a5fqc5w55sanac86tv8du0hz67rfk558srs3y9jwa
La clé privée age n’existe pas en tant que fichier : sops-nix la dérive à la volée depuis la clé SSH host.
Après une réinstallation, une nouvelle clé SSH host est générée → la clé age change → il faut mettre à jour .sops.yaml.
RogueLeader
Section intitulée « RogueLeader »- Type : clé age dérivée de la clé SSH host ed25519
- Source :
/etc/ssh/ssh_host_ed25519_key(explicite dans la config) - Clé publique :
age1nttxr633hf6r43szc9ffl2a0avmtmhtl7hhnjjuyd3sc4au705nqffyfwe
Même comportement que clochette.
Ce qui est Déjà Sauvegardé
Section intitulée « Ce qui est Déjà Sauvegardé »| Élément | Où | État |
|---|---|---|
Fichiers secrets chiffrés (*.yaml) | Dépôt git | ✅ Versionné automatiquement |
Configuration sops (.sops.yaml) | Dépôt git | ✅ Versionné automatiquement |
| Clé privée age de exampleHost | /etc/sops/age/keys.txt | ⚠️ À sauvegarder manuellement |
| Clés SSH host de clochette/RogueLeader | /etc/ssh/ssh_host_ed25519_key | ⚠️ Régénérées à chaque réinstall |
Procédure de Sauvegarde — Clé Age de exampleHost
Section intitulée « Procédure de Sauvegarde — Clé Age de exampleHost »Afficher la Clé Publique (Vérification)
Section intitulée « Afficher la Clé Publique (Vérification) »Depuis exampleHost :
age-keygen -y /etc/sops/age/keys.txtRésultat attendu :
age1xr32hdvanup0zk63v8hrcv2u2c09wplz6fd42w47mkjrd49j39xqaqqckqSi cette valeur ne correspond pas à la clé dans .sops.yaml, il y a un problème.
Afficher la Clé Privée
Section intitulée « Afficher la Clé Privée »sudo cat /etc/sops/age/keys.txtLe contenu ressemble à :
# created: 2024-01-01T00:00:00+01:00# public key: age1xr32hdvanup0zk63v8hrcv2u2c09wplz6fd42w47mkjrd49j39xqaqqckqAGE-SECRET-KEY-1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOù Stocker la Sauvegarde
Section intitulée « Où Stocker la Sauvegarde »Stocker la clé privée dans au moins deux des emplacements suivants :
- Gestionnaire de mots de passe (Bitwarden/rbw) : coller le contenu complet dans une note sécurisée
- Clé USB chiffrée (LUKS) stockée hors site
- Impression papier rangée dans un endroit sûr (coffre, etc.) — format texte suffit
Ne pas stocker la sauvegarde uniquement sur exampleHost lui-même.
Procédure de Vérification
Section intitulée « Procédure de Vérification »Vérifier régulièrement que la sauvegarde permet bien de déchiffrer les secrets.
Depuis exampleHost, avec la clé en place :
# Déchiffrer clochette.yaml (affiche les secrets en clair — ne pas laisser dans un terminal partagé)sops -d secrets/clochette.yaml
# Déchiffrer kuri_exampleHost.yamlsops -d secrets/kuri_exampleHost.yaml
# Déchiffrer RogueLeader.yamlsops -d secrets/RogueLeader.yamlCes commandes doivent s’exécuter sans erreur. Si sops retourne could not decrypt, la clé est absente ou incorrecte.
Procédure de Restauration — Clé Age de exampleHost
Section intitulée « Procédure de Restauration — Clé Age de exampleHost »Situation : exampleHost a été réinstallé, la clé /etc/sops/age/keys.txt n’existe plus.
1. Créer le Répertoire
Section intitulée « 1. Créer le Répertoire »sudo mkdir -p /etc/sops/agesudo chmod 750 /etc/sops/age2. Restaurer la Clé depuis la Sauvegarde
Section intitulée « 2. Restaurer la Clé depuis la Sauvegarde »Coller le contenu sauvegardé (clé privée complète) dans le fichier :
sudo micro /etc/sops/age/keys.txt# ousudo tee /etc/sops/age/keys.txt << 'EOF'# created: 2024-01-01T00:00:00+01:00# public key: age1xr32hdvanup0zk63v8hrcv2u2c09wplz6fd42w47mkjrd49j39xqaqqckqAGE-SECRET-KEY-1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXEOF3. Corriger les Permissions
Section intitulée « 3. Corriger les Permissions »sudo chmod 640 /etc/sops/age/keys.txtsudo chown root:users /etc/sops/age/keys.txt4. Vérifier
Section intitulée « 4. Vérifier »age-keygen -y /etc/sops/age/keys.txt# Doit afficher : age1xr32hdvanup0zk63v8hrcv2u2c09wplz6fd42w47mkjrd49j39xqaqqckq
sops -d secrets/kuri_exampleHost.yaml# Doit afficher le contenu déchiffré sans erreur5. Relancer le Déploiement NixOS
Section intitulée « 5. Relancer le Déploiement NixOS »just installsops-nix re-dépose les secrets dans /run/secrets et /run/user/1000/secrets.
Procédure Après Réinstallation de clochette ou RogueLeader
Section intitulée « Procédure Après Réinstallation de clochette ou RogueLeader »Quand clochette ou RogueLeader est réinstallé, une nouvelle clé SSH host est générée.
La clé age dérivée change, et elle ne correspond plus à celle dans .sops.yaml.
Il faut mettre à jour .sops.yaml et re-chiffrer les secrets concernés.
1. Récupérer la Nouvelle Clé Age Publique
Section intitulée « 1. Récupérer la Nouvelle Clé Age Publique »Depuis la machine réinstallée (via Tailscale ou console) :
# Convertir la clé SSH host en clé age publiquenix run nixpkgs#ssh-to-age -- -i /etc/ssh/ssh_host_ed25519_key.pubExemple de résultat :
age18594hnd4mk3736a36a5fqc5w55sanac86tv8du0hz67rfk558srs3y9jwa2. Mettre à Jour .sops.yaml
Section intitulée « 2. Mettre à Jour .sops.yaml »Dans le dépôt git, remplacer l’ancienne clé publique par la nouvelle.
Pour clochette, modifier .sops.yaml :
keys: - &server_clochette age1NOUVELLE_CLE_PUBLIQUE_ICIPour RogueLeader :
keys: - &server_rogueleader age1NOUVELLE_CLE_PUBLIQUE_ICI3. Re-chiffrer les Fichiers de Secrets
Section intitulée « 3. Re-chiffrer les Fichiers de Secrets »Depuis exampleHost (qui peut toujours déchiffrer grâce à sa clé maîtresse) :
# Pour clochettesops updatekeys secrets/clochette.yaml
# Pour RogueLeadersops updatekeys secrets/RogueLeader.yamlupdatekeys re-chiffre les secrets avec les clés définies dans .sops.yaml.
Confirmer avec y quand sops demande validation.
4. Vérifier et Committer
Section intitulée « 4. Vérifier et Committer »# Vérifier que les fichiers sont bien mis à jourgit diff secrets/
# Committergit add .sops.yaml secrets/clochette.yaml # ou secrets/RogueLeader.yamlgit commit -m "chore(secrets): rotate age key for clochette after reinstall"5. Déployer
Section intitulée « 5. Déployer »just install_clochette --ask-sudo-passwordScénario Catastrophe — Clé Age de exampleHost Perdue sans Sauvegarde
Section intitulée « Scénario Catastrophe — Clé Age de exampleHost Perdue sans Sauvegarde »Si la clé privée age de exampleHost est perdue et qu’aucune sauvegarde n’existe :
| Fichier | Situation |
|---|---|
kuri_exampleHost.yaml | Irrécupérable — chiffré uniquement avec la clé perdue |
clochette.yaml | Récupérable depuis clochette (via sa clé SSH host) |
RogueLeader.yaml | Récupérable depuis RogueLeader (via sa clé SSH host) |
Pour kuri_exampleHost.yaml : repartir de zéro
# Générer une nouvelle clé ageage-keygen -o /etc/sops/age/keys.txt
# Afficher la nouvelle clé publiqueage-keygen -y /etc/sops/age/keys.txt
# Mettre à jour .sops.yaml avec la nouvelle clé publique# Remplacer desktop_examplehost dans .sops.yaml
# Recréer kuri_exampleHost.yaml depuis zérosops secrets/kuri_exampleHost.yaml# Saisir manuellement tous les secrets (mots de passe, etc.)
# Re-chiffrer clochette.yaml et RogueLeader.yaml avec la nouvelle clésops updatekeys secrets/clochette.yamlsops updatekeys secrets/RogueLeader.yaml
# Committergit add .sops.yaml secrets/git commit -m "chore(secrets): rotate all age keys after exampleHost key loss"