docs(adr): constate que la machine ENI est un conteneur LXC, LUKS y est impossible

La garde de scripts/coffre-luks.sh refuse un conteneur LXC ou l'absence de device-mapper.
L'ADR 0020, 10-infra.md et la vue d'ensemble disent ce qui est en place (SSE-C des archives)
et ce qui relève de l'hôte Proxmox (chiffrement du disque du conteneur).
This commit is contained in:
Johan LEROY
2026-09-24 10:54:06 +02:00
parent 7730f184e7
commit f011fce84e
6 changed files with 29 additions and 9 deletions
@@ -39,8 +39,7 @@ sans shell : la garde sur les secrets vit dans le `Makefile` (`garage-garde`, ap
**Nœud unique assumé.** `replication_factor = 1` et moteur `sqlite`, avec un instantané des **Nœud unique assumé.** `replication_factor = 1` et moteur `sqlite`, avec un instantané des
métadonnées toutes les six heures. La documentation de Garage réserve ce facteur aux métadonnées toutes les six heures. La documentation de Garage réserve ce facteur aux
déploiements de test : ici la machine est unique, la redondance n'existe pour aucun autre service, déploiements de test : ici la machine est unique, la redondance n'existe pour aucun autre service,
et le coffre LUKS de l'[ADR 0020](0020-chiffrement-au-repos-coffre-luks-et-sse-c.md) porte les et le chiffrement au repos est traité à part ([ADR 0020](0020-chiffrement-au-repos-coffre-luks-et-sse-c.md)). LMDB, le moteur par défaut, se corrompt à l'arrêt brutal et rien ne le reconstruirait.
volumes. LMDB, le moteur par défaut, se corrompt à l'arrêt brutal et rien ne le reconstruirait.
**La rétention de `reading` est un traitement du backend, ordonnancé par Airflow.** Le DAG **La rétention de `reading` est un traitement du backend, ordonnancé par Airflow.** Le DAG
`retention` lance chaque nuit `app.etl.reading_retention` ([ADR 0008](0008-airflow-execute-le-code-du-backend.md)), `retention` lance chaque nuit `app.etl.reading_retention` ([ADR 0008](0008-airflow-execute-le-code-du-backend.md)),
@@ -22,6 +22,17 @@ console au démarrage : tout redémarrage doit aboutir sans saisie.
## Décision ## Décision
**Constat du 24/09, qui borne tout ce qui suit.** La machine `eadl-2025-nantes-g3` n'est pas une
machine virtuelle mais un conteneur LXC Ubuntu 24.04 sur un hôte Proxmox (`systemd-detect-virt`
répond `lxc`, aucun `/dev/mapper/control`, aucun périphérique loop, pas de `/dev/fuse`, module
`dm_crypt` inaccessible). LUKS, comme tout chiffrement au niveau bloc ou FUSE, y est impossible.
Le chiffrement au repos du disque de ce conteneur ne peut se faire que sur l'hôte Proxmox
(volume LUKS ou ZFS chiffré sous le conteneur), par l'administrateur de l'école : la demande
lui est adressée, et jusqu'à sa réponse la base et les métadonnées Garage sont en clair sur ce
disque. `scripts/coffre-luks.sh` détecte ce cas et refuse de démarrer. Ce qui suit reste la
décision pour toute machine où le device-mapper est disponible (la cible k3s de `10-infra.md`,
ou une vraie VM), et le SSE-C des archives est en place dès aujourd'hui.
**Un coffre LUKS2 sous tous les volumes Docker, posé par `scripts/coffre-luks.sh`.** **Un coffre LUKS2 sous tous les volumes Docker, posé par `scripts/coffre-luks.sh`.**
- Le coffre est un **fichier image creux** (`/srv/enervision/coffre.img`, 30 Go par défaut) - Le coffre est un **fichier image creux** (`/srv/enervision/coffre.img`, 30 Go par défaut)
+5 -4
View File
@@ -141,10 +141,11 @@ consolidée.
Argon2id, RBAC à trois rôles. Détail dans [20-backend.md](20-backend.md), décisions dans les Argon2id, RBAC à trois rôles. Détail dans [20-backend.md](20-backend.md), décisions dans les
[ADR 0002](../adr/0002-authentification-jwt-et-refresh-opaque.md) et [ADR 0002](../adr/0002-authentification-jwt-et-refresh-opaque.md) et
[0003](../adr/0003-autorisation-rbac-a-trois-roles.md). [0003](../adr/0003-autorisation-rbac-a-trois-roles.md).
- **Chiffrement au repos.** Sur la VM, tous les volumes Docker (base, Garage, Airflow, - **Chiffrement au repos.** Les archives de mesures déposées sur Garage sont chiffrées par clé
supervision) vivent dans un coffre LUKS2 dont Docker exige le montage pour démarrer ; les client (SSE-C). Le coffre LUKS des volumes Docker (`scripts/coffre-luks.sh`) est prêt pour une
archives de mesures déposées sur Garage sont en plus chiffrées par clé client (SSE-C). Ce que vraie VM, mais la machine ENI est un conteneur LXC sans device-mapper : le chiffrement de son
cela protège et ne protège pas : [ADR 0020](../adr/0020-chiffrement-au-repos-coffre-luks-et-sse-c.md). disque relève de l'hôte Proxmox, demandé à l'école. Ce qui est couvert et ce qui ne l'est pas :
[ADR 0020](../adr/0020-chiffrement-au-repos-coffre-luks-et-sse-c.md).
- **Interdire par défaut.** Toute route exige un jeton, sauf quatre exceptions listées dans un - **Interdire par défaut.** Toute route exige un jeton, sauf quatre exceptions listées dans un
fichier de test qui interroge réellement chaque route sans identifiant. fichier de test qui interroge réellement chaque route sans identifiant.
- **Révocation immédiate.** Le compte est relu en base à chaque requête : une désactivation ou un - **Révocation immédiate.** Le compte est relu en base à chaque requête : une désactivation ou un
+5 -1
View File
@@ -302,7 +302,11 @@ l'`apply` n'est pas rejouable sans qu'un administrateur du dépôt en crée un n
### Coffre LUKS des volumes Docker (issue #42) ### Coffre LUKS des volumes Docker (issue #42)
Statut : `En cours`, script écrit, jamais encore joué sur la VM. Décision et modèle de menace dans Statut : `Bloqué par la plateforme`. La machine ENI est un conteneur LXC sur Proxmox, sans
device-mapper ni loop : `scripts/coffre-luks.sh` s'y arrête sur sa garde, et le chiffrement du
disque de ce conteneur relève de l'hôte Proxmox, demandé à l'administrateur de l'école. Ce qui
est en place aujourd'hui : le SSE-C des archives déposées sur Garage. Le runbook ci-dessous vaut
pour une vraie VM (cible k3s, ou remplacement du conteneur). Décision et modèle de menace dans
l'[ADR 0020](../adr/0020-chiffrement-au-repos-coffre-luks-et-sse-c.md). Un fichier image LUKS2 l'[ADR 0020](../adr/0020-chiffrement-au-repos-coffre-luks-et-sse-c.md). Un fichier image LUKS2
(`/srv/enervision/coffre.img`, clé `/root/enervision-coffre.key`) est monté sur (`/srv/enervision/coffre.img`, clé `/root/enervision-coffre.key`) est monté sur
`/srv/enervision/coffre`, et `/var/lib/docker/volumes` est bind-monté depuis ce coffre : les `/srv/enervision/coffre`, et `/var/lib/docker/volumes` est bind-monté depuis ce coffre : les
+2 -2
View File
@@ -11,8 +11,8 @@ Stockage objet S3 de la stack, un conteneur par projet Compose (ADR 0019). Il ne
- Ports, sur `127.0.0.1` seulement : `GARAGE_S3_PORT` (3900) pour l'API S3, `GARAGE_ADMIN_PORT` - Ports, sur `127.0.0.1` seulement : `GARAGE_S3_PORT` (3900) pour l'API S3, `GARAGE_ADMIN_PORT`
(3903) pour `/health` (sans jeton) et `/metrics` (jeton `GARAGE_METRICS_TOKEN`, scruté par (3903) pour `/health` (sans jeton) et `/metrics` (jeton `GARAGE_METRICS_TOKEN`, scruté par
Prometheus). Le RPC 3901 n'est pas publié. Prometheus). Le RPC 3901 n'est pas publié.
- Nœud unique, `replication_factor = 1`, moteur sqlite : aucune redondance, le coffre LUKS de la - Nœud unique, `replication_factor = 1`, moteur sqlite : aucune redondance, l'instantané des
VM (ADR 0020) et l'instantané des métadonnées toutes les six heures sont les seules protections. métadonnées toutes les six heures est la seule protection ; chiffrement au repos : ADR 0020.
```bash ```bash
docker compose exec garage /garage status docker compose exec garage /garage status
+5
View File
@@ -48,6 +48,11 @@ installer() {
verifier_prerequis() { verifier_prerequis() {
[[ "$(id -u)" -eq 0 ]] || erreur "à lancer en root" [[ "$(id -u)" -eq 0 ]] || erreur "à lancer en root"
# Constaté le 24/09 : la machine ENI est un conteneur LXC, sans device-mapper ni loop. LUKS y
# est impossible ; le chiffrement de son disque relève de l'hôte Proxmox (ADR 0020).
[[ "$(systemd-detect-virt --container 2>/dev/null || true)" != lxc ]] \
|| erreur "conteneur LXC : pas de device-mapper ni de loop, LUKS impossible ici ; le chiffrement du disque se fait sur l'hôte (ADR 0020)"
[[ -e /dev/mapper/control ]] || erreur "/dev/mapper/control absent : device-mapper indisponible, LUKS impossible ici"
[[ "$COFFRE_IMAGE" != /var/lib/docker/* ]] \ [[ "$COFFRE_IMAGE" != /var/lib/docker/* ]] \
|| erreur "l'image $COFFRE_IMAGE ne doit pas vivre sous /var/lib/docker, que le coffre recouvre" || erreur "l'image $COFFRE_IMAGE ne doit pas vivre sous /var/lib/docker, que le coffre recouvre"
installer cryptsetup || erreur "cryptsetup introuvable dans apt" installer cryptsetup || erreur "cryptsetup introuvable dans apt"