mirror of https://gitlab.crans.org/nounous/nixos
44 lines
3.3 KiB
Markdown
44 lines
3.3 KiB
Markdown
# Secrets
|
|
|
|
## Introduction
|
|
|
|
La gestion des secrets sur NixOS peut se révéler complexe : comme expliquée dans [cette section du `README.md` racine](../README.md#nix-store), aucun secret ne peut apparaître dans le Nix Store. Il faut donc pouvoir charger les secrets dans des fichiers chiffrés qui seront déchiffrés à la reconstruction, sans être pour autant écrits dans le Nix Store. Deux logiciels usuels permettent de faire cela : [`agenix`](https://github.com/ryantm/agenix) et [`sops-nix`](https://github.com/Mic92/sops-nix). Étant donné que `agenix` ne permet pas d'utiliser des clefs GPG, le choix a été fait d'utiliser `sops-nix`.
|
|
|
|
## Sops-nix
|
|
|
|
On ne présentera pas ici tout les détails sur le fonctionnement de `sops-nix`, vous pouvez allez voir [cette section](https://github.com/Mic92/sops-nix?tab=readme-ov-file#usage-example) du `README.md` officiel.
|
|
|
|
### Clefs de chiffrement/déchiffrement
|
|
|
|
La première chose qu'il faut déterminer pour gérer les serets avec `sops-nix` est la gestion des clefs de chiffrement et de déchiffrement. Celles-ci sont de natures différentes : on utilisera des clefs SSH pour les machines et des clefs GPG pour les nounous. Dans les deux cas, on trouve les clefs publiques pour le chiffrement et les clefs privées pour le déchiffrement. La liste des clefs publiques est décrite dans la section `keys` du fichier [`../.sops.yaml`](../.sops.yaml).
|
|
|
|
### Secrets
|
|
|
|
Il faut ensuite chiffrer les secrets que l'on souhaite déclarer. Ces secrets sont décrits dans les différents fichiers YAML dans ce dossier. Chaque fichier n'a qu'une liste prédéfinie de clefs qui ont le droit de le déchiffrer, ce qui fait que toutes les machines n'ont pas accès à tous les secrets, mais seulement à ceux qui leur sont nécessaire. La liste des clefs utilisable pour chaque fichier se trouve dans la partie `creation_rules` du fichier [`../.sops.yaml`](../.sops.yaml). Après reconstruction de la configuration, les secrets sont situés dans le dossier `/run/secrets/`, qui n'est pas lisible par les _users, mais seulement par root. Chaque secret possède de plus un user et un groupe propriétaires qui ont les droits de lecture, ce qui peut être utile pour la gestion des secrets pour des services en particulier.
|
|
|
|
### Utilisation des secrets
|
|
|
|
Pour utiliser des secrets gérés par `sops-nix`, deux étapes sont nécessaires :
|
|
- déclarer l'existence du fichier contenant le secret par `sops.secrets.<name>.sopsFile` ;
|
|
- utiliser le fichier contenant le secret par `config.sops.secrets.<name>.path`.
|
|
|
|
Vous pouvez voir un exemple d'utilisation de tels secrets dans le fichier [`../modules/crans/users.nix`](../modules/crans/users.nix).
|
|
|
|
**Attention** : n'utilisez jamais de secret avec de fichier lisant le contenu du fichier pour l'écrire dans la configuration ! Cela fait perdre tout l'intérêt de l'utilisation de `sops`. Ainsi, il ne faut en aucun cas utiliser les fonctions `lib.readFile`, `lib.fileContents`, ... en combinaison de fichiers contenant des secrets.
|
|
|
|
### Commandes utiles
|
|
|
|
Vous devez avoir l'exécutable `sops` dans votre shell. Vous pouvez pour cela utiliser le [devshell](../devshells/README.md) par défaut avec la commande `nix develop` à la racine du projet.
|
|
|
|
- Mise à jour d'un fichier après changement des clefs :
|
|
|
|
```bash
|
|
$ sops updatekeys [file]
|
|
```
|
|
|
|
- Écriture d'un fichier chiffré :
|
|
|
|
```bash
|
|
$ sops [file]
|
|
```
|