Aller au contenu

Modules système

Le module central de DNF.

Configure le chargeur systemd-boot, le noyau LTS (ou le dernier mainline via enableLatestKernel), JetBrains Mono Nerd Font (avec kmscon pour le TTY), l’optimisation nocturne du store Nix et le garbage collection hebdomadaire (rétention 30 j, ou keep-last-N via gcKeepGenerations sur les hôtes à espace disque limité), le pare-feu, la politique de suspension (les serveurs peuvent la désactiver complètement via disableSuspend), les règles polkit permettant à wheel d’éteindre/redémarrer, et un groupe/utilisateur common-files partagé pour les dossiers média inter-services.

  • enable bool Fondation Darkone du système (activée par défaut)
  • enableSystemdBoot bool Activer le chargeur de démarrage par défaut
  • enableLatestKernel bool Utiliser le dernier noyau mainline (linuxPackages_latest) au lieu du LTS
  • enableFstrim bool Optimisation SSD avec fstrim
  • enableFirewall bool Activer le pare-feu (true par défaut)
  • enableSops bool Activer le module sops DNF (true par défaut)
  • enableFlatpak bool Activer la configuration DNF Flatpak (environnements graphiques uniquement)
  • enableKmscon bool Activer la nerd font pour le TTY
  • gcKeepGenerations int Quand > 0, réduire le profil système aux N dernières générations avant chaque garbage collection, et collecter quotidiennement sans rétention par âge. Pour les hôtes avec une partition racine restreinte (passerelles).
  • enableBoost bool Activer l’overclocking, corectl
  • enableAutoSuspend bool Activer la suspension automatique (pour les laptops, ignoré si disableSuspend est true)
  • disableSuspend bool Désactivation complète de la suspension (pour les serveurs)
  • enableCommonFilesUser bool Activer l’utilisateur common-files utilisé par plusieurs services
darkone.system.core = {
enable = true;
enableSystemdBoot = true;
enableLatestKernel = false;
enableFstrim = true;
enableFirewall = true;
enableSops = true;
enableFlatpak = true;
enableKmscon = true;
gcKeepGenerations = 5;
enableBoost = false;
enableAutoSuspend = false;
disableSuspend = false;
enableCommonFilesUser = false;
};

Documentation (man) pour les développeurs et les administrateurs.

  • enable bool Activer la documentation technique utile (man, nixos)
darkone.system.documentation.enable = false;

Améliorations de la configuration matérielle.

  • enable bool Activer les optimisations matérielles
  • enableIntel bool Activer les mises à jour du microcode Intel
  • enableAmd bool Activer les mises à jour du microcode AMD
darkone.system.hardware = {
enable = false;
enableIntel = false;
enableAmd = false;
};

Configuration de la localisation et de la langue.

  • enable bool Activer i18n avec la configuration de la zone de réseau par défaut
  • locale strMatching localeRegex Locale réseau, doit correspondre à la forme xx_YY.UTF-8.
  • timeZone str Fuseau horaire réseau
darkone.system.i18n = {
enable = false;
locale = "fr_FR.UTF-8";
timeZone = "Europe/Paris";
};

Durcissement système ANSSI BP-028 v2.0 (GNU/Linux). (wip)

Module recommandé, activé dans certains profils hôtes ou manuellement selon les besoins. Applique progressivement les recommandations ANSSI selon le niveau choisi et la catégorie de machine. Chaque profil hôte définit son niveau et sa catégorie :

darkone.system.security = {
level = "intermediary"; # minimal | intermediary | reinforced | high
category = "server"; # base | client | server
};

Les règles incompatibles avec l’environnement sont exclues par tag :

darkone.system.security.excludes = [ "needs-jit" "needs-hibernation" ];

Une règle spécifique peut être contournée avec une justification obligatoire :

darkone.system.security.exceptions = {
R9.rationale = "Docker rootless required during development.";
};
  • enable bool Active le module de durcissement ANSSI BP-028 v2.0.
  • level enum [ "minimal" "intermediary" "reinforced" "high" ] Niveau de durcissement ANSSI ciblé.
  • category enum [ "base" "client" "server" ] Catégorie de machine qui sélectionne les sous-ensembles de règles.
  • excludes listOf str Tags qui désactivent des groupes entiers de règles.
  • exceptions attrs Exceptions par règle avec justification obligatoire.
  • adminMailbox str Adresse e-mail de l’administrateur (sudo R39, alias MTA R75).
  • useHardenedKernel bool Utilise linuxPackages_hardened (R60, C1) au lieu du noyau par défaut.
  • allowedActiveUsers listOf str Comptes humains autorisés à s’authentifier (R30). Par défaut, chaque utilisateur déclaré dans config.yaml (host.users) plus le compte de déploiement de l’infrastructure nix. Les comptes désactivés (sans identifiant de mot de passe) et les comptes de service (pas des utilisateurs normaux) n’ont pas besoin d’être listés.
darkone.system.security = {
enable = false;
level = "minimal";
category = "base";
excludes = [ ];
exceptions = { };
adminMailbox = "admin@exemple.fr";
useHardenedKernel = false;
allowedActiveUsers = [ ];
};

Enregistrement et configuration des services DNF.

  • enable bool Activer le gestionnaire de services DNF pour enregistrer et exposer les services
  • service attrs Configuration globale des services <nom>
    • enable bool Activer le proxy de service
    • defaultParams submodule Ces options sont calculées par dnfLib.srv.extractServiceParams
      • domain str Nom de domaine pour le service
      • title str Nom affiché sur la page d’accueil
      • description str Description du service pour la page d’accueil
      • icon str Nom de l’icône pour la page d’accueil 🡕
      • global bool Service global accessible sur Internet
      • noRobots bool Empêcher les robots de scanner si global est vrai
      • fqdn str FQDN calculé du service avant le proxy inverse
      • href str URL calculée du service avant le proxy inverse
      • ip str IP calculée pour contacter le service
    • displayOnHomepage bool Afficher un lien sur la page d’accueil
    • reverseProxy bool Accessible via le proxy inverse de la passerelle de zone (DNS pointe vers l’IP LAN de la passerelle)
    • uniquePerZone bool Au plus une instance autorisée par zone (validation du générateur)
    • externalAccess bool Service de zone www accessible depuis le LAN via une IP hôte fixe (p. ex. headscale, turn)
    • persist.dirs listOf str Répertoires persistants du service
    • persist.files listOf str Fichiers persistants du service
    • persist.dbDirs listOf str Répertoires persistants du service avec base(s) de données
    • persist.dbFiles listOf str Fichier(s) de base de données du service
    • persist.varDirs listOf str Fichiers secondaires variables (log, cache, etc.)
    • persist.mediaDirs listOf str Répertoires média du service (images, vidéos, gros fichiers)
    • proxy.enable bool Créer une configuration virtualHost (false pour les services qui gèrent la leur)
    • proxy.isProtected bool Service protégé par Oauth2
    • proxy.allowedGroups listOf str Groupes Kanidm autorisés sur ce service protégé (vide = tout utilisateur authentifié)
    • proxy.isInternal bool Lier le service sur l’interface interne uniquement (pas accessible depuis Internet)
    • proxy.hasReverseProxy bool Ceci est un proxy inverse (ou une autre configuration virtualHost via extraConfig)
    • proxy.defaultService bool Est le service par défaut
    • proxy.servicePort nullOr port Port interne du service
    • proxy.preExtraConfig lines Configuration virtualHost caddy supplémentaire (préfixe)
    • proxy.extraConfig lines Configuration virtualHost caddy supplémentaire
    • proxy.extraGlobalConfig lines Configuration caddy supplémentaire
    • proxy.scheme str Schéma interne du service (http / https)
darkone.system.services = {
enable = false;
service.enable = false;
service.defaultParams.domain = "";
service.defaultParams.title = "";
service.defaultParams.description = "";
service.defaultParams.icon = "";
service.defaultParams.global = false;
service.defaultParams.noRobots = true;
service.defaultParams.fqdn = "";
service.defaultParams.href = "";
service.defaultParams.ip = "";
service.displayOnHomepage = true;
service.reverseProxy = true;
service.uniquePerZone = false;
service.externalAccess = false;
service.persist.dirs = [ ];
service.persist.files = [ ];
service.persist.dbDirs = [ ];
service.persist.dbFiles = [ ];
service.persist.varDirs = [ ];
service.persist.mediaDirs = [ ];
service.proxy.enable = true;
service.proxy.isProtected = false;
service.proxy.allowedGroups = [ ];
service.proxy.isInternal = false;
service.proxy.hasReverseProxy = true;
service.proxy.defaultService = false;
service.proxy.servicePort = null;
service.proxy.preExtraConfig = "";
service.proxy.extraConfig = "";
service.proxy.extraGlobalConfig = "";
service.proxy.scheme = "https";
};

Gestion des mots de passe et secrets DNF sops.

Connecte sops-nix à usr/secrets/secrets.yaml et le déverrouille avec la clé SSH de l’hôte (ssh_host_ed25519_key) plus la clé d’infrastructure dédiée age (/etc/sops/age/infra.key). Pré-déclare un groupe sops partagé, les secrets default-password / default-password-hash (lisible par le groupe sops), et un secret user/<login>/password-hash par utilisateur d’hôte (avec neededForUsers = true pour que le hash soit disponible avant la création des comptes utilisateur).

  • enable bool Activer la configuration automatique sops pour DNF
darkone.system.sops.enable = false;

Service de gestion des répertoires partagés.

  • enable bool Activer les répertoires srv, créer le répertoire racine (par défaut /srv)
  • enableNfs bool Activer les chemins de service nfs (nfs/common, nfs/homes)
  • enableMedias bool Activer les chemins des services médias (medias/[videos|music|incomming/…])
  • root str Répertoire racine pour les données persistantes (/srv)
  • nfs str Répertoire racine NFS (/srv/nfs)
  • homes str Répertoire pour les domiciles partagés (/srv/nfs/homes)
  • common str Répertoire commun partagé (/srv/nfs/common lié à ~/Public)
  • medias str Répertoire racine des médias (/srv/medias)
  • music str Répertoire partagé des fichiers musicaux (/srv/medias/music)
  • videos str Répertoire partagé des fichiers vidéo (/srv/medias/videos)
  • incoming str Répertoire partagé entrant (/srv/medias/incoming accès écriture)
  • incomingMusic str Répertoire partagé entrant (/srv/medias/incoming/music accès écriture)
  • incomingVideos str Répertoire partagé entrant (/srv/medias/incoming/videos accès écriture)
darkone.system.srv-dirs = {
enable = cfg.enableNfs || cfg.enableMedias;
enableNfs = false;
enableMedias = false;
root = "/srv";
nfs = null;
homes = null;
common = null;
medias = null;
music = null;
videos = null;
incoming = null;
incomingMusic = null;
incomingVideos = null;
};

Mode test autonome pour le NixOS Test Driver.

Quand activé, neutralise les parties irréductiblement externes/exécution afin qu’un nœud puisse être testé dans une VM : headscale/tailscale deviennent des no-op et un certificat TLS fixe peut simuler ACME. Permet également à la configuration propre à workDir (nix.pub, harmonia.pub) d’être ignorée par core/nix-cache. sops reste RÉEL (haute fidélité).

  • standalone bool Mode test autonome — ignore la configuration propre à workDir (nix.pub, harmonia.pub) et neutralise les services externes
  • tlsCert nullOr path Certificat auto-signé (PEM) fourni par le harnais de test pour simuler ACME. Jamais un chemin tests/ intégré dans le framework.
  • tlsKey nullOr path Clé privée (PEM) associée à tlsCert.
darkone.system.testing = {
standalone = false;
tlsCert = null;
tlsKey = null;
};

Authentification forte YubiKey : PAM U2F à l’échelle du parc + LUKS FIDO2 déclaratif.

Un enrôlement physique par (utilisateur, clé) sur l’hôte admin : just yubikey <user> [key] [action] alimente :

  • un registre public usr/secrets/yubikeys.json dans le workspace consommateur : identifiant pamu2fcfg, id et salt du credential hmac-secret FIDO2 (inutiles sans la clé physique, donc commitables) ;
  • un secret sops yubikey/<user>/<key>/luks-secret (la passphrase LUKS dérivée de FIDO2) plus la luks-passphrase partagée (la passphrase saisie lors de l’installation disko, nécessaire pour autoriser de nouveaux keyslots).

Le module propage ensuite le tout déclarativement (just apply), sans jamais brancher la clé sur les hôtes cibles :

  • login / sudo / greeter : pam_u2f comme alternative au mot de passe (sufficient) : toucher la clé connecte, le mot de passe sops reste le repli automatique. Un seul credential est valable dans tout le parc grâce à l’origine fixe (pam://<network.domain>).
  • hôtes chiffrés : un service oneshot auto-enrôle chaque clé déclarée dans chaque en-tête LUKS2 déclaré par disko (keyslot + jeton systemd-fido2, le format exact écrit par systemd-cryptenroll) et élimine les révoquées. La clé physique n’est nécessaire qu’au démarrage pour déverrouiller le disque.
  • enable bool Authentification YubiKey (défaut : activé quand usr/secrets/yubikeys.json existe)
  • origin str Origine/appid pam_u2f fixe : un seul enrôlement est valable dans tout le parc
  • luks.enable bool Déverrouillage FIDO2 des volumes LUKS de l’hôte (inerte sans disko LUKS + clés enrôlées)
darkone.system.yubikey = {
enable = hasRegistry;
origin = "pam://${network.domain}";
luks.enable = true;
};