Agenix la solution pour les secrets dans une configuration Nixos

Gestion des secrets dans un environnement déclaratif et public

En relisant mon ancien article sur agenix, j’ai remarqué une chose : rien n’est vraiment claire.

Il était donc temps de refaire un article.

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.

Qu’est-ce exactement agenix ?

Agenix est un petit service et une bibliothèque Nix/NixOS qui permet de gérer, chiffrer et déchiffrer des secrets (clés SSH, mots de passe, fichiers de configuration sensibles, etc.) en s’appuyant sur le protocole age (Actually Good Encryption).

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 utilise des clés SSH pour chiffrer et déchiffrer les secrets. Il est donc opportun de lui attribuer une pair de clés, dédiées.

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

La création d’une clé spécifique n’est pas obligatoire, mais une bonne pratique.

Activation d’agenix dans NixOS

Dans /etc/nixos/configuration.nix ajoutez :

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
{
  services.grafana = {
    enable = true;
    settings = {
      security = {
        admin_user = "admin";
        admin_password = "$__file{/run/agenix/grafana-admin-password}";
      };
    };
  };
}

Au démarrage du service grafana :

  • agenix déchiffre automatiquement le secret
  • le fichier apparaît dans /run/agenix
  • Grafana lit directement le contenu du fichier contenant le secret

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 :

  • Git peut être utilisé sans risque, y compris dans un dépôt public
  • les secrets restent versionables
  • les services comme Grafana récupèrent automatiquement leurs mots de passe
Généré avec Hugo
Thème Stack conçu par Jimmy