NixOS et les secrets
(isabelroses.com)- Sur NixOS, si vous laissez des secrets en clair dans la configuration Nix, un dépôt Git privé ou
git-crypt, le Nix store est lisible par tous, donc toute personne ayant accès à la machine peut lire ces secrets - sops-nix chiffre les fichiers de secrets via des règles
.sops.yamlet le flux d’édition desops, puis les déchiffre à l’activation avec la clé SSH de l’hôte pour placer le texte en clair dans le tmpfs de/run/secrets/<name> - agenix permet de définir dans
secrets.nixles clés publiques destinataires pour chaque secret, déchiffre les fichiers.agedans le tmpfs de/run/agenix/<name>, et nécessite un rechiffrement lors de l’ajout d’un nouvel hôte ou d’une rotation de clé - Placer directement des secrets sur le système de fichiers peut convenir à un serveur unique ou à un portable, mais si vous les lisez au moment de l’évaluation, comme avec
builtins.readFile "/var/lib/myservice/token", la valeur finit dans le Nix store, donc il faut l’éviter - Pour démarrer avec quelques jetons indépendants, agenix demande moins d’étapes, tandis que pour un hôte comme un serveur mail avec beaucoup de secrets liés, sops-nix est plus adapté pour regrouper plusieurs valeurs dans un seul fichier
Risque de base lors de la gestion des secrets sur NixOS
- Sur NixOS, la gestion des secrets se répartit entre
sops-nix,agenix/ragenix, l’usage direct du système de fichiers, les dépôts Git privés,git-cryptet l’écriture directe dans la configuration Nix - Il ne faut pas utiliser les dépôts Git privés,
git-cryptou l’écriture directe dans la configuration Nix si la machine est partagée ou si vous prévoyez de rendre la configuration publique- Le Nix store est lisible par tous, donc toute personne ayant accès à la machine peut lire les secrets
- Ce risque est particulièrement important lorsqu’il existe des vulnérabilités comme CVE-2026-31431(copyfail) et CVE-2026-43284 et CVE-2026-43500(dirtyfrag)
- Des secrets ont déjà fuité au moins deux fois dans des configurations publiées, et on peut encore en voir des exemples ici : 1, 2
sops-nix
- sops-nix peut sembler difficile à configurer au premier abord, mais la documentation s’est nettement améliorée, et le fait que
sopsprenne désormais en charge par défaut le chiffrement et le déchiffrement des secrets avec des clés SSH constitue une avancée importante - Cependant,
sops-nixest encore en retard sur cette prise en charge des clés SSH, avec des travaux en cours dans sops-nix#779 et sops-nix#922 - Le flux d’utilisation consiste à définir des règles de chiffrement et déchiffrement dans
.sops.yaml, puis à éditer les fichiers de secrets avec la commandesops- Par exemple, on peut définir pour le chemin
secrets/*.yamldes clés publiques SSH comme destinatairesage - En exécutant
sops secrets/shush.yaml, l’éditeur choisi s’ouvre et l’on peut saisir des valeurs YAML commehello: sops - En quittant l’éditeur, les valeurs sont chiffrées sous une forme comme
ENC[AES256_GCM,...], puis peuvent être modifiées à nouveau avec la même commande
- Par exemple, on peut définir pour le chemin
- Dans la configuration NixOS, le module
sops-nixgère l’essentiel du travaildefaultSopsFile = ./secrets/shush.yaml;définit le fichier de secrets par défautage.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];indique la clé SSH de l’hôte- Dans
secrets."hello", on peut définirowner,groupetmodepour régler les permissions du fichier
- Au moment de l’activation,
sops-nixdéchiffre le fichier avec la clé SSH de l’hôte et place le texte en clair dans/run/secrets/<name>- Ce chemin étant sur tmpfs, les secrets ne touchent pas le disque
- Les services qui en ont besoin n’ont qu’à lire ce chemin
- La fonctionnalité de template est utile dans des configurations partagées ou référencées par d’autres utilisateurs
- Si un fichier de configuration de service doit contenir à la fois du texte en clair et certains secrets, il n’est pas nécessaire de chiffrer tout le fichier
- Par exemple,
SMTP_USER=isabelpeut rester en clair, tandis qu’un espace réservé de secret peut être inséré commeSMTP_PASSWORD=${config.sops.placeholder."mailserver/smtp_password"}
agenix
- agenix, contrairement à
sops-nix, configure les secrets et les clés autorisées danssecrets.nix, ce qui donne une expérience plus proche de Nix - Dans
secrets.nix, on associe des clés publiques SSH d’utilisateurs et d’hôtes, puis on définit quelles clés publiques peuvent accéder à chaque fichier.age- Par exemple, on peut définir
"secret1.age".publicKeys = [ isabel host1 ];et"secret2.age".publicKeys = [ isabel host2 ];, avec une liste de destinataires différente pour chaque secret
- Par exemple, on peut définir
- Les fichiers de secrets doivent être créés avec l’interface en ligne de commande
agenix- La commande
agenix -e secret1.agepermet de créersecret1.ageou de l’éditer plus tard
- La commande
- La façon de les rattacher à la configuration de l’hôte ressemble à
sops-nix, mais comme chaque secret est un fichier distinct, la surface visible est plus réduiteage.secrets.secret1.file = ./secrets/secret1.age;permet de spécifier le fichierowner,groupetmodeservent à définir le propriétaire et les permissions
- Au démarrage, chaque fichier
.ageest déchiffré avec la clé SSH de l’hôte puis placé dans/run/agenix/<name>- Ce chemin se trouve lui aussi sur tmpfs
- Le point qui bloque le plus souvent est le rekeying
- Quand on ajoute un nouvel hôte ou qu’on remplace une clé, il faut rechiffrer tous les secrets dont la liste
publicKeysa changé danssecrets.nix agenix --rekeys’en charge, mais il faut la clé privée de l’un des destinataires actuels pour relire le texte chiffré existant- En pratique, le rechiffrement se fait donc sur la machine la plus fiable, et non sur le nouvel hôte à déployer
- Quand on ajoute un nouvel hôte ou qu’on remplace une clé, il faut rechiffrer tous les secrets dont la liste
Approche basée uniquement sur le système de fichiers
- Placer directement les secrets sur le système de fichiers a un coût : la configuration ne décrit alors plus entièrement la machine
- Lors d’une réinstallation, il faut remettre tous les fichiers au bon endroit avec les bons propriétaires
- Dans une opération de restauration, comme lorsqu’il faut remettre un serveur sur pied à 2 heures du matin, cela peut devenir catastrophique
- Le motif à éviter est une forme comme
builtins.readFile "/var/lib/myservice/token"- Cette approche lit le fichier au moment de l’évaluation et inclut son contenu dans le Nix store
- Comme le Nix store est lisible par tous, on retombe exactement dans le mode d’échec signalé au début
- À la place, il faut transmettre au service le chemin, et non la valeur elle-même
- On peut par exemple utiliser des options comme services.*.environmentFiles
- Cela peut convenir à un serveur unique ou à un portable, mais pour une flotte de machines ou un environnement que l’on souhaite pouvoir reconstruire entièrement à partir de la configuration,
sops-nixouagenixsont plus appropriés - C’est acceptable quand chaque machine n’a qu’une ou deux valeurs qu’il ne faut vraiment pas mettre dans le dépôt, mais cela reporte sur vous-même, plus tard, la responsabilité de les remettre en place
Comparaison entre sops-nix et agenix
- La principale raison de choisir
sops-nixest sa capacité à regrouper autant de données que possible dans un seul fichier- Pour des cas comme un serveur mail avec de nombreux secrets liés, on peut mettre davantage de secrets dans un seul fichier au lieu de les répartir dans environ cinq fichiers comme avec
agenix - C’est un outil puissant, adapté à un usage prolongé, et un bon premier choix pour des hôtes comme des serveurs mail qui accumulent beaucoup de secrets
- Pour des cas comme un serveur mail avec de nombreux secrets liés, on peut mettre davantage de secrets dans un seul fichier au lieu de les répartir dans environ cinq fichiers comme avec
agenixse distingue par sa simplicité- Il n’y a pas de schéma YAML à apprendre
- Il n’y a pas de
.sops.yamlà synchroniser - Comme
secrets.nixest simplement du Nix, on peut réutiliser pour les clés les mêmes liaisonslet ... inque pour les hôtes et les utilisateurs - Son modèle mental est « un secret, un fichier, une liste de destinataires », ce qui s’accorde bien avec sa manière de contrôler les accès
- C’est l’option avec le moins de pièces mobiles tout en offrant un contrôle d’accès par clé selon l’hôte, ce qui en fait une bonne recommandation pour les personnes qui découvrent la gestion des secrets sur des machines NixOS
- Les deux outils résolvent le problème, et la différence actuelle tient surtout à la facilité d’usage
- Pour démarrer avec plusieurs services ayant besoin de groupes de secrets liés,
sops-nixévolue mieux - Pour démarrer avec surtout quelques jetons indépendants,
agenixpermet d’atteindre l’objectif avec moins d’étapes - Si vous choisissez votre premier outil de gestion des secrets, mieux vaut commencer avec
agenixpour vous familiariser avec le flux, puis passer àsops-nixlorsque le modèle « un secret par fichier » devient réellement gênant
- Pour démarrer avec plusieurs services ayant besoin de groupes de secrets liés,
- Les points liés à la résistance quantique ont été corrigés
1 commentaires
Avis sur Lobste.rs
Le secret chiffré et sa clé ne sont-ils pas tous les deux sur le disque ? Ou bien l’un des deux est-il stocké dans un TPM ou quelque chose du genre ?
Je commence tout juste à utiliser Nix, et pour un petit déploiement auto-hébergé, j’utilise simplement la méthode consistant à les copier dans le système de fichiers avec
scp, parce que c’est simpleEn cherchant un peu, j’ai l’impression qu’on peut protéger une clé privée SSH avec un TPM, et je me demandais si c’était aussi possible dans une VM ; le fait qu’il puisse y avoir un support du vTPM répond en quelque sorte à ma propre question
J’ai aussi un accès NixOps côté serveur. On peut regarder comment Colmena s’y prend : https://colmena.cli.rs/0.4/features/keys.html
L’idée essentielle, c’est qu’une machine de confiance qui détient les secrets les pousse vers le serveur distant. C’est similaire à ce que tu fais actuellement avec
scp, mais le processus est orchestré d’une manière plus conforme à l’esprit de NixComme j’ai passé plusieurs soirées ces derniers jours à reconfigurer tout l’écosystème agenix dans la flake de mon système, je ne peux parler que d’agenix. Pour les personnes intéressées, j’ai choisi agenix-rekey, parce qu’il évite d’avoir à garder des fichiers
.ymlcontenant des secrets, et permet de configurer tous les secrets directement dans Nix, comme je le faisais déjàLes secrets chiffrés sont dans le Nix store, et sont lisibles globalement comme tout le reste du Nix store. La clé privée SSH qui permet de les déchiffrer est en général la vraie clé privée du serveur SSH, même si on peut faire autrement. Les secrets sont déchiffrés au moment de l’activation, en gros au démarrage, puis placés dans
/run/agenix/<user>Un outil appelé secrix va plus loin en liant les secrets à des services systemd, puis en liant ces services à ceux qui ont besoin des secrets. Ainsi, les secrets ne sont déchiffrés que lorsque le service concerné tourne. En pratique, comme les utilisateurs de NixOS démarrent et arrêtent rarement leurs services en permanence, cela revient souvent à dire qu’ils restent déchiffrés en continu. Cela peut néanmoins convenir pour des secrets liés à l’activation du système, comme la création d’utilisateurs
agenix-rekey rend la rotation des clés moins pénible et remplace
secrets.nixpar des sorties de flake. Il utilise un split identity YubiKey comme l’une des moitiés de la clé. La rotation consiste à s’authentifier avec cette clé et l’autre moitié, à déchiffrer les secrets, puis à les rechiffrer pour la clé publique SSH du serveur. Cette clé publique est générée lors de l’installation du système, et j’utilise nixos-anywhere avec--copy-host-keyspour récupérer les clés générées depuis la clôture d’installation. Je garde les secrets chiffrés dans le dépôt, mais dans un sous-module séparé accessible uniquement aux builders de confianceÀ noter que vTPM n’est généralement pas basé sur du matériel, et que beaucoup de fournisseurs, même lorsqu’ils proposent un TPM, n’offrent le plus souvent qu’un TPM v1.2 plutôt qu’un TPM v2. C’est aussi le cas de mon fournisseur, BinaryLane. Cela ajoute bien une couche de sécurité supplémentaire, mais ce n’est pas un HSM magique comme un vrai TPM, et cela ne protège pas contre la compromission du fournisseur ou du nœud hôte. Permettre un vTPM réellement fondé sur un HSM serait probablement très coûteux pour les fournisseurs, et AWS semble le proposer à des prix AWS
agenix+agenix-rekey+age-plugin-1pMa clé maîtresse est dans 1Password, ce qui me permet de modifier, consulter et faire la rotation des mots de passe de n’importe quel serveur sans laisser le moindre identifiant sur le disque de mon portable
Je peux donner des droits d’accès aux serveurs qui ont besoin d’accéder aux clés à l’exécution. Il suffit d’indiquer à agenix-rekey quelles clés un serveur donné peut voir et d’exécuter
agenix rekey; une version chiffrée de la clé que ce serveur peut déchiffrer est alors enregistrée dans le Nix store. La clé privée SSH de ce serveur ne se trouve que sur ce serveur et n’en sort jamais. agenix-rekey n’a besoin que de la clé publique pour faire la rotationDonc, les seuls cas où les secrets fuient sont soit un piratage de mon compte 1Password, soit la compromission du serveur qui utilise ces secrets
/etc/ssh/ssh_host_ed25519_key, puis placés dans une ramfs montée sur/run/agenix.dDonc oui : le contenu chiffré, la clé de chiffrement et le contenu déchiffré sont tous accessibles via le système de fichiers
https://github.com/oddlama/agenix-rekey
En plus, les identifiants de longue durée deviennent de plus en plus rares. On s’éloigne de la copie d’identifiants à long terme pour aller vers des identifiants fondés sur du matériel, utilisés directement ou échangés contre des identifiants à courte durée de vie