Durcissement du système
Secure Boot, chiffrement LUKS2 (TPM2, PIN, redémarrage à distance), secrets, isolation, pare-feu, SSH, mises à jour, vulnérabilités, journaux et horodatage.
L'essentiel
- Référentiel : recommandations de configuration d'un système GNU/Linux de l'ANSSI 1 et guide d'hygiène 2. Le dossier en retient un sous-ensemble adapté à une machine unique administrée à distance.
- Chiffrement disque complet en LUKS2. Le choix du mode de déverrouillage (TPM2 seul, TPM2 + PIN, mot de passe) conditionne la possibilité de redémarrer la Box à distance : non tranché.
- Aucun service n'écoute sur le réseau hormis le reverse proxy (443) et SSH (via VPN). Tout le reste est lié à localhost ou au réseau interne des containers.
- Mises à jour de sécurité automatiques pour l'OS ; mises à jour applicatives planifiées dans une fenêtre de maintenance avec possibilité de retour arrière (snapshot).
- Journaux conservés entre 6 mois et 1 an (recommandation CNIL) 9, protégés en intégrité, horodatés par NTP.
Toutes les commandes et paramètres ci-dessous sont des propositions à valider sur la machine cible ; la distribution n'est pas encore choisie (voir Linux).
Démarrage : Secure Boot et UEFI
| Mesure | Détail | Statut |
|---|---|---|
| Secure Boot activé | Empêche le démarrage d'un chargeur ou d'un noyau non signé (protection contre un « evil maid » simple). Les distributions candidates (Ubuntu, Fedora) démarrent avec Secure Boot par défaut ; les modules noyau tiers (ROCm, pilotes hors arbre) doivent être signés ou évités. | À tester avec la pile AMD retenue |
| Mot de passe administrateur UEFI | Empêche de désactiver Secure Boot ou de changer l'ordre de démarrage. | Hypothèse |
| Démarrage sur USB/réseau désactivé | Ordre de démarrage verrouillé sur le SSD interne. | Hypothèse |
| Mesures TPM2 | Si le déverrouillage LUKS est lié au TPM2, les registres PCR permettent de refuser le déverrouillage si le chargeur ou le noyau a changé. | À tester |
Chiffrement du disque
LUKS2
Le chiffrement complet du disque système et du disque de données utilise LUKS2 via cryptsetup (GPL-2.0 ou ultérieure) 4. Choix proposés : chiffre AES-XTS 512 bits, dérivation Argon2id (défaut LUKS2), chiffrement de tout le disque et non d'un simple répertoire, y compris le swap.
Avec deux SSD en miroir (voir Sauvegardes), chaque SSD est chiffré séparément (LUKS sous mdadm ou Btrfs) ou le volume miroir est chiffré au-dessus : à trancher avec la question du RAID.
Mode de déverrouillage : la décision structurante
| Mode | Fonctionnement | Sécurité | Redémarrage à distance | Charge pour le client |
|---|---|---|---|---|
| Mot de passe au démarrage | Un opérateur saisit la phrase de passe au clavier (ou via une console distante) | Forte si la phrase est robuste | Impossible sans intervention (ou console IP, absente sur la machine candidate) | Une personne du cabinet doit connaître la phrase |
| TPM2 seul | Le TPM libère la clé si les mesures de démarrage (PCR) sont conformes | Protège contre le vol d'un SSD seul, pas contre le vol de la machine entière allumée ou démarrée par l'attaquant (qui obtient l'écran de login) | Oui, automatique | Aucune |
| TPM2 + PIN | Comme TPM2, plus un PIN saisi au démarrage | Forte : vol de la machine entière sans PIN = disque illisible | Non (PIN à saisir) | Une personne connaît le PIN |
| TPM2 + clé réseau (Tang/Clevis ou secret distant) | Le disque se déverrouille si un serveur du LAN répond | Correct : la machine hors du réseau du cabinet ne démarre pas | Oui, tant qu'elle est dans les locaux | Un second équipement à maintenir |
| Clé FIDO2 | Clé matérielle branchée au démarrage | Forte | Non | Clé physique à garder |
systemd-cryptenroll gère l'enrôlement TPM2, FIDO2, PKCS#11, PIN et clé de récupération sur un volume LUKS2 3. Deux points de sa documentation comptent ici : par défaut, sans option --tpm2-pcrs, l'enrôlement n'est lié à aucun PCR (il faut donc choisir explicitement les registres, par exemple ceux du chargeur et de l'état Secure Boot) ; et le « PIN » accepte tout caractère, pas seulement des chiffres 3.
Conséquences pratiques à documenter dans le contrat : qui connaît le PIN ou la phrase de passe, qui détient la clé de récupération, procédure de remplacement de carte mère (le TPM change, la clé de récupération est alors indispensable).
Chiffrement des sauvegardes
Les sauvegardes quittent le périmètre physique ; elles sont chiffrées avant de sortir de la Box, avec une clé distincte de la clé LUKS. restic 12 et BorgBackup chiffrent côté client avec authentification (voir Sauvegardes). La clé du dépôt est détenue par le client ; le prestataire n'y a pas accès sauf accord explicite documenté.
Gestion des secrets
| Approche | Avantages | Limites | Proposition |
|---|---|---|---|
Fichiers .env à côté des Compose | Simple, lisible | En clair sur disque (protégés par LUKS seulement), faciles à copier dans un dépôt Git par erreur | Acceptable en V1 si permissions 600, propriétaire dédié, exclus de Git, disque chiffré |
| sops + age | Secrets chiffrés dans le dépôt de configuration ; déchiffrés au déploiement | Une clé age à protéger ; un outil de plus | Recommandé dès que la configuration est versionnée |
| Docker/Podman secrets | Montés en mémoire dans le container | Portée limitée à Compose/Swarm | Complément utile |
| HashiCorp Vault / OpenBao | Rotation, audit, politique fine | Surdimensionné pour une machine unique | Non retenu en V1 |
Règles quelles que soient les approches : jamais de secret dans une image Docker, dans un journal ou dans le prompt système ; rotation à chaque départ d'un administrateur ; inventaire des secrets tenu à jour (quoi, où, qui, dernière rotation).
Mots de passe : la CNIL exige un niveau minimal équivalent à 80 bits d'entropie sans mesure complémentaire (délibération 2022-100) 10. Les mots de passe des comptes utilisateurs et administrateurs sont générés (gestionnaire de mots de passe), jamais choisis, et doublés par un second facteur.
Isolation des services
| Mesure | Détail | Statut |
|---|---|---|
| Un utilisateur système par service | llama, rag, webui, backup sans shell, sans sudo | Hypothèse |
| Containers rootless | Docker en mode rootless exécute le démon et les containers sans root ; prérequis newuidmap/newgidmap et plages subuid/subgid 5. Podman offre l'équivalent nativement. Limites connues : ports privilégiés, certains périphériques, AppArmor selon distribution. | À tester : accès GPU (/dev/kfd, /dev/dri) depuis un container rootless non vérifié sur la machine cible |
Pas de --privileged, pas de socket Docker monté | Le socket Docker équivaut à root sur l'hôte | Hypothèse |
| Système de fichiers en lecture seule dans les containers | read_only: true, volumes explicites | Hypothèse |
| Capacités Linux minimales | cap_drop: [ALL] puis ajout au cas par cas | Hypothèse |
| AppArmor (Ubuntu) ou SELinux (Fedora) en mode enforcing | Ne pas désactiver « pour que ça marche » ; profils par défaut des containers | Hypothèse |
| Réseau interne des containers | Seul le reverse proxy publie un port ; llama-server, base vectorielle et base SQL ne sont joignables que depuis le réseau interne | Hypothèse |
| Référence | CIS Docker Benchmark (version 1.8.0 au moment de la consultation) 6 | À parcourir avant la V1 |
Pare-feu
Politique par défaut : tout entrant refusé, tout sortant limité. nftables est le successeur d'iptables dans le noyau Linux 7 ; ufw ou firewalld sont des interfaces acceptables si l'équipe préfère, tant que la politique reste identique.
| Sens | Port | Service | Depuis / vers | Note |
|---|---|---|---|---|
| Entrant | 443/tcp | Reverse proxy (interface, API) | LAN du cabinet (ou VLAN dédié) | Seul port applicatif |
| Entrant | 22/tcp | SSH | Interface VPN uniquement | Jamais depuis le LAN entier ni Internet |
| Entrant | UDP WireGuard | VPN | Selon le scénario réseau (souvent sortant seulement avec Tailscale/NetBird) | Voir Réseau |
| Sortant | 53, 123 | DNS, NTP | Résolveur interne, serveurs de temps | Nécessaires |
| Sortant | 443/tcp | Mises à jour, images, modèles, dépôt de sauvegarde | Liste de domaines restreinte si possible | Journaliser |
| Sortant | 445/tcp | SMB vers le NAS | NAS uniquement | Lecture seule côté compte |
| Tout le reste | — | — | — | Refusé et journalisé |
Docker manipule lui-même les règles de pare-feu et peut contourner ufw : ne publier aucun port sur 0.0.0.0 hormis le reverse proxy, et vérifier le résultat effectif avec nft list ruleset et un scan depuis un autre poste.
SSH
- Authentification par clé uniquement (
PasswordAuthentication no), clés ed25519, une clé par administrateur nominatif. PermitRootLogin no; élévation parsudojournalisée.- Second facteur pour SSH : soit le VPN lui-même (accès nominatif avec MFA à l'IdP du VPN), soit un module TOTP/FIDO2 sur SSH. Proposition : VPN avec MFA + clé SSH, ce qui donne deux facteurs indépendants.
- Écoute limitée à l'interface VPN.
- Bannière légale,
MaxAuthTries 3,ClientAliveIntervalpour fermer les sessions inactives. - Journal des sessions administrateur exploitable a posteriori (voir Accès prestataire).
Mises à jour
| Composant | Politique proposée | Retour arrière |
|---|---|---|
| Système (paquets de sécurité) | Automatique, quotidien (unattended-upgrades ou dnf-automatic) ; redémarrage seulement dans la fenêtre de maintenance | Snapshot du système avant redémarrage |
| Noyau et pilotes GPU | Fenêtre de maintenance mensuelle, après test sur la machine de laboratoire | Conserver le noyau précédent au démarrage ; snapshot |
| Images Docker (interface, RAG, runtime) | Versions épinglées ; mise à jour mensuelle ou sur CVE critique ; test sur le laboratoire | Tag précédent conservé ; snapshot des volumes |
| Modèles | Jamais automatique ; changement = décision documentée | Ancien fichier conservé jusqu'à validation |
| Firmware UEFI | Sur alerte du constructeur ; attention au TPM (clé de récupération à portée) | Selon constructeur |
Fenêtre de maintenance type : un soir par mois, annoncée au cabinet, avec télémaintenance ouverte pour la durée de l'intervention seulement.
Gestion des vulnérabilités
- Veille : abonnements aux avis de sécurité de la distribution, de l'interface web retenue, du runtime d'inférence et de la base vectorielle. L'historique 2026 des CVE d'Open WebUI (contournement de permissions RAG) montre que cette veille n'est pas optionnelle (voir Interface).
- Scan des images : Trivy scanne images, systèmes de fichiers et dépôts, détecte vulnérabilités, mauvaises configurations et secrets, et génère un SBOM 8. Fréquence proposée : à chaque mise à jour et une fois par mois.
- SBOM léger : liste des images (nom, tag, digest), des paquets système principaux et des modèles (nom, somme de contrôle), tenue dans le dépôt de configuration. C'est aussi une demande de la CNIL pour les systèmes d'IA (nomenclature logicielle) 11 et de l'ANSSI (chaîne d'approvisionnement).
- Scan externe : une fois par trimestre, un scan de ports depuis l'extérieur du cabinet pour vérifier qu'aucun port n'est exposé.
Journaux
| Sujet | Proposition |
|---|---|
| Collecte | journald pour le système et les containers ; journaux applicatifs (interface, RAG) en JSON vers journald ou fichiers dédiés |
| Ce qui est journalisé | Authentifications (succès/échec), actions d'administration (sudo, sessions SSH, modifications de configuration), accès aux documents et requêtes RAG (utilisateur, horodatage, dossiers filtrés, identifiants de documents retournés), erreurs, événements de sécurité (pare-feu, échecs MFA) |
| Ce qui n'est pas journalisé par défaut | Le texte intégral des questions et des réponses : c'est une donnée sensible en soi. Option activable par le client après analyse RGPD. |
| Durée | 6 mois à 1 an sur période glissante (délibération CNIL 2021-122) 9 ; proposition : 12 mois pour les journaux d'accès et d'administration, 6 mois pour les journaux techniques |
| Protection | Répertoire dédié, accès restreint au rôle audit, rotation par taille et date, copie quotidienne vers un emplacement en ajout seul (sauvegarde ou collecteur) pour résister à une altération locale |
| Centralisation | Une seule Box : pas de SIEM. Une copie hors machine des journaux d'accès et d'administration (dans la sauvegarde chiffrée) suffit en V1. |
| Information des utilisateurs | La CNIL demande d'informer les utilisateurs de la journalisation : mention dans la charte d'utilisation. |
Horodatage et temps
Des journaux non horodatés de manière fiable sont inexploitables en cas d'incident. NTP (chrony ou systemd-timesyncd) vers des serveurs de temps de confiance, ou vers le serveur de temps interne du cabinet s'il existe ; vérification de la dérive dans le monitoring. Fuseau horaire explicite (Europe/Paris) et journaux en UTC ou avec décalage indiqué.
Ce que ce durcissement ne fait pas
- Il ne protège pas contre un administrateur légitime malveillant : c'est le rôle du contrat, du journal inaltérable et de la séparation des clés.
- Il ne compense pas un poste utilisateur compromis : la session de l'utilisateur est alors utilisable par l'attaquant, avec les droits de l'utilisateur.
- Il ne rend pas la Box inviolable : il rend chaque étape coûteuse et visible.
Questions ouvertes
Ce qu'il reste à tester
- Exercice d'incident : ransomware sur un poste du cabinetUn ransomware exécuté sur un poste utilisateur ayant accès au partage documentaire ne peut ni chiffrer les données de la Box (montage en lecture seule), ni altérer les sauvegardes (dépôt en ajout seul ou hors de portée), et la procédure d'incident permet une reprise sous 2 jours ouvrés avec une notification CNIL préparée dans les 72 heures.À tester
- Redémarrage à distance avec disque chiffré LUKS2 et TPM2Avec systemd-cryptenroll et un enrôlement TPM2 lié aux PCR du démarrage sécurisé, la Box redémarre sans saisie de mot de passe après un redémarrage ordinaire, refuse le déverrouillage automatique après une modification du chargeur ou de la désactivation de Secure Boot, et redevient déverrouillable avec la clé de récupération.À tester
- Scan de vulnérabilités des images Docker de la BoxLes images officielles de la pile retenue ne contiennent aucune vulnérabilité critique exploitable dans le contexte de la Box (services non exposés, réseau interne), et un scan mensuel automatisé avec Trivy plus un SBOM par image permettent de suivre les correctifs sans effort excessif.À tester
- Test de fuite de permissions du RAG (« l'avocat B ne voit jamais A »)Avec un filtre dossier_id calculé côté serveur et imposé par le moteur (RLS PostgreSQL ou JWT Qdrant), aucun chunk ni aucune réponse ne contient un canari hors de la portée de l'utilisateur, même lorsque la barrière applicative est désactivée.À tester
- Test de restauration complète sur machine viergeUne Box complète (système, configuration, base d'utilisateurs et permissions, index, journaux) peut être reconstruite sur une machine vierge en moins d'un jour ouvré à partir de la sauvegarde hors site chiffrée et des clés sous séquestre, sans intervention sur la Box d'origine.À tester
- Valider l'installation reproductibleUne personne compétente en administration Linux mais sans connaissance préalable du projet réinstalle la Box en moins d'une demi-journée à partir de la page Installation et du dépôt de configuration, et obtient le même résultat à la checklist de validation que l'installation initiale.À tester
Sources
- 1ANSSI — Recommandations de configuration d'un système GNU/Linux (v2.0)Documentation officielleFiabilité hauteANSSI · publié 2019-02-22 · consulté le 16 sept. 2026 · fiche source
- 2ANSSI — Guide d'hygiène informatique (42 mesures)Documentation officielleFiabilité hauteANSSI · publié Non daté (page maintenue) · consulté le 16 sept. 2026 · fiche source
- 3systemd-cryptenroll(1) — page de manuelDocumentation officielleFiabilité hautesystemd (miroir man7.org) · publié 2026 · consulté le 16 sept. 2026 · fiche source
- 4cryptsetup / LUKS — dépôt officielGitHubFiabilité hauteProjet cryptsetup · publié 2026 · consulté le 16 sept. 2026 · fiche source
- 5Docker — Run the Docker daemon as a non-root user (Rootless mode)Documentation officielleFiabilité hauteDocker · publié 2026 · consulté le 16 sept. 2026 · fiche source
- 6CIS Docker BenchmarkDocumentation officielleFiabilité hauteCenter for Internet Security · publié version 1.8.0 (date non affichée) · consulté le 16 sept. 2026 · fiche source
- 7nftables — wiki officielDocumentation officielleFiabilité hauteProjet Netfilter · publié 2026 · consulté le 16 sept. 2026 · fiche source
- 8Trivy — dépôt officiel (aquasecurity/trivy)GitHubFiabilité hauteAqua Security · publié 2026 · consulté le 16 sept. 2026 · fiche source
- 9CNIL — Délibération n° 2021-122 du 14 octobre 2021 (recommandation relative à la journalisation)Documentation juridiqueFiabilité hauteCNIL / Légifrance · publié 2021-10-14 · consulté le 16 sept. 2026 · fiche source
- 10Délibération CNIL n° 2022-100 — recommandation relative aux mots de passeDocumentation juridiqueFiabilité hauteCNIL / Légifrance · publié 21 juillet 2022 · consulté le 16 sept. 2026 · fiche source
- 11CNIL — Guide de la sécurité des données personnelles, édition 2024Documentation officielleFiabilité hauteCNIL · publié 26 mars 2024 (PDF mis à jour 2026-05, contenu non vérifié) · consulté le 16 sept. 2026 · fiche source
- 12restic — dépôt officielGitHubFiabilité hauteProjet restic · publié 2026 · consulté le 16 sept. 2026 · fiche source