From fddcca0e51befc36e6b789ac0b7b1dc5584e395b Mon Sep 17 00:00:00 2001 From: Damien Date: Wed, 9 Sep 2026 17:42:51 +0200 Subject: [PATCH] =?UTF-8?q?Comments:=20style=20plus=20concis=20(cal=C3=A9?= =?UTF-8?q?=20sur=20modules/anssi/,=20=C3=A9crit=20par=20des=20pros)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aucun changement fonctionnel -- juste les commentaires : essais de justification en plusieurs paragraphes remplacés par des notes courtes, type/quoi/pourquoi en une ou deux lignes. Corrige au passage un commentaire obsolète dans installer-base.nix qui décrivait encore l'usage de disko-install (abandonné depuis pour disko + nixos-install séparés). Co-Authored-By: Claude Sonnet 5 --- hosts/common/base.nix | 77 ++++++---------------- hosts/common/desktop.nix | 11 ++-- installer/install.sh | 123 +++++++++++++---------------------- installer/installer-base.nix | 49 +++++--------- modules/anssi/README.md | 7 +- 5 files changed, 87 insertions(+), 180 deletions(-) diff --git a/hosts/common/base.nix b/hosts/common/base.nix index 210bde1..79fba65 100644 --- a/hosts/common/base.nix +++ b/hosts/common/base.nix @@ -4,65 +4,36 @@ { imports = [ ../../modules/anssi ]; - # Toutes les machines de la flotte portent le même nom : pas - # d'identification individuelle pour l'instant (voir README du repo - # racine). À revoir plus tard via le numéro de série DMI si un vrai - # besoin d'identification apparaît. + # Nom uniforme, pas d'identification individuelle pour l'instant (voir + # README). À revoir via le numéro de série DMI si le besoin apparaît. networking.hostName = "Nixos_Fleet"; networking.networkmanager.enable = true; - # Firmware au maximum (wifi/Bluetooth/PCI en tout genre), pour coller à - # un parc de PC hétérogène et inconnu à l'avance -- même logique que - # Linux Mint, qui embarque les firmwares non-libres par défaut plutôt - # que de s'en tenir au strict libre. - # enableAllFirmware inclut déjà enableRedistributableFirmware (son - # défaut est `config.hardware.enableAllFirmware`, vérifié dans le - # source nixpkgs : nixos/modules/hardware/all-firmware.nix), donc pas - # besoin de déclarer les deux. Ce que enableAllFirmware ajoute EN PLUS - # du strict redistribuable (même fichier source) : - # - broadcom-bt-firmware (Bluetooth Broadcom, très répandu) - # - b43Firmware (wifi Broadcom BCM43xx) - # - xone-dongle-firmware, facetimehd-firmware - # Nécessite nixpkgs.config.allowUnfree = true (déjà réglé plus bas). - # hardware.wirelessRegulatoryDatabase s'active automatiquement dès que - # l'un des deux est vrai (même fichier source) -- pas besoin de le - # régler à la main. - # mkDefault : un profil peut désactiver au cas par cas. + # Couverture matérielle maximale (wifi/Bluetooth/PCI) sur un parc + # hétérogène inconnu à l'avance. Inclut enableRedistributableFirmware. hardware.enableAllFirmware = lib.mkDefault true; - # Durcissement : reprend le module ANSSI de SécurixOS (modules/anssi/, - # vendored ci-dessus), qui remplace/couvre déjà tous les sysctls qui - # étaient déclarés à la main sur le profil oreo (dmesg_restrict, - # kptr_restrict, yama.ptrace_scope, rp_filter, tcp_syncookies, - # protected_hardlinks/symlinks -- mêmes valeurs, vérifié règle par - # règle dans modules/anssi/kernel-options.nix : R9, R11, R12, R14). - # level "intermediary" : c'est le niveau que couvraient déjà TOUTES - # les valeurs qu'on avait mises à la main sur oreo -- rien de plus - # fort n'a été inventé ici. category "client" : ce sont des postes de - # travail, pas des serveurs (les règles actuellement implémentées sont - # toutes "category = base" donc ça ne change rien pour l'instant, mais - # c'est le bon réglage si Sécurix ajoute des règles catégorisées). + # Durcissement ANSSI (modules/anssi/, vendored depuis SécurixOS). + # level "intermediary" : couvre déjà tout ce qui était réglé à la main + # sur le profil oreo (R9/R11/R12/R14). category "client" : postes de + # travail, pas des serveurs. # - # ATTENTION : R12 force net.ipv4.ip_forward = 0. Sans impact ici (ce - # sont des postes clients), mais à ne SURTOUT PAS importer sur - # pxe-server/configuration.nix, qui a besoin l'inverse (voir son - # networking.nat) -- pxe-server n'importe pas ce fichier, donc ok. + # R12 force net.ipv4.ip_forward = 0 : sans impact sur des postes + # clients. Ne pas importer ce module sur pxe-server/configuration.nix + # (a besoin du forwarding inverse). security.anssi = { enable = true; level = "intermediary"; category = "client"; - # R8 (mitigations CPU) désactive l'hyperthreading via "mds=full,nosmt" - # -- impact perf trop lourd sur le matériel bas de gamme du parc (PC - # à 4 Go de RAM). On désactive donc la règle via le mécanisme d'exception - # prévu par le module lui-même (modules/anssi/options.nix), PAS en la - # contournant en silence. - exceptions.R8.rationale = "SMT (hyperthreading) volontairement conservé : impact perf trop lourd sur le parc (matériel bas de gamme, parfois 4 Go de RAM). Les autres mitigations de R8 sont réappliquées ci-dessous, à l'identique du texte source (modules/anssi/kernel-options.nix), sauf 'nosmt' remplacé par la valeur alternative documentée 'mds=full' (mitige MDS sans couper l'hyperthreading)."; + # R8 (mitigations CPU) coupe l'hyperthreading via "mds=full,nosmt" : + # trop coûteux sur le matériel bas de gamme du parc. Désactivé via + # exception plutôt que contourné en silence ; réappliqué ci-dessous + # sans le "nosmt". + exceptions.R8.rationale = "SMT conservé : impact perf trop lourd sur le parc (matériel bas de gamme, parfois 4 Go de RAM). Mitigations réappliquées ci-dessous sans 'nosmt'."; }; - # Reprise verbatim de modules/anssi/kernel-options.nix (règle R8), sauf - # "mds=full,nosmt" -> "mds=full" (voir exception R8 ci-dessus). Toutes - # les autres valeurs viennent du texte source, aucune n'est inventée. + # R8 (modules/anssi/kernel-options.nix), sauf mds=full,nosmt -> mds=full. boot.kernelParams = [ "l1tf=full,force" "page_poison=on" @@ -77,9 +48,8 @@ "rng_core.default_quality=500" ]; - # Pas (encore) couvert par le module ANSSI ci-dessus (R45 y est - # explicitement listé en exception : "AppArmor is partially supported - # on NixOS", modules/anssi/base.nix) -- repris tel quel du profil oreo. + # Pas couvert par le module ANSSI (R45 en exception : AppArmor + # partiellement supporté sur NixOS). systemd.coredump.enable = false; security.apparmor.packages = [ pkgs.apparmor-profiles ]; security.apparmor.enableCache = true; @@ -109,9 +79,7 @@ services.openssh.enable = true; networking.firewall.enable = true; - # Certains PC du parc n'ont que 4 Go de RAM (Cinnamon + Firefox + - # LibreOffice + VLC peuvent solliciter la mémoire) — swap compressé en - # RAM, marche identiquement quelle que soit la machine. + # Swap compressé en RAM : couvre le bas du parc (4 Go, desktop complet). zramSwap = { enable = true; memoryPercent = 50; @@ -129,10 +97,7 @@ options = "--delete-older-than 30d"; }; - # Convergence : chaque machine de la flotte tire ses mises à jour du - # même repo public, sans intervention humaine (pas de netrc nécessaire - # ici, contrairement au repo nixos_users). Voir README pour adapter - # l'URL réelle du repo. + # Convergence automatique depuis le repo public, sans netrc. system.autoUpgrade = { enable = true; dates = "daily"; diff --git a/hosts/common/desktop.nix b/hosts/common/desktop.nix index f21c030..8097f0f 100644 --- a/hosts/common/desktop.nix +++ b/hosts/common/desktop.nix @@ -15,19 +15,16 @@ warpinator ]; - # Fond d'écran par défaut (juste le logo NixOS, pas la galerie perso de - # nixos_cinnamon -- repo public, on n'y met que ce qui est nécessaire). - # Ce chemin (/etc/nixos) suppose la config installée là -- voir - # nixos_fleet/installer/install.sh (do_install copie le clone sur le - # disque cible après nixos-install). + # Fond d'écran par défaut (logo NixOS, pas la galerie perso de + # nixos_cinnamon). Suppose la config installée sur /etc/nixos (voir + # installer/install.sh). environment.etc."dconf/db/local.d/00-background".text = '' [org/cinnamon/desktop/background] picture-uri='file:///etc/nixos/hosts/common/wallpaper/Nix/13977413.png' ''; system.activationScripts.dconfUpdate.text = "${pkgs.dconf}/bin/dconf update"; - # Réglages de confidentialité génériques (pas de SearXNG/DNS personnels - # comme sur le poste perso — cette config est destinée à être publique). + # Confidentialité générique (pas de SearXNG/DNS perso : repo public). programs.firefox = { enable = true; languagePacks = [ "fr" ]; diff --git a/installer/install.sh b/installer/install.sh index f1afc7e..8b30aa3 100644 --- a/installer/install.sh +++ b/installer/install.sh @@ -1,47 +1,37 @@ -# Pas de shebang ici : ce fichier est injecté comme corps de script par -# pkgs.writeShellScriptBin dans installer-base.nix (qui ajoute juste -# `#!...`, PAS de mode strict — d'où le `set` explicite ci-dessous : sans -# lui, une erreur (ex: DNS indisponible) n'arrête pas le script, qui -# continuait jusqu'au reboot final en masquant l'échec. +# Injecté comme corps de script par pkgs.writeShellScriptBin +# (installer-base.nix) : pas de mode strict par défaut, d'où le `set` +# explicite ci-dessous. set -euo pipefail # Installeur unique pour les deux repos : -# - branche "flotte" -> nixos_fleet (public, jamais chiffré) +# - branche "flotte" -> nixos_fleet (public, jamais chiffré) # - branche "utilisateur nommé" -> nixos_users (privé, chiffrement au choix) -# Ce script ne contient aucun secret : le token du repo privé est saisi en -# direct, jamais stocké dans ce fichier ni dans un repo git. +# Le token du repo privé est saisi en direct, jamais stocké dans ce +# fichier ni dans un repo git. FLEET_REPO="git+https://gitea.miniclic.net/Damien/Nixos_Fleet.git" USERS_REPO_HOST="gitea.miniclic.net" USERS_REPO_PATH="Damien/Nixos_Users.git" # Le script se lance dès le login (autologin), potentiellement avant que -# NetworkManager ait fini de négocier le DHCP. On attend une route par -# défaut avant de continuer (jusqu'à 30s), plutôt que d'échouer trop tôt. +# NetworkManager ait fini de négocier le DHCP. echo "Attente du réseau..." for _ in $(seq 1 30); do ip route | grep -q '^default' && break sleep 1 done -# Installe en 4 étapes séparées (clone -> partition -> swap sur le disque -# cible -> vrai build) au lieu d'un seul `disko-install`. Raison : disko- -# install fait tout d'un coup dans le tmpfs RAM de l'environnement live, -# qui sature sur les PC à peu de RAM (4 Go) avant même de toucher le -# disque cible. Un swapfile posé sur /mnt (une fois partitionné) donne -# accès aux ~200 Go du disque comme mémoire virtuelle pendant la vraie -# construction — méthode documentée officiellement pour RAM limitée -# (wiki.nixos.org/wiki/Swap, manuel NixOS section installation). +# 4 étapes séparées (clone -> partition -> swap sur le disque cible -> +# build) plutôt qu'un seul `disko-install` : ce dernier construit tout +# dans le tmpfs RAM de l'environnement live, qui sature sur les PC à +# 4 Go avant même de toucher le disque cible. Le swapfile posé sur /mnt +# donne accès au disque comme mémoire virtuelle pendant le build. # -# Le clone local est nécessaire car la commande `disko` seule (contrairement -# à `disko-install`) n'a AUCUN mécanisme de substitution de disque nommé -# (`--disk`/diskMappings n'existe que dans install-cli.nix, utilisé -# uniquement par disko-install — vérifié dans le code source de -# nix-community/disko : fichiers disko, disko-install, cli.nix). On substitue -# donc le vrai disque directement dans une copie locale du fichier disko -# avec sed, puis on pointe `disko` ET `nixos-install` sur ce même clone -# (chemin local, pas l'URL distante) pour que le partitionnement et le -# système construit restent cohérents entre eux. +# Le clone local est nécessaire : `disko` seul (contrairement à +# `disko-install`) n'a aucun mécanisme de substitution de disque nommé. +# On substitue donc le vrai disque dans une copie locale du fichier +# disko (sed), puis `disko` et `nixos-install` pointent tous les deux +# sur ce même clone. do_install() { local remote_url="$1" # URL flake (git+https://...), pour cloner local attr="$2" @@ -58,21 +48,16 @@ do_install() { sed -i "s#/dev/placeholder#$DEVICE#" "$repo_dir/$disko_rel_path" echo "Partitionnement de $DEVICE..." - # --yes-wipe-all-disks : évite la confirmation interactive "type yes to - # continue" (vu dans le code source de la commande disko) — un install - # de flotte ne doit pas dépendre de quelqu'un présent au clavier pour - # confirmer, l'effacement est le but assumé de ce script. + # --yes-wipe-all-disks : évite la confirmation interactive, un install + # de flotte ne doit dépendre de personne au clavier. nix run --no-write-lock-file --refresh 'github:nix-community/disko' -- \ --mode destroy,format,mount \ --yes-wipe-all-disks \ "$repo_dir/$disko_rel_path" echo "Swap temporaire sur le disque cible (RAM limitée sur certains PC du parc)..." - # Sur btrfs (notre système de fichiers), le CoW doit être désactivé - # (chattr +C) AVANT toute écriture de données dans le fichier, sinon - # swapon échoue avec "Invalid argument" (source : btrfs.readthedocs.io/ - # en/latest/Swapfile.html — chattr +C sur un fichier déjà écrit ne - # s'applique pas rétroactivement). + # btrfs : chattr +C (NOCOW) doit précéder toute écriture dans le + # fichier, sinon swapon échoue avec "Invalid argument". truncate -s 0 /mnt/.install-swapfile chattr +C /mnt/.install-swapfile fallocate -l 4G /mnt/.install-swapfile @@ -81,49 +66,32 @@ do_install() { swapon /mnt/.install-swapfile echo "Construction et installation du système (peut prendre plusieurs minutes)..." - # --no-channel-copy, --no-root-passwd : confirmés dans le man nixos-install - # (mankier.com/8/nixos-install, miroir du manuel officiel). Le mot de - # passe root est de toute façon déjà déclaré (initialPassword) dans la - # config cible, --no-root-passwd évite juste tout risque de prompt - # interactif qui bloquerait un install non surveillé. --flake pointe sur - # le clone local (avec le disque déjà substitué), pas l'URL distante, - # pour rester cohérent avec ce qui a été partitionné. + # --no-root-passwd : le mot de passe root est déjà déclaré + # (initialPassword) côté cible, on évite juste un prompt interactif. + # --flake pointe sur le clone local (disque déjà substitué). nixos-install --root /mnt --flake "${repo_dir}#${attr}" --no-channel-copy --no-root-passwd swapoff /mnt/.install-swapfile rm -f /mnt/.install-swapfile - # Sans cette étape, la machine installée n'a AUCUNE config sur son - # disque : le clone ci-dessus vit dans /tmp de l'environnement live, en - # RAM, effacé au reboot. La convergence auto (system.autoUpgrade, voir - # hosts/common/base.nix) continue de fonctionner sans ça (elle pointe - # sur l'URL distante), mais un technicien qui arrive sur la machine - # après coup n'a alors ni /etc/nixos, ni moyen d'ajouter/enlever un - # paquet à la main. On installe donc le même clone (déjà substitué avec - # le vrai disque) à l'emplacement standard NixOS, en conservant .git - # pour que `git pull`/`git log` marchent dessus normalement ensuite. + # Persiste la config sur le disque cible : sans ça, le clone ne vit + # que dans /tmp du live (RAM), effacé au reboot -- plus rien à éditer + # ni à `git pull` ensuite. system.autoUpgrade continue de fonctionner + # sans ça (il pointe sur l'URL distante), mais un technicien n'a alors + # aucun accès local. echo "Installation de la configuration dans /mnt/etc/nixos..." rm -rf /mnt/etc/nixos mkdir -p /mnt/etc cp -a "$repo_dir" /mnt/etc/nixos - # Une machine installée n'a besoin que de ce qui sert à rebuild/pull : - # flake.nix/flake.lock, hosts/, modules/ et les fichiers de conf disko - # (diskos/). installer/ (le script d'install lui-même, obsolète une - # fois l'install faite) et pxe-server/ (la config d'un tout autre host, - # le serveur PXE) n'ont rien à faire sur un poste client -- ça ne - # concerne que nixos_fleet (nixos_users n'a ni l'un ni l'autre, ces rm - # ne trouvent alors rien à supprimer). Nix ne lit ces fichiers que si on - # build l'attribut correspondant (#installer-netboot, #pxe-server) -- - # jamais le cas ici (#usagers ou un profil nommé), donc rien ne casse. + # installer/ (script d'install, obsolète une fois fait) et + # pxe-server/ (config d'un autre host) ne servent à rien sur un poste + # client -- ne concerne que nixos_fleet, ces rm sont des no-op côté + # nixos_users. rm -rf /mnt/etc/nixos/installer /mnt/etc/nixos/pxe-server - # Le disque cible a été substitué localement (sed plus haut), et - # installer/+pxe-server/ viennent d'être retirés : tout ça diffère donc - # de ce qui est sur git. On le committe en local (jamais poussé) pour - # que `git status` reste propre sur la machine installée -- sinon - # chaque `git pull` ultérieur affiche des fichiers modifiés/supprimés, - # source de confusion pour un technicien. + # Committé en local (jamais poussé) pour que `git status` reste propre + # sur la machine installée. git -C /mnt/etc/nixos \ -c user.name="Installeur Nixos_Fleet" \ -c user.email="installeur@nixos-fleet.local" \ @@ -138,9 +106,8 @@ echo "2) Poste utilisateur nommé" read -rp "Choix [1/2] : " CHOICE # --- Détection automatique du disque cible ------------------------------- -# On exclut les disques amovibles (la clé USB de boot elle-même) et les -# loop/rom. S'il en reste plusieurs (rare), on prend le plus gros et on le -# signale clairement dans les logs plutôt que de bloquer sur un menu. +# Exclut les disques amovibles (la clé USB de boot) et les loop/rom. +# S'il en reste plusieurs, on prend le plus gros et on le signale. echo echo "Détection du disque cible..." mapfile -t CANDIDATES < <( @@ -164,14 +131,12 @@ fi case "$CHOICE" in 1) - # --- Branche flotte : rien d'autre à saisir ----------------------- echo echo "Installation du profil générique 'usagers' sur $DEVICE..." do_install "$FLEET_REPO" "usagers" "diskos/plain.nix" ;; 2) - # --- Branche utilisateur nommé ------------------------------------- read -rp "Utilisateur (thomas/clara/jade/oreo) : " USER_PROFILE USER_PROFILE=$(echo "$USER_PROFILE" | tr '[:upper:]' '[:lower:]' | xargs) case "$USER_PROFILE" in @@ -191,8 +156,8 @@ case "$CHOICE" in read -rsp "Token Gitea (repo privé Nixos_Users) : " TOKEN echo - # Le token n'est utilisé qu'en mémoire/ligne de commande pour ce fetch - # ponctuel : il n'est jamais écrit dans un fichier suivi par git. + # Utilisé seulement en mémoire/ligne de commande pour ce fetch + # ponctuel, jamais écrit dans un fichier suivi par git. AUTHED_URL="git+https://${TOKEN}@${USERS_REPO_HOST}/${USERS_REPO_PATH}" echo @@ -204,13 +169,13 @@ case "$CHOICE" in fi do_install "$AUTHED_URL" "$ATTR" "$DISKO_REL_PATH" - # Le système installé doit pouvoir continuer à tirer ses mises à jour - # du repo privé tout seul : on lui laisse un netrc, jamais commité, - # jamais dans le Nix store (nix.settings.netrc-file dans le repo - # nixos_users pointe vers ce même chemin). + # Netrc laissé pour que le système installé continue de tirer ses + # mises à jour du repo privé tout seul (nix.settings.netrc-file + # pointe vers ce même chemin côté nixos_users). Jamais commité, + # jamais dans le Nix store. # # ATTENTION : le format exact attendu par Gitea (login=token vs - # login+password séparés) dépend de la version/config du serveur — + # login+password séparés) dépend de la version/config du serveur -- # à vérifier sur l'instance réelle avant le déploiement pilote. mkdir -p /mnt/etc/nix { diff --git a/installer/installer-base.nix b/installer/installer-base.nix index 21e7523..6e1f980 100644 --- a/installer/installer-base.nix +++ b/installer/installer-base.nix @@ -1,7 +1,7 @@ # Environnement live commun aux deux formes d'image (PXE netboot / ISO -# USB). Contient juste de quoi partitionner et lancer disko-install ; la -# vraie configuration cible est toujours récupérée depuis git au moment -# de l'install (repo public nixos_fleet ou repo privé nixos_users). +# USB). Contient juste de quoi partitionner et installer ; la config +# cible est toujours récupérée depuis git au moment de l'install (repo +# public nixos_fleet ou repo privé nixos_users). { pkgs, lib, ... }: let @@ -13,22 +13,13 @@ in "flakes" ]; - # netboot.nix définit DEUX tmpfs distincts, ni l'un ni l'autre avec une - # taille explicite -> plafonnés à 50% de la RAM chacun par défaut : - # - "/" : la racine du système live lui-même (petite) - # - "/nix/.rw-store" : la vraie zone où atterrissent tous les nouveaux - # paquets téléchargés/construits pendant l'install - # (overlay au-dessus du squashfs .ro-store en - # lecture seule). C'est CELLE-LÀ qui sature en - # premier sur un système complet (Cinnamon + - # Firefox + LibreOffice + VLC...), pas "/". - # - # netboot.nix définit ces deux options via mkImageMediaOverride, qui vaut - # mkOverride 60 — une simple assignation ici (priorité 100 par défaut) - # est donc entièrement ignorée, pas fusionnée (constaté : le premier - # essai n'a eu aucun effet). Il faut lib.mkForce (priorité 50, plus - # fort que 60) pour vraiment gagner — et comme mkForce REMPLACE toute la - # liste plutôt que de la compléter, on remet mode=0755 dedans aussi. + # netboot.nix définit "/" et "/nix/.rw-store" (overlay où atterrissent + # les paquets téléchargés/construits pendant l'install) sans taille + # explicite -> 50% de la RAM chacun par défaut. .rw-store sature en + # premier sur un système complet (Cinnamon + Firefox + LibreOffice + + # VLC), pas "/". mkForce nécessaire : netboot.nix utilise + # mkImageMediaOverride (priorité 60), une assignation simple (100) est + # ignorée ; mkForce remplace toute la liste, d'où mode=0755 remis ici. fileSystems."/".options = lib.mkForce [ "mode=0755" "size=20%" @@ -38,11 +29,9 @@ in "size=90%" ]; - # Certains PC du parc n'ont que 4 Go de RAM. Le disque cible ne peut pas - # servir de secours (disko-install l'efface entièrement en une seule - # opération, un swap posé dessus avant serait détruit en cours de - # route) : on utilise du swap compressé en RAM (zram) à la place, qui - # marche pareil en PXE et en USB sans dépendre d'un périphérique externe. + # Certains PC du parc n'ont que 4 Go de RAM. Le disque cible ne peut + # pas servir de secours ici (pas encore partitionné à ce stade) : swap + # compressé en RAM (zram), identique en PXE et en USB. zramSwap = { enable = true; memoryPercent = 100; # jusqu'à 1x la RAM en swap compressé (~2-3x effectif) @@ -57,22 +46,14 @@ in installScript ]; - # disko-install n'est pas préinstallé : install.sh l'invoque via - # `nix run github:nix-community/disko#disko-install`, ce qui évite de - # dépendre d'un nom de paquet nixpkgs précis (pas de package `disko` - # garanti tel quel côté nixpkgs) et reste conforme à l'usage documenté - # du projet. - networking.networkmanager.enable = true; services.xserver.xkb.layout = "fr"; console.keyMap = "fr"; # Root autologin sur tty1, l'installeur se lance automatiquement au - # login. S'il échoue ou qu'on le quitte, on retombe sur un shell root - # normal pour dépanner à la main — pas de piège sans issue. + # login. Échec ou sortie -> shell root normal pour dépanner. # mkForce : le profil installeur officiel (installation-device.nix) - # définit aussi cette option (autologin "nixos"), même priorité que la - # nôtre sans mkForce -> conflit sinon. + # définit aussi cette option, même priorité -> conflit sinon. services.getty.autologinUser = lib.mkForce "root"; users.users.root.password = lib.mkForce ""; diff --git a/modules/anssi/README.md b/modules/anssi/README.md index 79e685f..3319a07 100644 --- a/modules/anssi/README.md +++ b/modules/anssi/README.md @@ -9,7 +9,6 @@ SPDX-License-Identifier: MIT This is a self-contained NixOS implementation of . It can be copy-pasted outside of Sécurix for your own needs. -> Vendored verbatim depuis [SécurixOS](https://github.com/cloud-gouv/securix) -> (`modules/anssi/`, alpha) le 2026-09-09, tel que suggéré par ce README -> ("can be copy-pasted outside of Sécurix"). Ne pas éditer ces fichiers -> directement : en cas de correctif, le reprendre depuis Sécurix. +> Vendored depuis [SécurixOS](https://github.com/cloud-gouv/securix) +> (`modules/anssi/`, alpha), 2026-09-09. Ne pas éditer directement -- +> reprendre depuis Sécurix en cas de correctif.