Gérer ses secrets dans une configuration Nixos

Gestion des secrets dans un environnement déclaratif et public

En relisant mon ancien article sur [agenix](“Gérer ses secrets quand on utilise git et qu’on partage son code (et Nixos)”), j’ai remarqué une chose : rien n’est vraiment claire.

Il était donc temps de refaire un article, avec un exemple concret.

Pourquoi utiliser Agenix sur NixOS ?

Quand on commence à automatiser son infrastructure avec NixOS, une question revient rapidement :

Comment gérer les secrets sans laisser traîner des mots de passe en clair dans le dépôt Git ?

C’est précisément le problème que résout Agenix.

Agenix permet de :

chiffrer des secrets avec Age

utiliser des clés SSH existantes

stocker les fichiers chiffrés dans Git

déployer automatiquement les secrets sur NixOS

Dans cet article, nous allons configurer Agenix via nix-channel puis l’utiliser pour gérer le mot de passe administrateur de Grafana.

Installation d’Agenix avec nix-channel

Ajout du channel :

1
2
sudo nix-channel --add https://github.com/ryantm/agenix/archive/main.tar.gz agenix
sudo nix-channel --update

Installation :

1
nix-env -iA agenix.agenix

Vérification :

1
agenix --help

Génération d’une clé SSH dédiée

Agenix repose sur des clés SSH pour chiffrer et déchiffrer les secrets.

Création de la clé :

1
sudo ssh-keygen -t ed25519 -f /etc/ssh/agenix

Les fichiers générés :

1
2
/etc/ssh/agenix
/etc/ssh/agenix.pub

Vous pouvez utiliser une clé déjà existante, mais perso je préfère une clé spécifique.

Activation d’Agenix dans NixOS

Dans /etc/nixos/configuration.nix :

1
2
3
4
5
6
7
{
imports = [
<agenix/modules/age.nix>
];

age.identityPaths = [ "/etc/ssh/agenix" ];
}

Organisation des secrets

Une bonne pratique consiste à centraliser les secrets dans un répertoire dédié.

Exemple :

1
2
3
4
5
/etc/nixos
├── configuration.nix
└── secrets
├-── secrets.nix
└-── grafana-admin-password.age

Cette structure reste simple, lisible et facile à maintenir.

Création du fichier secrets.nix

Récupération de la clé publique :

1
cat /etc/ssh/agenix.pub

Exemple :

1
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIExample root@nixos

Création du fichier secrets.nix :

1
2
3
4
5
6
let
mykey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIExample root@nixos";
in
{
"grafana-admin-password.age".publicKeys = [ mykey ];
}

Ce fichier indique simplement quelles clés publiques sont autorisées à déchiffrer le secret.

Création du secret Grafana

Positionnement dans le répertoire des secrets :

1
cd /etc/nixos/secrets

Création du fichier chiffré :

1
agenix -e grafana-admin-password.age

L’éditeur s’ouvre automatiquement.

Exemple de contenu :

1
MonMotDePasseGrafanaUltraSecret

Une fois sauvegardé, le fichier chiffré est créé :

1
grafana-admin-password.age

Déclaration du secret dans configuration.nix

Ajout du secret :

1
2
3
4
5
6
{
age.secrets.grafana-admin-password = {
file = ./secrets/grafana-admin-password.age;
owner = "grafana";
};
}

Ici, le chemin peut parfaitement pointer vers un sous-répertoire.

Le déplacement physique du fichier .age n’impacte pas le contenu du secrets.nix.

Important : comprendre secrets.nix

Le rôle de secrets.nix est souvent mal compris.

Ce fichier ne sert PAS à indiquer où se trouve le secret sur le disque.

Il sert uniquement à :

définir le nom logique du secret

associer les clés publiques autorisées

Par exemple :

1
2
3
{
"grafana-admin-password.age".publicKeys = [ mykey ];
}

Le chemin réel du fichier est ensuite défini dans :

1
age.secrets.<nom>.file

Cela permet d’organiser librement ses secrets :

1
2
3
4
5
6
7
secrets/
├── grafana/
│   └── admin-password.age
├── postgres/
│   └── password.age
└── cloudflare/
└── token.age

Configuration de Grafana

Configuration complète :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
services.grafana = {
enable = true;

```
settings = {
  security = {
    admin_user = "admin";
    admin_password = "$__file{/run/agenix/grafana-admin-password}";
  };
};
```

};
}

Au démarrage :

Agenix déchiffre automatiquement le secret

le fichier apparaît dans /run/agenix

Grafana lit directement le contenu

  • Application de la configuration

Reconstruction du système :

1
sudo nixos-rebuild switch

Vérification :

1
sudo ls /run/agenix

Affichage du secret :

1
sudo cat /run/agenix/grafana-admin-password

Connexion Grafana :

1
http://localhost:3000

Utilisateur :

1
admin

Mot de passe :

1
celui stocké dans Agenix

Modifier un secret plus tard

Pour modifier le mot de passe :

1
2
cd /etc/nixos/secrets
agenix -e grafana-admin-password.age

Puis :

1
sudo nixos-rebuild switch

Conclusion

Agenix apporte une solution élégante et très naturelle à la gestion des secrets sur NixOS.

L’utilisation des clés SSH simplifie énormément le workflow par rapport à des solutions basées sur GPG.

Avec une bonne organisation des fichiers :

les secrets restent versionnables

Git peut être utilisé sans risque

les services comme Grafana récupèrent automatiquement leurs mots de passe

Une approche propre, moderne et parfaitement adaptée à l’écosystème NixOS.

Généré avec Hugo
Thème Stack conçu par Jimmy