# Socle commun à toutes les machines de la flotte (repo public). { pkgs, lib, ... }: { 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. 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. 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). # # 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. 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)."; }; # 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. boot.kernelParams = [ "l1tf=full,force" "page_poison=on" "pti=on" "slab_nomerge=yes" "slub_debug=FZP" "spec_store_bypass_disable=seccomp" "spectre_v2=on" "mds=full" # sans ",nosmt" : hyperthreading conservé "mce=0" "page_alloc.shuffle=1" "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. systemd.coredump.enable = false; security.apparmor.packages = [ pkgs.apparmor-profiles ]; security.apparmor.enableCache = true; time.timeZone = "Europe/Paris"; i18n.defaultLocale = "fr_FR.UTF-8"; i18n.extraLocaleSettings = { LC_ADDRESS = "fr_FR.UTF-8"; LC_IDENTIFICATION = "fr_FR.UTF-8"; LC_MEASUREMENT = "fr_FR.UTF-8"; LC_MONETARY = "fr_FR.UTF-8"; LC_NAME = "fr_FR.UTF-8"; LC_NUMERIC = "fr_FR.UTF-8"; LC_PAPER = "fr_FR.UTF-8"; LC_TELEPHONE = "fr_FR.UTF-8"; LC_TIME = "fr_FR.UTF-8"; }; services.xserver.xkb = { layout = "fr"; variant = ""; }; boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; boot.loader.systemd-boot.configurationLimit = 10; 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. zramSwap = { enable = true; memoryPercent = 50; }; nix.settings.experimental-features = [ "nix-command" "flakes" ]; nixpkgs.config.allowUnfree = true; nix.gc = { automatic = true; dates = "weekly"; 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. system.autoUpgrade = { enable = true; dates = "daily"; flake = "git+https://gitea.miniclic.net/Damien/Nixos_Fleet.git#usagers"; }; environment.systemPackages = with pkgs; [ git curl wget htop nixfmt ]; system.stateVersion = "26.05"; }