Compare commits
1 commit
b96dfbe92c
...
74c17b4061
Author | SHA1 | Date | |
---|---|---|---|
74c17b4061 |
9 changed files with 68 additions and 64 deletions
72
README.md
72
README.md
|
@ -1,72 +1,72 @@
|
||||||
# NixOS
|
# NixOS
|
||||||
|
|
||||||
Ce repo contient la configuration NixOS des différentes machines présentes dans
|
Ce repo contient la configuration NixOS des différentes machines présentes dans
|
||||||
l'infrastructure de Aurore et se décompose en plusieurs parties :
|
l'infrastructure d'Aurore et se décompose en plusieurs parties :
|
||||||
|
|
||||||
- [disks](./disks) : contient la configuration [disko](https://github.com/nix-community/disko)
|
- [disks](./disks) : contient la configuration [disko](https://github.com/nix-community/disko)
|
||||||
des machines.
|
des machines.
|
||||||
- [devshells](./devshells) : contient des shells nix pour faciliter l'édition
|
- [devshells](./devshells) : contient des shells nix pour obtenir des
|
||||||
des configurations nixos.
|
environnements avec l'ensemble des dépendances nécessaires.
|
||||||
- [hosts](./hosts) : contient la configuration spécifique à chaque machine,
|
- [hosts](./hosts) : contient la configuration spécifique à chaque machine,
|
||||||
typiquement la configuration réseau,
|
typiquement la configuration réseau,
|
||||||
- [profiles](./profiles) : contient la configuration des différents modules
|
- [profiles](./profiles) : contient la configuration des différents modules
|
||||||
utilisé,
|
utilisés.
|
||||||
- [secrets](./secrets) : contient l'ensemble des secrets chiffrés avec
|
- [secrets](./secrets) : contient l'ensemble des secrets chiffrés avec
|
||||||
[agenix](https://github.com/ryantm/agenix).
|
[agenix](https://github.com/ryantm/agenix).
|
||||||
|
|
||||||
|
|
||||||
## Gestion des secrets
|
## Gestion des secrets
|
||||||
|
|
||||||
Dans NixOS, l'ensemble des fichiers est écrit dans `/nix/store` et qui est
|
Dans Nix, l'ensemble des fichiers est écrit dans `/nix/store`, ce qui est
|
||||||
visible par tous les programmes (et tout les utilisateur⋅ices). De plus,
|
accessible et donc visible par tous les programmes (et tous les utilisateur⋅ices).
|
||||||
l'ensemble des fichiers de configurations se trouvent sur un repo git publique.
|
De plus, l'ensemble des fichiers de configurations se trouvent sur un repo git
|
||||||
Pour ces deux raisons, il est préférable de chiffrer les secrets à l'aide de
|
publique. Pour ces deux raisons, il est préférable de chiffrer les secrets à
|
||||||
[agenix](https://github.com/ryantm/agenix). Pour plus de détaille dans
|
l'aide de [agenix](https://github.com/ryantm/agenix). Plus de détails sont
|
||||||
[secrets](./secrets)
|
disponibles dans [secrets](./secrets).
|
||||||
|
|
||||||
|
|
||||||
## Installation d'une machine
|
## Installation d'une machine
|
||||||
|
|
||||||
Si la configuration est déjà écrite, il faut alors suivre les étapes suivantes :
|
Si la configuration est déjà présente dans ce projet, il vous suffit de suivre
|
||||||
|
les étapes suivantes :
|
||||||
1. S'assurer que la machine a accès à internet et possède un serveur DNS,
|
1. Assurez-vous que la machine a accès à Internet et possède un serveur DNS,
|
||||||
1. Importer les fichiers de configurations,
|
1. Importez les fichiers de configuration,
|
||||||
1. Si nécessaire, il faut de générer le fichier `hardware-configuration.nix`
|
1. Si nécessaire, il faut générer le fichier `hardware-configuration.nix`
|
||||||
à l'aide de la commande `nixos-generate-config --no-filesystems --root .`
|
à l'aide de la commande `nixos-generate-config --no-filesystems --root .`
|
||||||
puis de l'ajouter dans la configuration,
|
puis l'ajouter dans la configuration,
|
||||||
1. Vérifier que la configuration `disko` utilisée est compatible, la
|
1. Vérifiez que la configuration `disko` utilisée est compatible, la
|
||||||
commande `lsblk` devrait être suffisant pour cela,
|
commande `lsblk` devrait être suffisante pour cela,
|
||||||
1. Partitionner les disques : l'usage de `disko` simplifie cette étape. En
|
1. Partitionnez les disques : l'usage de `disko` simplifie cette étape. En
|
||||||
effet, il suffit d'exécuter la commande :
|
effet, il suffit d'exécuter la commande :
|
||||||
`nix run github:nix-community/disko --extra-experimental-features "nix-command flakes" -- --mode disko --flake <path>#<nom>`
|
`nix run github:nix-community/disko --extra-experimental-features "nix-command flakes" -- --mode disko --flake <path>#<nom>`,
|
||||||
`disko` s'occupe automatiquement du montage des partitions créer,
|
et `disko` s'occupe automatiquement du montage des partitions créées,
|
||||||
1. Créer le répertoire `/mnt/etc/nixos` et ajouter les fichiers de
|
1. Créez le répertoire `/mnt/etc/nixos` et ajoutez les fichiers de
|
||||||
configuration dans ce répertoire,
|
configuration dans ce répertoire,
|
||||||
1. Installer NixOS : `nixos-install --flake <path>#<nom>`,
|
1. Installez NixOS : `nixos-install --flake <path>#<nom>`,
|
||||||
1. Si tout s'est bien passé, un mot de passe vous sera demandé pour le mot
|
1. Si tout s'est bien passé, un mot de passe vous sera demandé pour le mot
|
||||||
de passe root. Entrer celui-ci puis `poweroff` ou `reboot`.
|
de passe root, entrez-le, puis redémarrez la machine avec `reboot`.
|
||||||
1. Penser à push la configuration ainsi écrite.
|
1. Pensez à push la configuration ainsi écrite.
|
||||||
|
|
||||||
Remarque :
|
Remarque :
|
||||||
|
> S'il n'y a pas suffisamment de place mémoire sur le disque d'installation lors
|
||||||
> S'il n'y a pas suffisamment de place mémoire sur le disque d'installation
|
> du partitionnement des disques avec `disko`, il est possible d'étendre le
|
||||||
> lors du partitionnement des disques avec disko, il est possible d'étendre le
|
> `/nix/store` en utilisant la RAM de la machine à l'aide de la commande :
|
||||||
> nix-store en utilisant la RAM à l'aide de la commande :
|
|
||||||
> `mount -o remount,size=3G,noatime /nix/.rw-store`
|
> `mount -o remount,size=3G,noatime /nix/.rw-store`
|
||||||
> Cependant, cela peut être risquer s'il n'y a pas suffisamment de RAM.
|
> Cependant, vérifiez au préalable d'avoir suffisamment de RAM.
|
||||||
|
|
||||||
Remarque :
|
Remarque :
|
||||||
|
> Si l'installation nécessite le déchiffrement de secrets, l'installation
|
||||||
> Si l'installation nécéssite le déchiffrement de secrets, l'installation
|
> pourrait échouer. Veuillez alors suivre la procédure décrite dans
|
||||||
> pourrait échouée. Veuillez alors suivre la procédure décrite dans
|
|
||||||
> [secrets](./secrets).
|
> [secrets](./secrets).
|
||||||
|
|
||||||
|
|
||||||
## Formattage
|
## Formattage
|
||||||
|
|
||||||
La flake contient un formatter ([treefmt](https://github.com/numtide/treefmt-nix))
|
La flake contient un formatter ([treefmt](https://github.com/numtide/treefmt-nix))
|
||||||
qui s'exécute automatiquement lors d'un `nix flake check`. Si le repo n'est pas
|
qui s'exécute automatiquement lors d'un `nix flake check`. Si le repo n'est pas
|
||||||
formatter, une erreur sera alors retournée en suggérant des modifications. Pour
|
formatté, une erreur sera alors retournée en suggérant des modifications. Pour
|
||||||
appliquer les modifications suggérées, il est alors possible d"exécuter la
|
appliquer les modifications suggérées, il est alors possible d'exécuter la
|
||||||
commande :
|
commande :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ nix fmt
|
$ nix fmt
|
||||||
```
|
```
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
# Devshells
|
# Devshells
|
||||||
|
|
||||||
Un `devshells` permet de créer un environnement contenant des outils pour
|
Un `devshell` permet de créer un environnement contenant des outils pour
|
||||||
faciliter le développement de projet.
|
faciliter le développement de projet.
|
||||||
|
|
||||||
Pour activer un `devshells` il suffit d'exécuter la commande :
|
Pour activer un `devshell` il suffit d'exécuter la commande :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ nix develop
|
$ nix develop
|
||||||
```
|
```
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{ pkgs, agenix }:
|
{ pkgs, agenix }:
|
||||||
|
|
||||||
pkgs.mkShell {
|
pkgs.mkShell {
|
||||||
name = "nix";
|
name = "aurore";
|
||||||
|
|
||||||
packages = [
|
packages = [
|
||||||
agenix.packages.x86_64-linux.default
|
agenix.packages.x86_64-linux.default
|
||||||
|
|
|
@ -53,6 +53,7 @@
|
||||||
++ defaultConfig;
|
++ defaultConfig;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
# VL: Peut-être avoir de l'auto-discovery: On a beaucoup trop de machines
|
||||||
jitsi = nixosSystem {
|
jitsi = nixosSystem {
|
||||||
specialArgs = inputs;
|
specialArgs = inputs;
|
||||||
modules = [
|
modules = [
|
||||||
|
@ -62,6 +63,7 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
perSystem = { config, pkgs, system, ... }:
|
perSystem = { config, pkgs, system, ... }:
|
||||||
{
|
{
|
||||||
devShells = {
|
devShells = {
|
||||||
|
|
|
@ -10,12 +10,14 @@
|
||||||
|
|
||||||
systemd.network = {
|
systemd.network = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
|
||||||
links = {
|
links = {
|
||||||
"10-pub" = {
|
"10-pub" = {
|
||||||
matchConfig.MACAddress = "ae:ae:ae:74:db:e1";
|
matchConfig.MACAddress = "ae:ae:ae:74:db:e1";
|
||||||
linkConfig.Name = "pub";
|
linkConfig.Name = "pub";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
networks = {
|
networks = {
|
||||||
"10-pub" = {
|
"10-pub" = {
|
||||||
domains = [
|
domains = [
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Common
|
# Common
|
||||||
|
|
||||||
Ce répertoire contient l'ensemble des fichiers de configurations qui sont
|
Ce répertoire contient l'ensemble des fichiers de configuration qui sont communs
|
||||||
communs à toutes les machines (physiques et virtuelles).
|
à toutes les machines (physiques et virtuelles).
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
mode = "400";
|
mode = "400";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
services.openssh = {
|
services.openssh = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
|
||||||
|
@ -71,8 +72,8 @@
|
||||||
"-l INFO"
|
"-l INFO"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
users.users.root.openssh.authorizedKeys.keys = [
|
users.users.root.openssh.authorizedKeys.keys = [
|
||||||
"cert-authority,no-touch-required,principals=\"any,newcomer,${config.networking.fqdn}\" ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBIpT7d7WeR88bs53KkNkZNOzkPJ7CQ5Ui6Wl9LXzAjjIdH+hKJieBMHrKew7+kzxGYaTqXWF1fQWsACG6aniy7VZpsdgTaNw7qr9frGfmo950V7IlU6w1HRc5c+3oVBWpg=="
|
"cert-authority,no-touch-required,principals=\"any,newcomer,${config.networking.fqdn}\" ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBIpT7d7WeR88bs53KkNkZNOzkPJ7CQ5Ui6Wl9LXzAjjIdH+hKJieBMHrKew7+kzxGYaTqXWF1fQWsACG6aniy7VZpsdgTaNw7qr9frGfmo950V7IlU6w1HRc5c+3oVBWpg=="
|
||||||
];
|
];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# VM
|
# VM
|
||||||
|
|
||||||
Ce répertoire contient l'ensemble des fichiers de configurations qui sont
|
Ce répertoire contient l'ensemble des fichiers de configuration qui sont communs
|
||||||
communs aux à toutes les VM.
|
aux à toutes les VM.
|
||||||
|
|
|
@ -1,18 +1,20 @@
|
||||||
# Agenix
|
# Agenix
|
||||||
|
|
||||||
Agenix est un outil permettant d'inclure des secrets dans une configuration
|
Agenix est un outil permettant d'inclure des secrets dans une configuration
|
||||||
NixOS et notamment de ne pas les copier les secrets dans `/nix/store` qui est
|
NixOS et notamment de ne pas les copier les secrets dans `/nix/store`, qui est
|
||||||
visible par tout le monde (dit "world readable"), c'est-à-dire par tout les
|
visible par tout le monde (dit "_world readable_"), c'est-à-dire par tous les
|
||||||
processus et tout les utilisateur⋅ices.
|
processus et tous les utilisateur⋅ices.
|
||||||
|
|
||||||
Pour plus d'information sur agenix, veuillez vous réferer à la [documentation
|
Pour plus d'informations sur agenix, veuillez vous référer à la [documentation
|
||||||
officielle](https://github.com/ryantm/agenix)
|
officielle](https://github.com/ryantm/agenix)
|
||||||
|
|
||||||
|
|
||||||
## Pré-requis
|
## Pré-requis
|
||||||
|
|
||||||
La présente documentation présuppose que l'ordinateur exécutant les commandes
|
La présente documentation présuppose que l'ordinateur exécutant les commandes
|
||||||
possède NixOS ou le gestionnaire de paquet [nix](nixos.org/download/).
|
possède NixOS ou le gestionnaire de paquet [nix](nixos.org/download/).
|
||||||
|
|
||||||
|
|
||||||
## Fonctionnement
|
## Fonctionnement
|
||||||
|
|
||||||
### Génération des clés de (dé)chiffrement
|
### Génération des clés de (dé)chiffrement
|
||||||
|
@ -25,7 +27,6 @@ indiquer à agenix.
|
||||||
|
|
||||||
Pour un⋅e utilisateur⋅ice, il convient de générer une clé ssh (ed25519) avec
|
Pour un⋅e utilisateur⋅ice, il convient de générer une clé ssh (ed25519) avec
|
||||||
la commande :
|
la commande :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ ssh-keygen -t ed25519
|
$ ssh-keygen -t ed25519
|
||||||
```
|
```
|
||||||
|
@ -35,11 +36,9 @@ l'emplacement le cas échéant). Rappelez-vous bien de la localisation car elle
|
||||||
sera nécessaire par la suite.
|
sera nécessaire par la suite.
|
||||||
|
|
||||||
Remarque :
|
Remarque :
|
||||||
|
> Pour des raisons de préférence personnelle, il peut être préférable de ne pas
|
||||||
> Pour des raisons de préférence personnelle, il peut être préféré de ne pas
|
|
||||||
> mettre le nom par défaut (`<username>@<host>`). Il convient alors d'utiliser
|
> mettre le nom par défaut (`<username>@<host>`). Il convient alors d'utiliser
|
||||||
> la commande suivante :
|
> la commande suivante :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ ssh-keygen -t ed25519 -C <quelque>@<chose>
|
$ ssh-keygen -t ed25519 -C <quelque>@<chose>
|
||||||
```
|
```
|
||||||
|
@ -47,32 +46,32 @@ $ ssh-keygen -t ed25519 -C <quelque>@<chose>
|
||||||
#### Machines
|
#### Machines
|
||||||
|
|
||||||
Pour une machine, les clés ssh sont automatiquement générées lors de
|
Pour une machine, les clés ssh sont automatiquement générées lors de
|
||||||
l'installation, et la clé publique se trouvent (généralement) dans
|
l'installation, et la clé publique se trouve (généralement) dans
|
||||||
`/etc/ssh/ssh_host_ed25519_key.pub`.
|
`/etc/ssh/ssh_host_ed25519_key.pub`.
|
||||||
|
|
||||||
|
|
||||||
### Ajout des clés et rechiffrement
|
### Ajout des clés et rechiffrement
|
||||||
|
|
||||||
Une fois les clés générés, il faut alors les ajouter dans le fichier `secrets`
|
Une fois les clés générées, il faut alors les ajouter dans le fichier `secrets`
|
||||||
qui se trouve à la racine du projet.
|
qui se trouve à la racine de ce projet.
|
||||||
|
|
||||||
:warning: ATTENTION :warning:
|
:warning: ATTENTION :warning:
|
||||||
|
|
||||||
> Seule la clé publique doit être ajouté et elle est identifiable au fait que
|
> Seule la clé publique doit être ajoutée, et elle est identifiable au fait que
|
||||||
> le fichier se termine par `.pub`.
|
> le fichier se termine par `.pub`.
|
||||||
|
|
||||||
Une fois ajouter, il faut alors que quelqu'un ayant les secrets chiffrés pour
|
Une fois ajoutée, il faut alors que quelqu'un ayant les secrets chiffrés pour
|
||||||
sa clé ssh rechiffre les secrets pour votre clé. Cela se fait avec les
|
sa clé ssh rechiffre les secrets pour votre clé. Cela se fait avec les
|
||||||
commandes :
|
commandes :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ nix develop
|
$ nix develop
|
||||||
$ agenir -r # -r ou --rekey
|
$ agenix -r # -r ou --rekey
|
||||||
```
|
```
|
||||||
|
|
||||||
Remarque :
|
Remarque :
|
||||||
|
> Ces commandes doivent également être effectuées lorsqu'une clé est changée ou
|
||||||
|
> supprimée.
|
||||||
|
|
||||||
> Ces commandes fonctionnent également lors du retrait de clé ou lors de
|
|
||||||
> changement.
|
|
||||||
|
|
||||||
### Créer et éditer un fichier
|
### Créer et éditer un fichier
|
||||||
|
|
||||||
|
@ -85,14 +84,15 @@ $ agenix -e <chemin/du/fichier>.age -i <chemin/de/la/clé>
|
||||||
|
|
||||||
Pour créer un nouveau fichier, il faut préalablement l'ajouter dans
|
Pour créer un nouveau fichier, il faut préalablement l'ajouter dans
|
||||||
`secrets.nix`. Il est alors important d'ajouter les clés pour lesquelles le
|
`secrets.nix`. Il est alors important d'ajouter les clés pour lesquelles le
|
||||||
fichier doit être chiffré. Il est préférable de respecter _leitmotiv_ le
|
fichier doit être chiffré. Il est préférable de respecter le _leitmotiv_
|
||||||
suivant : seul les machines et personnes ayant besoin du secret doivent avoir
|
suivant : seuls les machines et personnes ayant besoin du secret doivent avoir
|
||||||
accès audit secret.
|
accès audit secret.
|
||||||
|
|
||||||
Une fois cela effectué, la commande pour créer le fichier est la même que celle
|
Une fois cela effectué, la commande pour créer le fichier est la même que celle
|
||||||
pour les éditer (excepté le `-i` puisque qu'il n'y a pas besoin de déchiffrer
|
pour les éditer (excepté le `-i` puisque qu'il n'y a pas besoin de déchiffrer
|
||||||
le secrets).
|
le secrets).
|
||||||
|
|
||||||
|
|
||||||
### Utiliser agenix dans une configuration
|
### Utiliser agenix dans une configuration
|
||||||
|
|
||||||
Pour utiliser agenix dans une configuration, il faut commencer par écrire le
|
Pour utiliser agenix dans une configuration, il faut commencer par écrire le
|
||||||
|
|
Loading…
Reference in a new issue