Aller au contenu

Construction de l'image

La borne est une image système complète, construite avec mkosi à partir des paquets Debian 13 (trixie). Tout s'exécute dans un conteneur Debian 13 (image/Dockerfile : mkosi, QEMU, OVMF) : l'ordinateur de construction n'a besoin que de Docker.

Warning

L'image et les jeux de signatures ne sont signés qu'avec des clés de développement. L'image de production n'a pas de jeu de signatures : la borne n'analyse rien tant qu'une clé de mise à jour des signatures n'a pas été insérée (voir Signatures). Voir les tâches de la phase 2 dans la feuille de route.

En bref

image/build.sh                     # borne hors ligne
image/build.sh --profile online    # borne en réseau : mises à jour en ligne, SIEM, NTP

L'image est image/mkosi.output/pandora-box.raw : écrivez-la sur le disque de la borne (Installation initiale), ou testez-la d'abord dans une machine virtuelle (Test avec QEMU).

Prérequis

Docker, environ 5 Go d'espace disque, un accès réseau (paquets Debian et wheels Python).

Sous Windows, construisez dans WSL à partir d'un clone dans le système de fichiers de WSL (pas sous /mnt/c), avec des fins de ligne LF : les fins de ligne Windows (CRLF) cassent la configuration de l'image, et USBGuard bloque alors tous les périphériques USB. image/build.sh refuse de construire à partir de fichiers en CRLF.

git config --global core.autocrlf input
git clone https://github.com/sourcentis/pandora-box.git

Avant la construction

L'image est en lecture seule : tout ce qui suit en fait partie, et le modifier implique de construire une nouvelle image, puis de l'installer comme une mise à jour.

Quoi Où
Configuration de la borne packaging/pandora-box.toml (voir Configuration)
Thème de l'interface image/theme/ (voir Interface)
Mode de l'écran video= sur la ligne de commande du noyau, image/mkosi.conf (voir Écran)
Écran tactile autorisé par USBGuard image/mkosi.extra/etc/usbguard/rules.conf (voir Périphériques USB)
Contrôleur de disque d'un autre ordinateur KernelModulesInitrdInclude= de image/mkosi.conf (voir Image noyau unifiée)
Autorités de certification du SIEM image/siem-ca.pem (voir SIEM)
Auth-Key abuse.ch, profil online image/credentials.toml (voir Profil online)
Serveurs NTP, profil online voir Heure

Clés

L'image est signée avec image/mkosi.key et image/mkosi.crt (systemd-boot, image noyau unifiée, hash racine dm-verity) : le firmware d'une borne ne démarre qu'une image signée avec cette clé. Elle fait confiance aux jeux de signatures, aux mises à jour de l'image et aux demandes de maintenance signés avec image/update.key : sa clé publique image/update.pem est installée dans l'image.

Quand elles n'existent pas, image/build.sh génère une paire de développement pour chacune, valable 10 ans, qui ne quitte jamais l'ordinateur de construction (ignorée par git). Conservez-les : une borne n'accepte que les mises à jour signées avec les clés de son image. Une borne ne doit faire confiance qu'aux clés de publication du projet, qui ne sont pas encore définies : elles seront gardées hors du dépôt, et mkosi peut signer avec une clé dans un jeton matériel (--secure-boot-key-source=provider:pkcs11).

Construction

image/build.sh                  # image de production
image/build.sh --profile online # image de production en réseau
image/build.sh --profile test   # image de test, pour la machine virtuelle uniquement

L'image est écrite dans image/mkosi.output/ : pandora-box.raw (ou pandora-box-test.raw, une image disque GPT), l'image noyau unifiée (.efi) et la liste des paquets installés (.manifest). La première construction prend quelques minutes ; les suivantes réutilisent les paquets installés (construction incrémentale de mkosi, en cache dans le volume Docker pandora-box-mkosi) et prennent moins d'une minute.

Le cache n'est pas reconstruit quand image/requirements.txt ou image/mkosi.prepare.chroot changent : reconstruisez-le avec image/build.sh -f (docker volume rm pandora-box-mkosi le supprime complètement).

La version de l'image est la date et l'heure de sa construction, en UTC, comme le numéro de série d'un jeu de signatures : 20261005143700 (--image-version=N la remplace). Elle figure dans /etc/os-release (IMAGE_VERSION), dans les étiquettes de ses partitions et dans le nom de son image noyau unifiée. Une mise à jour doit avoir une version plus récente que celle en cours.

Profil online

Sans profil, l'image n'a aucune configuration réseau. --profile online ajoute les mises à jour en ligne des signatures depuis leurs sources (voir Signatures) : systemd-networkd (DHCP sur le réseau filaire), systemd-resolved, systemd-timesyncd, freshclam, le timer pandora-box-update et un pare-feu qui ne laisse sortir que le service de mise à jour, l'export des journaux vers un SIEM (voir SIEM) et NTP (image/mkosi.profiles/online/). Son postinst.chroot active [updates] dans la configuration de la borne, et installe les identifiants de image/credentials.toml (hors de git) dans /etc/credstore.

cp image/credentials.toml.example image/credentials.toml   # puis l'Auth-Key abuse.ch
image/build.sh --profile online

Warning

Une image construite avec des identifiants ne doit pas être publiée : quiconque possède l'image ou le disque de la borne peut les lire.

Heure

L'horloge de la borne date ses journaux et ses rapports d'analyse, et décide si les certificats des serveurs de mise à jour et du SIEM sont valides. Une borne en ligne la synchronise avec systemd-timesyncd, à partir des serveurs NTP de NTP= dans image/mkosi.profiles/online/mkosi.extra/usr/lib/systemd/timesyncd.conf.d/50-pandora-box.conf (vide par défaut), sinon de ceux que fournit le serveur DHCP, sinon du pool Debian (FallbackNTP=). Pour utiliser les serveurs de l'organisation, indiquez-les là avant de construire l'image :

[Time]
NTP=ntp1.example.org ntp2.example.org

Seul systemd-timesyncd peut envoyer des requêtes NTP (UDP 123) à travers le pare-feu ; timedatectl timesync-status affiche le serveur utilisé. NTP n'est pas authentifié (timesyncd n'a pas NTS) : quelqu'un placé sur le chemin des requêtes peut décaler l'horloge, préférez donc des serveurs NTP du réseau local. Sans le profil, la borne garde l'heure de son horloge matérielle (UTC).

Dépendances

Les dépendances d'exécution sont figées avec leurs empreintes dans image/requirements.txt. Après un changement des dépendances dans pyproject.toml, régénérez-le avec image/lock-requirements.sh, puis reconstruisez le cache (image/build.sh -f).

Fichiers

Chemin Rôle
image/mkosi.conf Définition de l'image : Debian 13, x86_64, systemd-boot, image noyau unifiée (UKI), paquets
image/mkosi.repart/ Partitions : ESP, deux emplacements système (système de fichiers racine en lecture seule, son hash dm-verity et sa signature), partition de données
image/mkosi.images/initrd/ L'initrd : l'initrd par défaut de mkosi, qui redémarre au lieu d'ouvrir un shell de secours, sans les fichiers dont une racine en lecture seule n'a pas besoin
image/mkosi.prepare.chroot Dépendances d'exécution dans un environnement virtuel (/usr/lib/pandora-box), d'après image/requirements.txt (figées avec leurs empreintes)
image/mkosi.build.chroot Wheel de pandora-box, construite depuis le dépôt sans réseau
image/mkosi.postinst.chroot Installe pandora-box, sa configuration, son service systemd, ses fichiers tmpfiles et logrotate (packaging/), et les réglages de clamd
image/mkosi.extra/ Fichiers copiés dans l'image : presets systemd (unités activées et désactivées), /etc/fstab, agrandissement de la partition de données (/usr/lib/repart.d/), mises à jour A/B (/usr/lib/sysupdate.d/, évaluation du démarrage), politique USBGuard, réglages du noyau (sysctl.d), pare-feu (nftables.conf), bac à sable de clamd
image/mkosi.profiles/online/ Profil online
image/mkosi.profiles/test/ Profil de test, pour les tests en machine virtuelle uniquement
image/vm/ Tests en machine virtuelle : corpus, pilote QEMU, test automatisé
image/build.sh, image/vm.sh Construire et exécuter dans le conteneur
image/build-test.sh, image/package-update.sh Construire les images du test en machine virtuelle ; construire une mise à jour signée de l'image
image/maintenance-key.sh Préparer une clé de maintenance

Ce que contient l'image et comment elle est protégée : voir Fonctionnement de l'image.