Modules système
⚙ darkone.system.core
Section intitulée « ⚙ darkone.system.core »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
boolFondation Darkone du système (activée par défaut) - enableSystemdBoot
boolActiver le chargeur de démarrage par défaut - enableLatestKernel
boolUtiliser le dernier noyau mainline (linuxPackages_latest) au lieu du LTS - enableFstrim
boolOptimisation SSD avec fstrim - enableFirewall
boolActiver le pare-feu (true par défaut) - enableSops
boolActiver le module sops DNF (true par défaut) - enableFlatpak
boolActiver la configuration DNF Flatpak (environnements graphiques uniquement) - enableKmscon
boolActiver la nerd font pour le TTY - gcKeepGenerations
intQuand > 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
boolActiver l’overclocking, corectl - enableAutoSuspend
boolActiver la suspension automatique (pour les laptops, ignoré si disableSuspend est true) - disableSuspend
boolDésactivation complète de la suspension (pour les serveurs) - enableCommonFilesUser
boolActiver 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;};⚙ darkone.system.documentation
Section intitulée « ⚙ darkone.system.documentation »Documentation (man) pour les développeurs et les administrateurs.
- enable
boolActiver la documentation technique utile (man, nixos)
darkone.system.documentation.enable = false;⚙ darkone.system.hardware
Section intitulée « ⚙ darkone.system.hardware »Améliorations de la configuration matérielle.
- enable
boolActiver les optimisations matérielles - enableIntel
boolActiver les mises à jour du microcode Intel - enableAmd
boolActiver les mises à jour du microcode AMD
darkone.system.hardware = { enable = false; enableIntel = false; enableAmd = false;};⚙ darkone.system.i18n
Section intitulée « ⚙ darkone.system.i18n »Configuration de la localisation et de la langue.
- enable
boolActiver i18n avec la configuration de la zone de réseau par défaut - locale
strMatching localeRegexLocale réseau, doit correspondre à la formexx_YY.UTF-8. - timeZone
strFuseau horaire réseau
darkone.system.i18n = { enable = false; locale = "fr_FR.UTF-8"; timeZone = "Europe/Paris";};⚙ darkone.system.security
Section intitulée « ⚙ darkone.system.security »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
boolActive 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 strTags qui désactivent des groupes entiers de règles. - exceptions
attrsExceptions par règle avec justification obligatoire. - adminMailbox
strAdresse e-mail de l’administrateur (sudo R39, alias MTA R75). - useHardenedKernel
boolUtilise linuxPackages_hardened (R60, C1) au lieu du noyau par défaut. - allowedActiveUsers
listOf strComptes 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’infrastructurenix. 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 = [ ];};⚙ darkone.system.services
Section intitulée « ⚙ darkone.system.services »Enregistrement et configuration des services DNF.
- enable
boolActiver le gestionnaire de services DNF pour enregistrer et exposer les services - service
attrsConfiguration globale des services <nom>- enable
boolActiver le proxy de service - defaultParams
submoduleCes options sont calculées par dnfLib.srv.extractServiceParams- domain
strNom de domaine pour le service - title
strNom affiché sur la page d’accueil - description
strDescription du service pour la page d’accueil - icon
strNom de l’icône pour la page d’accueil 🡕 - global
boolService global accessible sur Internet - noRobots
boolEmpêcher les robots de scanner si global est vrai - fqdn
strFQDN calculé du service avant le proxy inverse - href
strURL calculée du service avant le proxy inverse - ip
strIP calculée pour contacter le service
- domain
- displayOnHomepage
boolAfficher un lien sur la page d’accueil - reverseProxy
boolAccessible via le proxy inverse de la passerelle de zone (DNS pointe vers l’IP LAN de la passerelle) - uniquePerZone
boolAu plus une instance autorisée par zone (validation du générateur) - externalAccess
boolService de zone www accessible depuis le LAN via une IP hôte fixe (p. ex. headscale, turn) - persist.dirs
listOf strRépertoires persistants du service - persist.files
listOf strFichiers persistants du service - persist.dbDirs
listOf strRépertoires persistants du service avec base(s) de données - persist.dbFiles
listOf strFichier(s) de base de données du service - persist.varDirs
listOf strFichiers secondaires variables (log, cache, etc.) - persist.mediaDirs
listOf strRépertoires média du service (images, vidéos, gros fichiers) - proxy.enable
boolCréer une configuration virtualHost (false pour les services qui gèrent la leur) - proxy.isProtected
boolService protégé par Oauth2 - proxy.allowedGroups
listOf strGroupes Kanidm autorisés sur ce service protégé (vide = tout utilisateur authentifié) - proxy.isInternal
boolLier le service sur l’interface interne uniquement (pas accessible depuis Internet) - proxy.hasReverseProxy
boolCeci est un proxy inverse (ou une autre configuration virtualHost via extraConfig) - proxy.defaultService
boolEst le service par défaut - proxy.servicePort
nullOr portPort interne du service - proxy.preExtraConfig
linesConfiguration virtualHost caddy supplémentaire (préfixe) - proxy.extraConfig
linesConfiguration virtualHost caddy supplémentaire - proxy.extraGlobalConfig
linesConfiguration caddy supplémentaire - proxy.scheme
strSchéma interne du service (http / https)
- enable
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";};⚙ darkone.system.sops
Section intitulée « ⚙ darkone.system.sops »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
boolActiver la configuration automatique sops pour DNF
darkone.system.sops.enable = false;⚙ darkone.system.srv-dirs
Section intitulée « ⚙ darkone.system.srv-dirs »Service de gestion des répertoires partagés.
- enable
boolActiver les répertoires srv, créer le répertoire racine (par défaut /srv) - enableNfs
boolActiver les chemins de service nfs (nfs/common, nfs/homes) - enableMedias
boolActiver les chemins des services médias (medias/[videos|music|incomming/…]) - root
strRépertoire racine pour les données persistantes (/srv) - nfs
strRépertoire racine NFS (/srv/nfs) - homes
strRépertoire pour les domiciles partagés (/srv/nfs/homes) - common
strRépertoire commun partagé (/srv/nfs/common lié à ~/Public) - medias
strRépertoire racine des médias (/srv/medias) - music
strRépertoire partagé des fichiers musicaux (/srv/medias/music) - videos
strRépertoire partagé des fichiers vidéo (/srv/medias/videos) - incoming
strRépertoire partagé entrant (/srv/medias/incoming accès écriture) - incomingMusic
strRépertoire partagé entrant (/srv/medias/incoming/music accès écriture) - incomingVideos
strRé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;};⚙ darkone.system.testing
Section intitulée « ⚙ darkone.system.testing »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
boolMode test autonome — ignore la configuration propre à workDir (nix.pub, harmonia.pub) et neutralise les services externes - tlsCert
nullOr pathCertificat auto-signé (PEM) fourni par le harnais de test pour simuler ACME. Jamais un chemin tests/ intégré dans le framework. - tlsKey
nullOr pathClé privée (PEM) associée à tlsCert.
darkone.system.testing = { standalone = false; tlsCert = null; tlsKey = null;};⚙ darkone.system.yubikey
Section intitulée « ⚙ darkone.system.yubikey »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.jsondans 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 laluks-passphrasepartagé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 parsystemd-cryptenroll) et élimine les révoquées. La clé physique n’est nécessaire qu’au démarrage pour déverrouiller le disque.
- enable
boolAuthentification YubiKey (défaut : activé quand usr/secrets/yubikeys.json existe) - origin
strOrigine/appid pam_u2f fixe : un seul enrôlement est valable dans tout le parc - luks.enable
boolDé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;};