Aller au contenu

Les secrets (sops-nix)

Tous les secrets du réseau (mots de passe, clés, jetons) vivent chiffrés dans un seul fichier, géré par sops-nix 🡕. Il est versionné dans git sous forme chiffrée ; seuls les porteurs d’une clé peuvent le déchiffrer.

# usr/secrets/secrets.yaml (chiffré au repos)
default-password-hash: ...
user:
alice:
password-hash: ...

Le déchiffrement repose sur deux clés age 🡕 :

CléOùRôle
Clé admin~/.config/sops/age/keys.txtÉditer les secrets depuis le poste admin
Clé d’infra/etc/sops/age/infra.keyDéchiffrer sur chaque hôte au déploiement
  • La clé admin dérive de votre clé SSH (~/.ssh/id_ed25519, via ssh-to-age).
  • La clé d’infra est générée une fois, puis poussée sur chaque hôte.
  • Les destinataires sont listés dans usr/secrets/.sops.yaml (admin + infra).

Une seule commande prépare tout l’appareillage de secrets :

Fenêtre de terminal
just configure-admin-host

Elle est idempotente et crée, au besoin :

  • la clé SSH du déployeur (nix) ;
  • un mot de passe aléatoire, connu de personne, pour le compte nix : il n’entre que par sa clé ;
  • la clé admin (depuis la clé SSH) et la clé d’infra (age-keygen) ;
  • le fichier .sops.yaml (destinataires) ;
  • l’empreinte du mot de passe par défaut (just passwd-default) ;
  • la clé de signature du cache binaire Harmonia ;
  • tous les secrets internes des services déclarés (voir plus bas).

Le framework range chaque secret dans l’une de deux familles. La liste de référence vit dans dnf/lib/secrets.nix ; l’autorité sur ce qui est réclamé reste chaque hôte du parc.

Internes — la valeur n’a de sens que pour les machines, personne ne la retient. just configure-admin-host les tire au hasard, une bonne fois :

FamilleExemples
Clients OAuth2 Kanidmoidc-secret-<client>, cookie oauth2-proxy
Sauvegarderestic-password-<zone>, restic/<hôte>/rest-password
Matrixsecrets MAS, livekit-secret, jetons des ponts, turn-secret
Identitésmots de passe de secours Kanidm, paire TLS interne
ServicesAdGuard Home, Nextcloud, Grafana, SearXNG, Vaultwarden, Garage, MinIO…

Externes — la valeur vient d’ailleurs, DNF ne peut pas l’inventer :

FamilleOrigine
Mots de passe de compteschoisis par l’humain (just passwd)
smtp/password (avec network.smtp), wifi-password-<zone>fournisseur, box, opérateur
mautrix-telegram-api-*my.telegram.org
luks-passphrase, yubikey/…frappée au démarrage, ou dérivée de la clé physique
alertmanager-matrix-*compte créé sur le serveur (just configure-alert-bot)
CommandeEffet
just passwd-defaultEnregistre le mot de passe par défaut du parc (empreinte seule)
just passwd <user>Définit le mot de passe d’un utilisateur
just configure-admin-hostGénère les secrets internes manquants (OIDC, sauvegarde, jetons de service…)
just yubikey <user>Enrôle une YubiKey (secret LUKS dérivé + luks-passphrase)
just luks <hôte>Provisionne le chiffrement disque (passphrases partagée + par hôte)
just sopsÉdite le fichier de secrets à la main ($EDITOR)

Après un changement, déployez pour le propager :

Fenêtre de terminal
just passwd alice
just apply @user-alice # déploie la nouvelle empreinte

Un hôte ne déchiffre les secrets qu’avec la clé d’infra. Elle est posée automatiquement par just configure <host>, ou à la main :

Fenêtre de terminal
just push-key <host> # copie /etc/sops/age/infra.key sur l'hôte

La rotation remplace la clé d’infra sur tout le parc, en trois temps vérifiés :

  1. Introduire la nouvelle clé

    Fenêtre de terminal
    just rotate init # nouvelle clé + ré-chiffrement (ancienne + nouvelle)
  2. Diffuser sur tous les hôtes

    Fenêtre de terminal
    just rotate push-keys # chaque hôte reçoit les deux clés
    just apply '*'
  3. Finaliser

    Fenêtre de terminal
    just rotate finalize # abandonne l'ancienne clé (après vérification)
    just apply '*'

just invite se connecte seul au panneau /admin avec le jeton en clair de vaultwarden-admin-token. Une empreinte Argon2 posée à la main l’oblige à demander le jeton ; just configure-admin-host le signale.

Pour migrer : supprimer l’entrée avec just sops, relancer just configure-admin-host, puis just apply hcs. Vaultwarden redémarre avec le nouveau jeton. Le panneau reste protégé par le réseau : il ne répond que depuis le LAN et le tailnet.

Les secrets du projet sont chiffrés pour les clés de l’ancienne machine d’admin. just configure-admin-host refuse donc d’en créer de nouvelles : restaurez d’abord /home/nix/.ssh/id_ed25519 et /etc/sops/age/infra.key (propriété de nix, mode 600).

just bootstrap-keys crée les clés et le squelette sops sous une racine donnée, par exemple /mnt depuis l’installateur, avec les identifiants que NixOS donnera au compte nix. Voir le Justfile.